在Guice过滤器中创建主体

时间:2017-02-14 14:05:54

标签: authentication servlets guice

我正在尝试在Guice中实现自定义身份验证过滤器。我收到令牌,从令牌中获取用户名和域,然后创建一个Principal。现在我卡住了,我不知道如何设置校长。如果我能像request.setUserPrincipal(principal);那样设置它会很好,但显然我不能。

我该怎么做?

我的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 个答案:

答案 0 :(得分:1)

servlet规范部分13.10说:

  

容器在之前建立请求的呼叫者身份   将请求分派给servlet引擎。来电者身份   在整个请求处理过程中保持不变或直到   应用程序成功调用了身份验证,登录或注销   请求。

这就是为什么没有setUserPrincipal

的原因

但有好消息。您可以提供自己的getUserPrincipal,因为您可以提供自己的HttpServletRequest对象。任何servlet过滤器都可以做到。查看您的代码,您使用两个参数调用链式方法:请求和响应。无需传递您收到的相同对象。

规范甚至为您提供了一个帮助类:HttpServletRequestWrapper。您只需创建自己的请求类作为包装器的子类,并覆盖您想要的任何方法,例如getUserPrincipal