2013-04-14 76 views
4

在appSecurity.xml我有这样的:秩序的春季安全拦截的URL模式

拦截的URL模式= “/用户/型材/ **” 访问= “hasRole( 'VIEW_PROFILES')”。

截距-URL模式= “/用户/简档/编辑/ **” 访问= “hasRole( 'EDIT_PROFILES')”

我有一个页面/用户/简档/编辑/的AddNew并且当用户用角色VIEW_PROFILES正在尝试访问此页面,但他获取成功,但阻止了角色EDIT_PROFILES的用户访问。

我在做什么错了?

回答

1

确保您的EDIT_PROFILES规则在VIEW_PROFILES规则之上。如果您查看VIEW_PROFILES的表达式,您会看到它包含了每一个与EDIT_PROFILES匹配的URL。这意味着如果VIEW_PROFILES规则是第一个,spring安全将永远不会去尝试EDIT_PROFILES规则。

9

由于"https://stackoverflow.com/users/profile/edit/""https://stackoverflow.com/users/profile/"更具体,它应该放在列表中更高的位置。

为什么

模式在它们被定义的顺序总是评价。因此,重要的是更多的特定模式在列表中定义得比较不具体的模式更高。这反映在我们上面的例子中,更具体/安全/超级/模式看起来比不那么特定/安全/模式更高。如果它们相反,/ secure/pattern将始终匹配,并且/ secure/super/pattern永远不会被评估。

来源:Core Security Filters

+0

在我的案例中''比'对我来说,这一开始并不明显。 –

+1

@Matthew,在这种情况下的特殊性规则与请求映射的规则相同。请参阅[路径模式比较](http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html):_具有较少的URI变量和通配符的模式被考虑更具体。例如/ hotels/{hotel}/*有1个URI变量和1个通配符,并被认为比/ hotels/{hotel}/**更具体,因为它是1个URI变量和2个通配符._ .... – Ritesh

2

两个约翰·法雷利和仅限Ritesh是正确的。 intercept-url模式按所列顺序进行匹配。一旦找到匹配,指定的其余模式将被忽略。这就是为什么你应该早些时候列出更具体的模式。

在你的情况下,/用户/型材/编辑/ SomePage的模式在第一intercept-url模式中指定的模式相匹配,所以春天适当地检查,看看是否有问题的用户拥有指定的访问角色。显然,你的EDIT_PROFILES用户没有VIEW_PROFILES权限,所以他们被拒绝访问。同样,您打算限制访问具有EDIT_PROFILES权限的用户对../edit/的访问权限正被先前的声明所破坏,该权限授予用户具有VIEW_PROFIL权限的权限。

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

+0

complete并且容易理解,理论上和实际上有用,很好的答案。 – FaithReaper