通常,您定义一些拦截 URL 模式来配置对具有 Spring Security 的页面的访问
<http use-expressions="true">
<intercept-url pattern="/**/secure/**" access="hasRole('ROLE_SECURE_USER')" />
...
</http>
我们现在有一些带有事先未知的 URL 的页面。但是我们可以编写一段代码来决定某个特定页面是否应该受到保护,即我们可以提供一个服务,如果该页面必须受到保护,则返回true。所以我们想做的是这样的:
<http use-expressions="true">
<intercept decide="@service.mustProtect()" access="hasRole('ROLE_SECURE_USER')" />
...
</http>
如何使用 Spring 来实现这一点?我们必须编写自定义过滤器吗?您将如何实现这样的过滤器?
最佳答案
实际上,通过在FilterSecurityInterceptor
之前注入(inject)自定义过滤器来解决我们的问题非常容易。然后,您可以在过滤器的 doFilter
方法中抛出 AccessDeniedException
来触发身份验证。
Spring 安全配置:
<http use-expressions="true">
<custom-filter before="FILTER_SECURITY_INTERCEPTOR" ref="accessFilter"/>
...
</http>
<beans:bean id="accessFilter" class="xyz.AccessFilter" />
过滤器:
public class AccessFilter extends GenericFilterBean {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
if (!currentUserCanAccessPage(request)) {
throw new AccessDeniedException();
}
chain.doFilter(request,response)
}
private boolean currentUserCanAccessPage(ServletRequest request) {
//implement
}
}
关于spring - Spring Security 的自定义访问规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18353994/