Spring 权限在登录后 <sec:authorize> 中不可用

Spring Authorities not available in <sec:authorize> after login

我正在使用 spring security 4.0.2 和 spring webflow 2.4.2 在 JSF 页面中,使用 ROLE_ANONYMOUS,我没有任何问题。

    <sec:authorize  ifAnyGranted="ROLE_ANONYMOUS">
        ...
    </sec:authorize> 

但是,登录后,这不起作用

<sec:authorize access="hasRole('ACESSO-BO2')">
            ...
        </sec:authorize>  

但这行得通:

<sec:authorize access="isAuthenticated()">
            ...
        </sec:authorize>  

视图知道它已通过身份验证,但不知道此用户的角色。

在我的控制器中,这显示了正确的权限:

Authentication auth = SecurityContextHolder.getContext().getAuthentication();
List<GrantedAuthority> listaAuth = (List<GrantedAuthority>) auth.getAuthorities();
 while (i < listaAuth.size()){
                  System.out.println(i+":"+listaAuth.get(i).getAuthority());
                  i++;
              }

这是怎么引起的,我该如何解决?

从 Spring 4 开始,hasRole 功能会检查传入角色是否以角色前缀为前缀(默认为 ROLE_),如果没有,则将其添加到传入的角色中(参见 SEC-2758)。

您正在传递 ACESSO-BO2,Spring 安全现在正在检查用户是否具有 ROLE_ACESSO-BO2 的权限。后者恐怕不是这样。

要么更改您的安全性并使用 ROLE_ 作为所有权限的前缀,要么使用 hasPermission 而不是 hasRole,后者不添加前缀。