Spring Security中拦截url模式的顺序

时间:2013-04-14 11:51:47

标签: spring spring-security

在appSecurity.xml中我有这个:

intercept-url pattern =“/ users / profile / **”access =“hasRole('VIEW_PROFILES')”。

intercept-url pattern =“/ users / profile / edit / **”access =“hasRole('EDIT_PROFILES')”

我有一个页面/ users / profiles / edit / addnew,当具有角色VIEW_PROFILES的用户尝试访问此页面时,他成功获取了该页面,但是对具有角色EDIT_PROFILES的用户的访问被阻止。

我做错了什么?

3 个答案:

答案 0 :(得分:9)

由于"/users/profile/edit/""/users/profile/"更具体,因此应将其列在列表的较高位置。

<强>为什么

  

模式总是按照定义的顺序进行评估。因此,重要的是在列表中定义的更具体的模式比不太具体的模式更高。这反映在我们上面的示例中,其中更具体/安全/超级/模式看起来高于不太具体/安全/模式。如果它们被颠倒了,/ secure / pattern将始终匹配,并且永远不会评估/ secure / super / pattern。

来源:Core Security Filters

答案 1 :(得分:2)

John Farrelly和Ritesh都是正确的。 intercept-url模式按列出的顺序进行匹配。一旦找到匹配项,就会忽略指定的其余模式。这就是为什么你应该更早地列出更具体的模式。

在您的情况下, / users / profile / edit / somepage 的模式与第一个intercept-url模式中指定的模式匹配,因此Spring正在检查用户是否在问题具有指定的访问角色。显然,您的EDIT_PROFILES用户没有VIEW_PROFILES权限,因此他们被拒绝访问。同样,您打算限制对具有EDIT_PROFILES权限的用户访问 ../ edit / 的意图正在被早先的声明破坏,该声明授予对具有VIEW_PROFILES权限的用户的访问权。

切换简单修复的顺序,您可能希望为EDIT_PROFILES用户授予VIEW_PROFILES权限(除了EDIT_PROFILES权限)。然后,考虑使用access="hasAnyRole('REQUIRED_ROLE')"而不是access="hasRole('REQUIRED_ROLE')"来简化访问语句。

答案 2 :(得分:1)

确保您的EDIT_PROFILES规则高于VIEW_PROFILES规则。如果您查看VIEW_PROFILES的表达式,您将看到它包含与EDIT_PROFILES匹配的每个URL。这意味着如果VIEW_PROFILES规则是第一个,那么Spring安全性永远不会费心去尝试EDIT_PROFILES规则。