spring - Spring Security 的自定义访问规则

标签 spring security spring-security

通常,您定义一些拦截 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/

相关文章:

java - 如何根据 Java Web 应用程序中的用户请求在两个数据库之间切换?

spring security URL拦截: Different behavior in Tomcat 7 and Jboss Wildfly 8

spring - Spring 3 中的 UrlBasedViewResolver 和 Apache Tiles2

docker - 在 AWS Fargate 容器中存储数据库连接字符串

java - 使用 LDAP 对使用 spring security 的 ADAM 进行身份验证

spring-security - Spring Security - 有没有办法检查您是否处于安全请求中?

java - 可以将一个属性值分配给其他属性文件中的另一个属性吗

windows - 是否可以向 Windows 为管理员用户创建的标准用户 token 添加权限?

c - 如何通过进程属性限制对 Linux 目录的写访问?

java - 从 Spring MVC Controller 的安全上下文中获取 UserDetails 对象