在添加一些自定义过滤器时,我在弹簧安全性和弹簧启动方面遇到了一些问题。
在我的主要课程中,我有:
@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总是在没有安全性的情况下执行这个过滤器吗?
提前致谢
答案 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
就应该忽略它并让它通过过滤器链。