2012-07-18 78 views
9

在我们的应用程序,我们计划使用RoleVoter机制,但我们希望,我们正在实施的安全性是基于比基于角色更任务删除ROLE_前缀。为什么Spring Security的RoleVoter需要一个前缀?

从技术上讲,执行没有问题,但我在文档中发现using the RoleVoter with an empty prefix should be discouraged

我想知道为什么?

AFAICS,唯一的问题是,如果没有前缀,则RoleVoter将参与决策,这并不意味着(如IS_AUTHENTICATED_FULLYIS_AUTHENTICATED_REMEMBERED,...)和威力,而不是返回剥夺了自制的访问。

请问您是否确认这是空白前缀的唯一问题?

在此先感谢 M.

回答

13

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

如果您没有配置带前缀的RoleVoter,则会检查用户是否拥有分配给它们的名为“DAY_MONDAY”的权限,因此此方案无效。

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

+1

你好,卢克,我只是将Spring Boot从1.2.2升级到1.3.2,这开始为我制动。我的控制器有@PreAuthorize(“hasRole('Edit')”),现在开始检查ROLE_前缀。似乎您对hasRole()的解释自从发布此答案以来发生了变化,因为它正在通过RoleVoter。我试图找到方法来设置前缀为空“”但他们都没有工作......你能推荐另一种方式来做到这一点在Spring Boot 1.3.2? – szxnyc 2016-02-28 01:17:07

+2

我改变它haaAuthority,它的工作。 – szxnyc 2016-05-21 13:23:14

相关问题