提问者:小点点

Spring Security中截获URL模式的顺序


在appSecurity中。xml我有这个:

intercept-URL pattern = "/users/profile/* * " access = " has role(' VIEW _ PROFILES ')"。

intercept-URL pattern = "/users/profile/EDIT/* * " access = " has role(' EDIT _ PROFILES))"

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

我做错了什么?


共3个答案

匿名用户

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

为什么?

模式总是按照其定义的顺序进行评估。因此,在列表中定义更具体的模式比定义更少的模式更重要。这反映在我们上面的示例中,其中更具体的/secure/super/模式似乎高于不太具体的/secure/模式。如果将它们反转,则/secure/模式将始终匹配,/secure/super/模式将永远不会被评估。

来源:核心安全过滤器

匿名用户

John Farrelly和Ritesh都是对的。截获 URL 模式按列出的顺序匹配。找到匹配项后,将立即忽略指定的其余模式。这就是为什么您应该在前面列出更具体的模式。

在你的例子中,/users/profile/edit/somepage的模式与第一个截获网址模式中指定的模式相匹配,因此Spring会适当地检查有问题的用户是否具有指定的访问角色。显然,您的EDIT_PROFILES用户没有VIEW_PROFILES权限,因此他们被拒绝访问。同样,您打算将访问权限限制为 ../edit/ 给具有EDIT_PROFILES权限的用户正在被前面的声明所破坏,该声明将访问权限授予具有VIEW_PROFILES权限的用户。

切换顺序以便于修复,您可能希望为EDIT_PROFILES用户VIEW_PROFILES权限(除了EDIT_PROFILES权限之外)。然后,考虑使用 access=“hasAnyRole('REQUIRED_ROLE')” 而不是 access=“hasRole('REQUIRED_ROLE')”,以简化访问语句。

匿名用户

请确保EDIT_PROFILES规则高于VIEW_PROFILES规则。如果您看一下VIEW_PROFILES的表达式,您会看到它包含了所有匹配EDIT_PROFILES的URL。这意味着如果VIEW_PROFILES规则是第一位的,那么spring security将不会尝试EDIT_PROFILES规则。