【问题标题】:Spring Security 3: hasRole rules are separately checked or?Spring Security 3:hasRole规则是单独检查还是?
【发布时间】:2016-02-22 18:46:38
【问题描述】:

我的项目中有这个案例:

假设我们有这两行来定义 Spring Security 访问规则:

<intercept-url pattern="/xxx/*" access="isAuthenticated() and (hasRole('roleA') or hasRole('roleB'))" /> 
<intercept-url pattern="/xxx/yyy*" access="isAuthenticated() and (hasRole('role1') or hasRole('role2'))" />

这两种模式是嵌套的,用户可能具有“roleA”和“role1”或“roleA”和“role2”等角色的组合。我想要实现的是让用户拥有“roleC”和“role1”无法访问/xxx/yyy*

所以我的问题是:

当具有“roleC”和“role1”的用户想要获得模式“xxx/yyy222.html”的访问权限时,是检查所有行的访问规则,还是只检查第二行?在考虑第二行的访问规则时,我是否可以想当然地认为用户可以进入url“xxx/yyy*”只有“roleA”和“roleB”,或者我必须为每一行设置完整的规则规则?

【问题讨论】:

    标签: spring spring-security urlaccess


    【解决方案1】:

    intercept-urls 按照它们定义的顺序进行处理,第一个与请求路径匹配的模式决定访问。

    当具有“roleC”和“role1”的用户想要通过模式访问时 "xxx/yyy222.html", 会检查所有行的访问规则,还是只检查 第二行被检查了?

    这与第一行的模式匹配,访问将被拒绝。

    在考虑第二行的访问规则时,我可以接受吗 理所当然的用户可以进入 url "xxx/yyy*" 只有 “roleA”和“roleB”,或者我必须为每个单曲设置完整的规则 规则?

    永远不会评估第二行。请务必先指定更具体的模式。

    我想要实现的是让用户拥有“roleC”而“role1”不能 访问 /xxx/yyy*。

    也许你想要类似的东西:

    <intercept-url pattern="/xxx/yyy*" access="isAuthenticated() and !(hasRole('roleC') and hasRole('role1'))" />
    

    【讨论】:

    • 谢谢。我也在检查其他答案并获取文档参考。接受为第一个和正确的。
    猜你喜欢
    • 1970-01-01
    • 2011-03-02
    • 2019-11-24
    • 2015-08-27
    • 2015-08-09
    • 2017-06-16
    • 2013-08-14
    相关资源
    最近更新 更多