在我的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
会再次正确加载。 (当然没有路径匹配)
为什么?
答案 0 :(得分:0)
您可以像这样要求Authentication
或Principal
:
@RequestMapping(value = "/session", method = GET)
public AuthenticatedUserDto getCurrentSession(Authentication auth) {
if (auth == null || !auth.isAuthenticated())
throw new BadCredentialsException("unkown session");
return AuthenticatedUserBuilder.build(auth);
}