2017-02-14 1 views
2

Guiceでカスタム認証フィルタを実装しようとしています。トークンを受け取り、トークンからユーザー名と領域を取得し、プリンシパルを作成します。今私は立ち往生しており、プリンシパルの設定方法はわかりません。もし私がちょうどこれをこのように設定することができればいいのですがrequest.setUserPrincipal(principal);、しかし明らかに私はできません。Guiceフィルタでプリンシパルを作成

どうすればいいですか?

マイdoFilterメソッドは次のようになります。

@Override 
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { 

    HttpServletRequest request = (HttpServletRequest) servletRequest; 
    String authorizationHeader = request.getHeader(HttpHeaders.AUTHORIZATION); 

    if (authorizationHeader != null && authorizationHeader.length() > 0) { 
     String token = authorizationHeader.substring("Bearer".length()).trim(); 
     if (token.length() > 0) { 
      try { 
       Credentials credentials = securityService.getCredentials(token); 
       String username = credentials.getUsername(); 
       String realm = credentials.getRealm(); 
       Principal principal = new HttpPrincipal(username, realm); 
       // request.setUserPrincipal(principal); 
       LOGGER.info(credentials); 
      } catch (Exception e) { 
       LOGGER.error(e); 
      } 
     } 
    } 

    filterChain.doFilter(servletRequest, servletResponse); 
} 

答えて

1

サーブレット仕様のセクション13.10は言う:

コンテナは、サーブレットエンジンにリクエストをディスパッチ前 に要求の発信者IDを確立します。呼び出し元ID は、要求の処理中、または のアプリケーションが、 リクエストで認証、ログイン、またはログアウトを正常に呼び出すまで変更されません。

これは、setUserPrincipalが存在しない理由です。

しかし、良いニュースがあります。独自のHttpServletRequestオブジェクトを提供できるので、独自のgetUserPrincipalを提供できます。どんなサーブレットフィルタでもそれを行うことができます。あなたのコードを見て、あなたは2つのパラメータ、すなわちリクエストとレスポンスを使ってチェーンメソッドを呼び出しています。受け取ったのと同じオブジェクトを渡す必要はありません。

この仕様では、ヘルパークラスも提供しています:HttpServletRequestWrapper。ラッパーのサブクラスとして独自のリクエストクラスを作成し、任意のメソッド(たとえば、getUserPrincipal)をオーバーライドするだけです。

関連する問題