为什么Spring Security的RoleVoter需要前缀?

pou*_*sma 10 spring-security

在我们的应用程序中,我们计划使用该RoleVoter机制但我们想删除ROLE_前缀,因为我们正在实现的安全性比基于角色的任务基于任务.

从技术上讲,实现没有问题,但我在文档中发现,不鼓励使用RoleVoter带有空前缀.

我想知道为什么?

AFAICS,唯一的问题是,如果没有前缀时,RoleVoter将参与决策,这并不意味着(如IS_AUTHENTICATED_FULLY,IS_AUTHENTICATED_REMEMBERED...)和威力返回否认,而不是弃权的访问.

您能否确认这是唯一一个空前缀的问题?

在此先感谢M.

Sha*_*eep 15

是.如果您使用多个选民或自定义选民,那么他们需要某种方式知道他们应该使用哪些属性.例如,如果您有一个DayOfTheWeekVoter并且您拥有使用属性定义的资源,ROLE_USER,DAY_MONDAY那么RoleVoter可能会投票授予访问权限,因为用户具有角色"User",但DayOfTheWeekVoter可能拒绝访问,因为它不是星期一.

如果您没有配置RoleVoter前缀,那么它将检查用户是否具有分配给他们的名为"DAY_MONDAY"的权限,因此这种情况将不起作用.

如果您只对角色感兴趣,那么您可以不使用前缀,或者您可以使用hasRole('user')不使用a的表达式(例如)RoleVoter.

  • 你好Luke,我只是将Spring Boot从1.2.2升级到1.3.2,这开始让我失望.我的控制器有@PreAuthorize("hasRole('Edit')"),现在它开始检查ROLE_前缀.似乎你对hasRole()的解释已经改变,因为你发布了这个答案,因为它是通过RoleVoter.我试图找到将前缀设置为空""的方法,但它们都没有工作......你能在Spring Boot 1.3.2中推荐另一种方法吗? (3认同)
  • 我把它改为haaAuthority并且它有效. (3认同)