即使对于没有安全设置的端点,也总是调用 Spring Security 过滤器[重复]

Posted

技术标签:

【中文标题】即使对于没有安全设置的端点,也总是调用 Spring Security 过滤器[重复]【英文标题】:Spring Security filter always being invoked even for endpoints without security set [duplicate] 【发布时间】:2018-08-02 18:46:20 【问题描述】:

在添加一些自定义过滤器时,我在这里遇到了一些关于 spring 安全性和 spring boot 的问题。

在我的主要课程中,我有:

@ComponentScan
@SpringBootApplication    
@ImportResource("/applicationContext.xml")
public class Application 

我还删除了“spring-boot-starter-security”(我已经尝试过使用此依赖项)依赖项。我认为这个问题与带有spring security的spring boot的一些自动东西有关,所以我尝试“禁用”spring-security启动的spring-security并自己配置安全性,所以我添加了expliclty依赖项:

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-acl</artifactId>
    <version>3.1.4.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>3.1.4.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-core</artifactId>
    <version>3.1.4.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-taglibs</artifactId>
    <version>3.1.4.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>3.1.4.RELEASE</version>
</dependency>

然后我有一个过滤器可以进行自定义身份验证:

public class SSOProcessingFilter extends extends GenericFilterBean 

然后在我的 applicationContext.xml 中我为这个过滤器创建了一个 bean:

<bean id="ssoAuthenticationFilter" class="com.custom.security.filter.SSOProcessingFilter">
    <property name="authenticationManager" ref="authenticationManager"/>
</bean>

当我尝试从端点删除安全性时会出现问题,例如:

<security:http pattern="/api/v1/health" security="none"/>

一旦我启动了应用程序,它每次只通过在 applicationContext.xml 中声明 bean 来调用 SSOProcessingFilter

一旦给定端点被标记为不具有安全性,我就需要它。此 SSOProcessingFilter 不执行。

你知道为什么即使对于没有安全性的端点,spring boot 总是执行这个过滤器吗?

提前致谢

【问题讨论】:

【参考方案1】:

过滤器是根据它们的 url 模式应用的。默认情况下,GenericFilterBean 的子类将具有 /* 模式。如果您想覆盖此默认行为,您必须使用FilterRegistrationBean 手动注册您的过滤器。 另一方面,您可以允许您的身份验证过滤器在每个请求中被命中,并让 Spring 访问决策者完成他们的工作。在这种情况下,最简单的配置可能如下所示:

<bean id="ssoFilter" class="com.custom.security.filter.SSOProcessingFilter"/>
<bean id="ssoEntryPoint" class="com.custom.security.SSOEntryPoint"/>

<http use-expressions="true" entry-point-ref="ssoEntryPoint">
    <intercept-url pattern="/api/v1/health" access="permitAll()"/>
    <intercept-url pattern="/**" access="isAuthenticated() and hasRole('ROLE_USER')"/>
    <custom-filter ref="ssoFilter" after="BASIC_AUTH_FILTER"/>
</http>

<authentication-manager>
    <authentication-provider>
        <user-service>
            <user name="user" password="secret" authorities="ROLE_USER"/>
        </user-service>
    </authentication-provider>
</authentication-manager>

即使用户访问/api/v1/health,也会调用SSOProcessingFilter。只要请求不满足身份验证要求SSOProcessingFilter 就应该忽略它,让它通过过滤器链。

【讨论】:

以上是关于即使对于没有安全设置的端点,也总是调用 Spring Security 过滤器[重复]的主要内容,如果未能解决你的问题,请参考以下文章

即使没有上传输入文件,Laravel mimes 验证也总是被调用(不使用必需的规则)

构建两端点间的安全通信

NodeJS/express - 公共 API 端点的安全性

即使在 [[UIPickerView alloc] init] 之后设置了委托,也没有调用 UIPickerView 委托方法

didSelectRowAt Swift 3 即使在设置了委托和数据源后也没有调用

Autodesk Forge:文件上传恢复总是返回 202,即使是最终块