Spring 使用多个配置保护同一端点

Spring 使用多个配置保护同一端点,spring,spring-security,Spring,Spring Security,我们有一个微服务体系结构,通过JWT提供前后安全性,通过HTTP Basic提供背对背安全性 以下是JWT的配置类: @Override protected void configure(HttpSecurity http) throws Exception { http .requestMatchers() .antMatchers(endpointsProperties.getJwtWithWildcard())

我们有一个微服务体系结构,通过JWT提供前后安全性,通过HTTP Basic提供背对背安全性

以下是JWT的配置类:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
            .requestMatchers()
            .antMatchers(endpointsProperties.getJwtWithWildcard())
            .and()
            .csrf().disable()
            .authorizeRequests().anyRequest().authenticated()
            .and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and().addFilterBefore(jwtFilter(), UsernamePasswordAuthenticationFilter.class);
}
jwtFilter是一个简单的过滤器,它读取授权头并设置SecurityContextHolder

和HTTP Basic:

@Override
public void configure(final AuthenticationManagerBuilder auth) throws Exception {
    for (Map<String, String> userData : properties.getUsers()) {
        auth.inMemoryAuthentication().passwordEncoder(NoOpPasswordEncoder.getInstance())
                .withUser(userData.get("login")).password(userData.get("password")).authorities(BASIC_AUTH_AUTHORITY);
    }


@Override
protected void configure(HttpSecurity http) throws Exception {
    http.requestMatchers().antMatchers(endpoints.getBasicWithWildcard() )
            .and().csrf().disable()
            .authorizeRequests().anyRequest().authenticated()
            .and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and().httpBasic();
}
@覆盖
public void configure(最终身份验证ManagerBuilder auth)引发异常{
for(Map userData:properties.getUsers()){
auth.inMemoryAuthentication().passwordEncoder(NoOpPasswordEncoder.getInstance())
.withUser(userData.get(“login”)).password(userData.get(“password”)).authorities(基本授权);
}
@凌驾
受保护的无效配置(HttpSecurity http)引发异常{
http.requestMatchers().antMatchers(endpoints.getBasicWithWildcard())
.and().csrf().disable()
.authorizeRequests().anyRequest().authorized()
.and().sessionManagement().sessionCreationPolicy(sessionCreationPolicy.STATELESS)
.和().httpBasic();
}
这些配置类用于不同的网络服务,具有不同的JWT和HTTP验证端点。它们可以同时使用,也可以独立使用。EndpointsProperties从application.yml加载

但现在,我们有一些引用微服务,我们希望其他服务或(web)前端应用程序直接访问这些微服务使用这两种不同的方法。将这些配置类与相同的端点组合在一起不起作用,而且似乎一种配置将另一种配置合并

可以用不同的方法保护相同的URL路径吗?如果可以,我们需要做什么更改才能启用它


谢谢您的支持。

我想您可以按此顺序将两个过滤器添加到过滤器链中

  • 基本认证过滤器
  • JWT滤波器
  • 并确保
    BasicAuthenticationFilter
    ignoreFailure
    属性设置为
    true

    这将使basicAuthFilter使用basicAuth对请求进行身份验证,如果没有发送basicAuth,则只需继续沿着过滤器链,从而委托给JwtFilter

    然后从
    WebsecurityConfig
    中删除
    .httpBasic()
    ,因为它将尝试添加另一个BasicSecurityFilter

    只是一个即兴的想法