代码之家  ›  专栏  ›  技术社区  ›  Mahmoud Saleh

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

  •  5
  • Mahmoud Saleh  · 技术社区  · 14 年前

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

    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);
        }
    

    用户已通过身份验证,但始终具有“匿名”角色,我不知道为什么? 有什么想法吗?

    2 回复  |  直到 9 年前
        1
  •  8
  •   axtavt    14 年前

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

    我能想象的一个可能原因是 filters = "none" 在里面 <intercept-url> 注册处理页。

    filters=“无” 禁用指定URL的所有安全筛选器。如您所见,它可能会干扰Spring安全性的其他特性。因此,更好的方法是保持过滤器处于启用状态,但将其配置为允许所有用户访问。您有几个选项:

    • 使用的旧语法 access 属性(即没有 <http use-expressions = "true" ...> ):
      • access = "ROLE_ANONYMOUS" 允许未经身份验证的用户访问,但拒绝经过身份验证的用户。
      • 允许所有用户访问 access = "IS_AUTHENTICATED_ANONYMOUSLY, IS_AUTHENTICATED_FULLY, IS_AUTHENTICATED_REMEMBERED"
    • 使用 new Spring Expression Language-based syntax ( <http使用expressions=“true”…> )你只需写 access = "true" 允许所有用户访问 <截获URL> S也应该使用这种语法)。
        2
  •  0
  •   Javi    14 年前

    我有一个类似的问题,在进行身份验证之后,我必须手动设置会话。

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

    试试看。