Spring Security-GrantedAuthority和基于角色的访问

时间:2019-03-17 19:25:26

标签: spring security roles authority

我正在使用自定义的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”的用户。

我想我缺少了一些东西或使用了错误的东西。

感谢您的时间和帮助。

1 个答案:

答案 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”)之类的表达式,我们将以粗粒度方式限制访问。