Spring Boot 2 安全性 - 预认证令牌 - 允许运行状况检查

Posted

技术标签:

【中文标题】Spring Boot 2 安全性 - 预认证令牌 - 允许运行状况检查【英文标题】:Spring Boot 2 security - pre-authenticated token - allow healthcheck 【发布时间】:2019-11-19 23:35:48 【问题描述】:

由于缺少(pre_authenticated)令牌,我的 Spring Boot Actuator healthCheck 被阻止。

有很多可用的答案,但这个问题会干扰预先验证的安全性。据我搜索,这是不是重复的

如何在预先验证的安全环境中允许运行状况检查?

我的问题也是,我是否需要更多设置(例如 application.properties)?

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter 
    private static final Logger logger = LoggerFactory.getLogger(SecurityConfig.class);

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) 
        PreAuthenticatedAuthenticationProvider provider = new PreAuthenticatedAuthenticationProvider();
        provider.setPreAuthenticatedUserDetailsService(new XyzPreAuthenticatedGrantedAuthoritiesUserDetailsService());
        auth.authenticationProvider(provider);
    

    // Try-1, see below
    @Override
    protected void configure(HttpSecurity http) throws Exception 
      http.addFilterBefore(xyzTokenRequestHeaderAuthenticationFilter(), RequestHeaderAuthenticationFilter.class)
        .csrf().disable()
        .authorizeRequests()
        .antMatchers("/actuator/**").permitAll()
        .anyRequest().authenticated();
    

    @Bean
    public XyzTokenRequestHeaderAuthenticationFilter xyzTokenRequestHeaderAuthenticationFilter() throws Exception 
        XyzTokenRequestHeaderAuthenticationFilter filter = new XyzTokenRequestHeaderAuthenticationFilter();
        filter.setAuthenticationManager(authenticationManager());
        return filter;
    

我的第二次尝试是:

@Override
protected void configure(HttpSecurity http) throws Exception 
  http.addFilterBefore(xyzTokenRequestHeaderAuthenticationFilter(), RequestHeaderAuthenticationFilter.class)
    .csrf().disable()
    .authorizeRequests()
    .antMatchers("/actuator/**").permitAll();

【问题讨论】:

我认为您需要覆盖 WebSecurity 方法并禁用 actuator api 上的所有安全性。此外,您可以使用 EndpointRequest 类来封装您的执行器 API 来回 听起来不错,请举个例子。 【参考方案1】:

看起来 xyz 过滤器没有以“完美”的方式实现。

这种方式将帮助您完成工作:

1 - 使用管理端口:

management.server.port=8081
management.security.enabled=false
management.server.address=127.0.0.1
management.server.ssl.enabled=false
management.endpoints.health.sensitive=false
management.endpoint.health.show-details=always

2 - 配置 web 和 api 两种方式。在标准部件之外使用它:

@Override
protected void configure(HttpSecurity http) throws Exception 
  http.sessionManagement().sessionCreationPolicy(STATELESS);
  http.csrf().disable();
  http.authorizeRequests()
    .antMatchers("/actuator/**").permitAll()
    .antMatchers("/**").authenticated();
  http.addFilterBefore(xyzTokenRequestHeaderAuthenticationFilter(), AbstractPreAuthenticatedProcessingFilter.class);


@Override
public void configure(WebSecurity web) throws Exception 
  web.ignoring().antMatchers("/actuator/**");

3 - 在 Docker 容器内,使用 8081 端口进行健康检查。

【讨论】:

【参考方案2】:

问题似乎出在您的XyzTokenRequestHeaderAuthenticationFilter 实现上。如果您是通过扩展RequestHeaderAuthenticationFilter 编写的,那么您必须将属性exceptionIfHeaderMissing 设置为false

如果你没有扩展那个 Spring Security pre auth core 类,那么你需要展示实现。

【讨论】:

【参考方案3】:

尝试在课堂上添加.ignoring()并添加@EnableGlobalMethodSecurity(prePostEnabled = true)@Configuration

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter implements WebMvcConfigurer

 @Override
    public void configure(WebSecurity web) throws Exception 
        web
          .ignoring()
            .antMatchers("/actuator/**");
    

     @Override
        protected void configure(HttpSecurity http) throws Exception 
          http
            .csrf().disable()
            .authorizeRequests()
            .antMatchers("/actuator/**").permitAll()
            .anyRequest().authenticated()
            .and()
            .addFilterBefore(xyzTokenRequestHeaderAuthenticationFilter(), RequestHeaderAuthenticationFilter.class);
        


【讨论】:

感谢您提供此解决方案。唉,仍然存在“Xyz token missing”错误。 你好@Jandroid1 能否请你更新堆栈跟踪或完整错误并可以分享xyzTokenRequestHeaderAuthenticationFilter()

以上是关于Spring Boot 2 安全性 - 预认证令牌 - 允许运行状况检查的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Spring Security 实现具有两级令牌认证的 Spring Boot 微服务?

使用 JWT 令牌的 Spring Boot webflux 安全性

Spring boot 2.0.3 + 安全 + Oauth2 自动配置

使用 Stomp 在 Spring Boot 中访问 JWT 令牌

Spring Boot Security OAuth2 实现支持JWT令牌的授权服务器

Spring cloud微服务安全实战-6-2JWT认证之认证服务改造