我在Spring 4 MVC + Security + Boot项目中设置了一个自定义身份验证过滤器.过滤器做得很好,现在我想禁用某些URI的安全性(比如/api/**).这是我的配置
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter{
@Override
public void configure(WebSecurity webSecurity) throws Exception {
webSecurity.ignoring().antMatchers("/api/**");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest().authenticated()
.and()
.addFilterBefore(filter, BasicAuthenticationFilter.class);
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,当我在/ api/...下调用资源时,过滤器仍然被链接.我在我的过滤器中添加了println,并在每次调用时将其写入控制台.你知道我的配置有什么问题吗?
UPDATE
过滤代码:
@Component
public class EAccessAuthenticationFilter extends RequestHeaderAuthenticationFilter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("FILTER");
if(SecurityContextHolder.getContext().getAuthentication() == null){
//Do my authentication stuff
PreAuthenticatedAuthenticationToken authentication = new PreAuthenticatedAuthenticationToken(user, credential, authorities); …Run Code Online (Sandbox Code Playgroud) 我们有一个如下所示的配置:
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
public static final String LOGIN_PATH_EXPRESSION = "/login";
public static final String API_PATH_EXPRESSION = "/api/**/*";
public static final String GLOBAL_PATH_EXPRESSION = "/**/*";
@Autowired
@Qualifier("ssoFilter")
private Filter ssoFilter;
@Autowired
private VerifyingProcessingFilter verifyingProcessingFilter;
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.userDetailsService(username -> new User(username, "", Collections.emptyList()))
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers(LOGIN_PATH_EXPRESSION)
.authenticated()
.and()
.httpBasic()
.and()
.authenticationProvider(new SimpleAuthenticationProvider())
.authorizeRequests()
.antMatchers(API_PATH_EXPRESSION).authenticated()
.and()
.addFilterBefore(ssoFilter, BasicAuthenticationFilter.class)
.addFilterAfter(verifyingProcessingFilter, FilteredOAuth2AuthenticationProcessingFilter.class)
.authorizeRequests()
.antMatchers(GLOBAL_PATH_EXPRESSION)
.permitAll()
.and()
.csrf()
.disable();
}
Run Code Online (Sandbox Code Playgroud)
并且认识到我们FilteredOAuth2AuthenticationProcessingFilter …
我正在使用 Spring Actuator(版本 2.2.4.RELEASE)来生成可以正常工作的运行状况检查端点/localhost:8080/my-app/actuator/health。
这会生成访问时显示的 3 个端点,/actuator并显示在 Swagger(版本 2)中:
/actuator/health/actuator/health/{*path}(在我的招摇页面中,这显示为/actuator/health/**)/actuator/info由于 AWS 的原因,我遇到了问题,health/**想将其删除(我/info也想删除,因为我不需要它)。
我尝试将以下内容添加到我的application.properties文件中:
management.endpoints.web.exposure.exclude=health,info
Run Code Online (Sandbox Code Playgroud)
和
management.endpoints.jmx.exposure.exclude=health,info
Run Code Online (Sandbox Code Playgroud)
但这没有任何区别(它们仍然会生成)。我曾尝试使用它*来查看是否会强制所有端点消失,但它也不会改变任何内容。
知道如何解决这个问题吗?
我发现一个属性文件被另一个文件覆盖。因此,使用以下命令:
management.endpoints.enabled-by-default=false
management.endpoint.health.enabled=true
Run Code Online (Sandbox Code Playgroud)
摆脱/actuator/info端点。但是,我仍然需要摆脱 the/actuator/health/{*path}并保留/actuator/health端点。