我正在尝试在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);
}
答案 0 :(得分:1)
servlet规范部分13.10说:
容器在之前建立请求的呼叫者身份 将请求分派给servlet引擎。来电者身份 在整个请求处理过程中保持不变或直到 应用程序成功调用了身份验证,登录或注销 请求。
这就是为什么没有setUserPrincipal
。
但有好消息。您可以提供自己的getUserPrincipal
,因为您可以提供自己的HttpServletRequest
对象。任何servlet过滤器都可以做到。查看您的代码,您使用两个参数调用链式方法:请求和响应。无需传递您收到的相同对象。
规范甚至为您提供了一个帮助类:HttpServletRequestWrapper
。您只需创建自己的请求类作为包装器的子类,并覆盖您想要的任何方法,例如getUserPrincipal
。