在我们的应用程序中,我们计划使用RoleVoter机制,但是我们想删除ROLE_前缀,因为我们实现的安全性更多的是基于任务的,而不是基于角色的。

从技术上讲,实现没有问题,但是我在文档using the RoleVoter with an empty prefix should be discouraged中找到了。

我想知道为什么吗?

在AFAICS中,唯一的问题是,没有前缀,RoleVoter将参与其不打算进行的决策(例如IS_AUTHENTICATED_FULLYIS_AUTHENTICATED_REMEMBERED,...),并且可能会返回拒绝访问而不是弃权。

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

提前致谢
M.

最佳答案

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

如果您没有使用前缀配置RoleVoter,那么它将检查用户是否具有分配给他们的名为“DAY_MONDAY”的权限,因此该方案将不起作用。

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

关于spring-security - 为什么Spring Security的RoleVoter需要前缀?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11539162/

10-13 03:41