使用this方法,我在前端(Thymeleaf)遇到了一些麻烦。一个例子:
admin
(该角色分配了两个权限read
和write
)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;}访问div
。 role
?我真的必须列出所有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;我的意思是,如果我无法访问整个组的页面,那么将组权限(角色)分组的意义是什么?
答案 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]
答案 1 :(得分:0)
鉴于您的意见,我认为这可能与您的角色缺少ROLE_
前缀和/或Spring Security 4中的行为更改有关。
填充时,角色通常会自动添加前缀。例如,DefaultLdapAuthoritiesPopulator
包含rolePrefix
属性,默认情况下设置为ROLE_
(请参阅the source和these 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功能。