Spring 用户授予的权限始终为:角色\匿名?

Spring 用户授予的权限始终为:角色\匿名?,spring,spring-mvc,spring-security,Spring,Spring Mvc,Spring Security,我使用以下方法在注册后进行编程登录 private void autoLogin(User user, HttpServletRequest request) { GrantedAuthority[] grantedAuthorities = new GrantedAuthority[] { new GrantedAuthorityImpl( "ROLE_ADMIN") }; UsernamePasswordAu

我使用以下方法在注册后进行编程登录

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);
    }
用户已通过身份验证,但始终具有匿名角色,我不知道为什么?
有什么想法吗

我遇到了类似的问题,在进行身份验证之后,我不得不手动设置会话

request.getSession().setAttribute(HttpSessionSecurityContextRepository.SPRING_SECURITY_CONTEXT_KEY, SecurityContextHolder.getContext());

试试看。

这种行为看起来很奇怪。Javi建议手动将安全上下文持久化到会话中,但应该由Spring security的
SecurityContextPersistenceFilter
自动完成

我能想象的一个可能的原因是注册处理页面的
中的
filters=“none”

filters=“none”
禁用指定URL的所有安全筛选器。如您所见,它可能会干扰Spring Security的其他功能。因此,更好的方法是启用过滤器,但将其配置为允许所有用户访问。您有几个选择:

  • 使用
    access
    属性的旧语法(即没有
    ):
    • access=“ROLE\u ANONYMOUS”
      允许未经身份验证的用户访问,但拒绝已验证用户的访问
    • 要允许所有用户访问,您可以编写
      access=“IS\u AUTHENTICATED\u匿名、IS\u AUTHENTICATED\u完全、IS\u AUTHENTICATED\u membered”
  • 使用(
    )只需编写
    access=“true”
    即可允许所有用户访问(但其他
    也应使用此语法)

我认为这是因为页面需要一个角色\u ADMIN principal,身份验证后的用户角色是匿名的,任何人都知道如何在登录时将用户principal设置为管理员?谢谢,伙计,对我来说效果很好,但我很好奇这一行代码的好处是什么?正如axtavt所说,它只是在会话中设置了安全管理器。我同意应该自动完成,但当我尝试时,我必须设置它以使其工作。是的,你是对的,我在注册页面上使用filters=“none”,它和access=“ROLE\u ANONYMOUS”有什么区别?因此,如果我使用access=“true”,这意味着任何人都可以访问该页面,但是过滤器又是如何执行的呢?那么同时使用access=“true”和filters=“none”又如何呢?@sword101:如果您编写
filters=“none”
,则不会执行过滤器。否则它们会被执行。你说
,但是其他的也应该使用这种语法
,但是我同时使用access=“true”和filters=“none”,并且效果很好。你这是什么意思?这是否意味着如果我设置了过滤器,就不能在不同的拦截器上使用filters=“none”和access=“true”?