我在注册后使用以下方法进行程序化登录
private void autoLogin(User user, HttpServletRequest request) { GrantedAuthority[] grantedAuthorities = new GrantedAuthority[] { new GrantedAuthorityImpl( "ROLE_ADMIN") }; UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken( user.getUsername(), user.getPassword(),grantedAuthorities); // generate session if one doesn't exist request.getSession(); token.setDetails(new WebAuthenticationDetails(request)); Authentication authenticatedUser = authenticationManager.authenticate(token); SecurityContextHolder.getContext().setAuthentication(authenticatedUser); }
用户已通过身份验证,但始终具有ROLE_ANONYMOUS我不知道为什么?有任何想法吗 ?
这种现象看起来很奇怪。Javi建议手动将安全性上下文持久化到会话中,但是应该由Spring Security的自动完成SecurityContextPersistenceFilter。
SecurityContextPersistenceFilter
一个可能的原因,我可以想像是filters = "none"在<intercept-url>你的登记处理的页面。
filters = "none"
<intercept-url>
filters = "none"禁用指定URL的所有安全过滤器。如你所见,它可能会干扰Spring Security的其他功能。因此,更好的方法是保持启用过滤器,但将其配置为允许所有用户访问。你有几种选择:
<http use-expressions = "true" ...>
access = "ROLE_ANONYMOUS"
access = "IS_AUTHENTICATED_ANONYMOUSLY, IS_AUTHENTICATED_FULLY, IS_AUTHENTICATED_REMEMBERED"
access = "true"
<intercept-url>s