用户授权的权限始终是:ROLE_ANONYMOUS?

时间:2010-10-13 11:52:40

标签: spring spring-mvc spring-security

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

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我不知道为什么? 有任何想法吗 ?

2 个答案:

答案 0 :(得分:8)

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

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

filters = "none"禁用指定网址的所有安全过滤器。如您所见,它可能会干扰Spring Security的其他功能。因此,更好的方法是保持启用过滤器,但配置它们以允许所有用户访问。您有几种选择:

  • 使用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 use-expressions = "true" ...>),您只需编写access = "true"即可允许所有用户访问(但其他<intercept-url>也应使用此语法。)

答案 1 :(得分:0)

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

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

试试吧。