我正在使用自定义的UserDetailService,可以很好地进行身份验证。问题是我不能使用基于角色的约束。
奇怪的是我从管制员那里获得了正确的权限:
public ModelAndView getMembers(HttpServletRequest request, Authentication auth)
{
if(auth != null)
{
for (GrantedAuthority ga : auth.getAuthorities())
{
// works find and logs "ADMIN", btw. I'm using SimpleGrantedAuthority
this.logger.debug("0{}", ga);
}
}
}
但是有了配置
http
.csrf().disable()
.authorizeRequests()
.antMatchers("/Admin/**").hasRole("ADMIN")
…
用户无法访问网页,例如/ Admin /会员。
百里香安全标签也是如此,例如
<div sec:authorize="isAuthenticated() && hasRole('ADMIN')">Hello Admin!</div>
不显示“你好管理员!”对于Controller记录授权为“ ADMIN”的用户。
我想我缺少了一些东西或使用了错误的东西。
感谢您的时间和帮助。
答案 0 :(得分:1)
如评论中所述,您必须使用hasAuthority("ADMIN")
而不是hasRole("ADMIN")
。
区分授予权限和角色很重要。 Baeldung有一篇文章对此进行了解释:Granted Authority Versus Role in Spring Security。从本文中,我们可以了解不同之处:
GrantedAuthority
在Spring Security中,我们可以将每个GrantedAuthority视为个人特权。示例可能包括READ_AUTHORITY,WRITE_PRIVILEGE甚至CAN_EXECUTE_AS_ROOT。 [...]
在直接使用GrantedAuthority时(例如通过使用诸如hasAuthority('READ_AUTHORITY')之类的表达式),我们将以细粒度的方式限制访问。
角色为权威
类似地,在Spring Security中,我们可以将每个角色视为一个粗粒度的GrantedAuthority,它被表示为String并以“ ROLE”为前缀。直接使用角色时,例如通过诸如hasRole(“ ADMIN”)之类的表达式,我们将以粗粒度方式限制访问。