2017-02-14 29 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

Servlet規範部分13.10說:

容器之前 建立請求方身份調度請求到servlet引擎。呼叫者身份 在整個請求處理過程中保持不變,或者直到 應用程序成功請求對請求進行身份驗證,登錄或註銷。

這就是爲什麼沒有setUserPrincipal的原因。

但有好消息。您可以提供自己的getUserPrincipal,因爲您可以提供自己的HttpServletRequest對象。任何servlet過濾器都可以做到。看看你的代碼,你用兩個參數調用鏈式方法:請求和響應。沒有必要傳遞您收到的相同對象。

該規範甚至爲您提供了一個輔助類:HttpServletRequestWrapper。您只需創建自己的請求類作爲包裝的子類並覆蓋任何您想要的方法,如getUserPrincipal