即使对于没有安全设置的端点,也始终调用Spring Security过滤器

时间:2018-02-22 19:17:03

标签: spring spring-boot spring-security filter servlet-filters

在添加一些自定义过滤器时,我在弹簧安全性和弹簧启动方面遇到了一些问题。

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

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

此外,我删除了“spring-boot-starter-security”(我已尝试过此依赖项)依赖项。我认为这个问题与弹簧安全弹簧启动时的一些自动内容有关,所以我试图“禁用”Spring启动弹簧安全性并自行配置安全性,所以我添加了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 个答案:

答案 0 :(得分:0)

根据网址模式应用过滤器。默认情况下,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>
即使用户访问SSOProcessingFilter,也会调用

/api/v1/health。只要请求不符合身份验证要求,SSOProcessingFilter就应该忽略它并让它通过过滤器链。