Spring Security'角色'和#"权限'和Thymeleaf' hasRole'和' hasAuthority'

时间:2018-05-08 12:33:18

标签: spring spring-security thymeleaf

使用this方法,我在前端(Thymeleaf)遇到了一些麻烦。一个例子:

  • 用户拥有角色admin(该角色分配了两个权限readwrite
  • 用户具有角色user(该角色仅分配了read权限)

在前端,我将保护不同的div。如果我使用admin登录:

<li sec:authorize="hasRole('admin')">Entry 1</li>
<li sec:authorize="hasAnyRole('admin', 'user')">Entry 2</li>

没有显示任何内容,而

<li sec:authorize="hasAuthority('read')">Entry 3</li>
<li sec:authorize="hasAnyAuthority('read', 'write')">Entry 4</li>

完美无缺。

现在,当我使用role作为privileges的容器时,是否无法允许{&#34;整个&#34;}访问divrole?我真的必须列出所有privileges吗?或者我在这里混合什么?感谢。

主要思想是:

  • 用户1

    with Role 'admin'
    
            with Privilege 'read' / 'write'
    
  • 用户2

    with Role 'user'
    
            with Privilege 'read'
    

在Thymeleaf:

为角色为admin的所有用户显示div

<li sec:authorize="hasRole('ROLE_ADMIN')">Entry 1</li>

并显示使用

写入权限的所有用途的div

<li sec:authorize="hasAuthority('READ_PRIVILEGE')">Entry 1</li>

这是否可行?&#39;要走的路?&#39;我的意思是,如果我无法访问整个组的页面,那么将组权限(角色)分组的意义是什么?

2 个答案:

答案 0 :(得分:4)

通常,您不需要包含ROLE_前缀。

然而,当涉及到Thymeleaf时,不仅需要包含它,它还区分大小写:

<li sec:authorize="hasRole('ROLE_ADMIN')">Admin</li>
<li sec:authorize="hasRole('ROLE_USER')">User</li>

此外,ROLE_USER的替代方法(默认情况下,授予所有经过身份验证的用户的权限)将改为使用isAuthenticated(),如下所示:

<li sec:authorize="isAuthenticated()">Authenticated users can see this</li>

如果您想了解哪些角色归因于当前用户,您可以将以下内容添加到您的页面中:

<span sec:authentication="principal.authorities"></span>

它应该在加载页面时呈现一系列角色,例如[ROLE_USER, ROLE_ADMIN]

Reference

答案 1 :(得分:0)

鉴于您的意见,我认为这可能与您的角色缺少ROLE_前缀和/或Spring Security 4中的行为更改有关。

填充时,角色通常会自动添加前缀。例如,DefaultLdapAuthoritiesPopulator包含rolePrefix属性,默认情况下设置为ROLE_(请参阅the sourcethese docs)。因此,通过LDAP检索的所有角色都将自动加上前缀。如果情况属于这种情况,当然取决于你如何填充你的角色。

自Spring Security 4起,DefaultWebSecurityExpressionHandler默认情况下会向ROLE_hasRole(String)添加hasAnyRole(String...)前缀(请参阅the source)。例如,如果使用hasRole("ADMIN"),则ROLE_ADMIN将检查角色DefaultWebSecurityExpressionHandler

使用hasAuthority("ADMIN")确实有效,因为没有为该表达式添加前缀。

因此,在您的情况下,如果您的角色填充没有 ROLE_,则使用hasRole("ADMIN")实际上可能会尝试与ROLE_ADMIN匹配,具体取决于Spring Security你使用的版本。这也影响了Thymeleaf,因为Thymeleaf只是使用Spring Security功能。