我正在使用spring webflux和Security。我有3个服务A、B、C和服务C中的两个endpoint,如下所示
@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();
}
}
如何避免这一点?因为status调用将来自服务A,所以服务A到服务B需要不同的auth,服务B被传递到服务C,因为它失败了,但是对于服务B到服务C,status
endpoint不需要任何auth。
我知道我们可以创建一个没有auth头的新请求,但我想知道为什么spring security没有忽略非安全endpoint的Authorization
头。
当您使用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