如何确定使用Spring Security访问URL所需的角色?

Hil*_*ell 5 java spring spring-mvc spring-security

我正在使用Spring Security来保护webapp.URL的安全性如下:

<security:http entry-point-ref="authenticationEntryPoint">
  <security:intercept-url pattern="/" access="ROLE_ANONYMOUS" />
  <security:intercept-url pattern="/assets/**/*" access="ROLE_ANONYMOUS" />
  ...
  <security:intercept-url pattern="/**" access="ROLE_USER" />
  <security:anonymous granted-authority="ROLE_ANONYMOUS" />
</security:http>
Run Code Online (Sandbox Code Playgroud)

我有一个过滤器,在某些情况下需要将用户重定向到特殊页面.但是,该页面需要资产目录中的图像和CSS文件,遗憾的是,这些文件也会被重定向到该特殊页面.我不希望过滤器手动检查每个URL模式,因为我的实际URL配置要长得多,而且我还想允许其他页面.

有没有办法从过滤器中确定给定页面需要哪些角色?如果不需要ROLE_ANONYMOUS,我可以选择不重定向.

And*_*yle 2

不要忘记,在决定是否允许访问时实际发生的是 URL 和现有身份验证通过一系列AccessDecisionVoter传递,其中默认值之一是RoleVoter。该投票者检查所请求资源的配置,如果需要特定角色,并且现有身份验证不具有该角色,则将拒绝该请求。

因此,对于解决方案 - 您可以在角色投票者之前添加其他投票者。每个投票者必须返回“同意”、“拒绝”或“弃权”,并且只有返回“弃权”后,处理才会继续到后面的投票者。因此,您可以编写自己的自定义投票器(或者如果可行的话,可以重用现有的投票器),让它在角色投票器之前触发,并无条件授予对您所引用的资源的任何请求的访问权限。

我在当前的项目中做了类似的事情,其中​​某些瞬态应用程序特定的属性可以让某人访问通常他们无法访问的资源,并且它作为一种方法效果很好。