在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的用户的访问被阻止。
我做错了什么?
答案 0 :(得分:9)
由于"/users/profile/edit/"
比"/users/profile/"
更具体,因此应将其列在列表的较高位置。
<强>为什么强>
模式总是按照定义的顺序进行评估。因此,重要的是在列表中定义的更具体的模式比不太具体的模式更高。这反映在我们上面的示例中,其中更具体/安全/超级/模式看起来高于不太具体/安全/模式。如果它们被颠倒了,/ secure / pattern将始终匹配,并且永远不会评估/ secure / super / pattern。
答案 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规则。