SecurityContext未在安全链过滤器中设置

时间:2017-11-28 13:50:08

标签: java spring security session cookies

在我的spring项目中,我想创建一个端点,返回客户端活动会话cookie的安全上下文用户详细信息。

一种方法是控制器中的特定方法实现

@RequestMapping(value = "/session", method = GET)
public AuthenticatedUserDto getCurrentSession(HttpServletResponse response) {
    if (SecurityContextHolder.getContext().getAuthentication().getPrincipal() != null && SecurityContextHolder.getContext().getAuthentication().getPrincipal() instanceof User) {
        return AuthenticatedUserBuilder.build(SecurityContextHolder.getContext().getAuthentication());
    }
    throw new BadCredentialsException("unkown session");
}

这种方法几乎没有让我烦恼的事情:

  • 我需要一个丑陋的if来确定它是否不是匿名身份验证

  • 我在上下文中处理这个问题,因为我已经在会话cookie得到解决后尽快获得所有信息。

所以我的另一种方法是使用安全链过滤器来匹配特定的URL(" / session),并在那里处理任务。

public class SessionObjectResponder extends GenericFilterBean {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        ...//do create my response
        ..
    }
}

AnonymousAuthenticationFilter之前添加过滤器,应该保证我可以使用与会话cookie匹配的安全上下文。所以我像这样配置了我的网络安全:

httpSecurity.antMatcher("/session").addFilterBefore(new SessionObjectResponder(),AnonymousAuthenticationFilter.class);

奇怪的是,即使传递了有效的会话cookie,SecurityContextHolder也包含空身份验证。 我也可以看到SecurityContextPersistenceFilter内没有设置安全上下文。

当我删除此过滤器的httpSecurity配置并将@Component添加到过滤器类时,SecurityContext会再次正确加载。 (当然没有路径匹配)

为什么?

1 个答案:

答案 0 :(得分:0)

您可以像这样要求AuthenticationPrincipal

@RequestMapping(value = "/session", method = GET)
public AuthenticatedUserDto getCurrentSession(Authentication auth) {
    if (auth == null || !auth.isAuthenticated())
        throw new BadCredentialsException("unkown session");
    return AuthenticatedUserBuilder.build(auth);
}