当前位置: 首页 > 知识库问答 >
问题:

如何在Spring中为非安全endpoint传递Authorizatoin标头

谭玉泽
2023-03-14

我正在使用spring webflux和Security。我有3个服务A、B、C和服务C中的两个endpoint,如下所示

  1. 健康安全
  2. 状态-不应保护
@Configuration
@EnableWebFluxSecurity
public class SecureConfiguration {
  @Bean
  public MapReactiveUserDetailsService userDetailsService() {
    UserDetails user = User.builder()
            .username("john")
            .password("{noop}" + "password")
            .roles("")
            .build();
    return new MapReactiveUserDetailsService(user);
  }

  @Bean
  public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
    http.csrf().disable()
            .authorizeExchange()
            .pathMatchers("/test/health")
            .authenticated()
            .pathMatchers("/**").permitAll()
            .and().httpBasic();
    return http.build();
  }
}
    null

如何避免这一点?因为status调用将来自服务A,所以服务A到服务B需要不同的auth,服务B被传递到服务C,因为它失败了,但是对于服务B到服务C,statusendpoint不需要任何auth。

我知道我们可以创建一个没有auth头的新请求,但我想知道为什么spring security没有忽略非安全endpoint的Authorization头。

共有1个答案

谢俊英
2023-03-14

当您使用httpbasic()方法时,Spring Security用默认的anyExchange匹配器配置AuthenticationWebFilter,这意味着每个到达Spring应用程序的请求都将通过这个过滤器。此外,AuthenticationWebFilter优先于AuthorizationWebFilter(请参阅Spring Security源代码了解顺序)。

在某个时候,请求会到达这个方法(请参见Spring Security源代码):

@Override
@Deprecated
public Mono<Authentication> apply(ServerWebExchange exchange) {
    ServerHttpRequest request = exchange.getRequest();

    String authorization = request.getHeaders().getFirst(HttpHeaders.AUTHORIZATION);
    if (!StringUtils.startsWithIgnoreCase(authorization, "basic ")) {
        return Mono.empty();
    }

    String credentials = authorization.length() <= BASIC.length() ?
            "" : authorization.substring(BASIC.length(), authorization.length());
    byte[] decodedCredentials = base64Decode(credentials);
    String decodedAuthz = new String(decodedCredentials);
    String[] userParts = decodedAuthz.split(":", 2);

    if (userParts.length != 2) {
        return Mono.empty();
    }

    String username = userParts[0];
    String password = userParts[1];

    return Mono.just(new UsernamePasswordAuthenticationToken(username, password));
}

根据发送的无效标头,此方法的结果可能是:

@Override
public Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {
return this.requiresAuthenticationMatcher.matches(exchange)
    .filter( matchResult -> matchResult.isMatch())
    .flatMap( matchResult -> this.authenticationConverter.convert(exchange))
    .switchIfEmpty(chain.filter(exchange).then(Mono.empty()))
    .flatMap( token -> authenticate(exchange, chain, token))
    .onErrorResume(AuthenticationException.class, e -> this.authenticationFailureHandler
        .onAuthenticationFailure(new WebFilterExchange(exchange, chain), e));
}

绕过这一点的最简单方法是实现您自己的AuthenticationWebFilter,这将允许您更改行为。

 类似资料:
  • 我面临的挑战是,我找不到一种方法来配置安全性,使到/profilesendpoint的POST请求不受保护,而GET或PUT的请求从提供的承载令牌传递到派生的@AuthenticationPrincipal中。 我想在API中设置以下内容:POST/profile创建新用户-无安全性GET/profile/{id}按id获取用户-需要管理员权限或用户是authd POST/password/res

  • 我最初的是: 和 我试过了:1。将“通道”配置为endpoint不安全 null null 根据@Aritra Paul的回答,我也试过: 但我还是得到同样的结果。

  • 如何为执行器endpoint启用安全性,当在Spring启动1.5.4.RELEASE项目中没有Spring Security模块依赖项时 我在应用程序中添加了以下值。属性,但当我单击任何endpoint时,我会得到错误 我应该如何启用安全性?

  • 我正在做一个项目,其中为登录身份验证实现了Spring Security。现在,我们希望当用户登录时,它连接到哪个数据库取决于一个参数,即我在登录过程中传递的参数,并希望在页面上访问该参数home.jsp我的代码为: 1)登录页面url /登录 2)Spring表单登录为 3) 访问决策管理器类 网址为家.jsp /首页 有人能帮我吗?我如何将一个额外的参数从登录页面传递到主页。如果我在登录前进行

  • Im使用Spring-Security和JWT库生成令牌。当用户通过身份验证时,我得到授权令牌作为响应: 在所有教程中,我都看到作者在使用POSTMAN发送GET请求时将此令牌粘贴在授权标头中,但没有教程说明它如何在实际请求中工作。尽管在我的邮递员中,当我粘贴标题时,它是有效的,我得到了200个OK。 我想知道如何在真正的代码中包含这个标题? 编辑 这是我的前端请求。在这个调用之后,我得到带有授权

  • 我想用JAVA构建一个简单的soap客户机来调用soap JAVA web服务。所以我在我的项目中导入了WSDL,并构建了客户端。因此,如果我试图运行我的代码,我会遇到以下错误: AVVERTENZA:找不到所需的类(javax.activation.DataHandler和javax.mail.internet.MimeMultipart)。附件支持已禁用。AxisFault故障代码:{http