Spring boot Spring Security WebFlux-“;AuthenticationCredentialsNotFoundException:未经验证;使用自定义AuthenticationEntryPoint
我正在尝试在一个反应式Spring引导应用程序中配置一个Spring安全性,该应用程序具有一个Vuejs前端,在未经身份验证时将用户重定向到外部OpenID提供程序(用于身份验证)。在用户通过OpenID提供程序进行身份验证并重定向回应用程序(前端)后,将根据OpenID提供程序的响应创建一个UsernamePasswordAuthenticationToken(身份验证),并手动进行身份验证 但是,执行此操作时,应用程序似乎无法检测到用户已通过身份验证,因为AuthenticationEntryPoint仍在调用,但出现以下异常,并且由于未通过身份验证,preAuthenticationFilter(稍后显示)仍在重复调用Spring boot Spring Security WebFlux-“;AuthenticationCredentialsNotFoundException:未经验证;使用自定义AuthenticationEntryPoint,spring-boot,spring-security,openid,external,spring-webflux,Spring Boot,Spring Security,Openid,External,Spring Webflux,我正在尝试在一个反应式Spring引导应用程序中配置一个Spring安全性,该应用程序具有一个Vuejs前端,在未经身份验证时将用户重定向到外部OpenID提供程序(用于身份验证)。在用户通过OpenID提供程序进行身份验证并重定向回应用程序(前端)后,将根据OpenID提供程序的响应创建一个UsernamePasswordAuthenticationToken(身份验证),并手动进行身份验证 但是,执行此操作时,应用程序似乎无法检测到用户已通过身份验证,因为AuthenticationEntr
org.springframework.security.authentication.AuthenticationCredentialsNotFoundException: Not Authenticated
at org.springframework.security.web.server.authorization.ExceptionTranslationWebFilter.commenceAuthentication(ExceptionTranslationWebFilter.java:72)
at org.springframework.security.web.server.authorization.ExceptionTranslationWebFilter.lambda$filter$1(ExceptionTranslationWebFilter.java:44)
at reactor.core.publisher.Mono.lambda$onErrorResume$25(Mono.java:3146)
at reactor.core.publisher.FluxOnErrorResume$ResumeSubscriber.onError(FluxOnErrorResume.java:88)
at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onError(Operators.java:1748)
at reactor.core.publisher.MonoFlatMap$FlatMapMain.onError(MonoFlatMap.java:165)
at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onError(Operators.java:1748)
at reactor.core.publisher.Operators.error(Operators.java:181)
at reactor.core.publisher.MonoError.subscribe(MonoError.java:52)
at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
at reactor.core.publisher.Mono.subscribe(Mono.java:3852)
at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onComplete(FluxSwitchIfEmpty.java:75)
at reactor.core.publisher.FluxFilter$FilterSubscriber.onComplete(FluxFilter.java:160)
at reactor.core.publisher.FluxDefaultIfEmpty$DefaultIfEmptySubscriber.onComplete(FluxDefaultIfEmpty.java:98)
at reactor.core.publisher.MonoNext$NextSubscriber.onComplete(MonoNext.java:96)
at reactor.core.publisher.MonoNext$NextSubscriber.onNext(MonoNext.java:77)
at reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.innerNext(FluxConcatMap.java:275)
at reactor.core.publisher.FluxConcatMap$ConcatMapInner.onNext(FluxConcatMap.java:849)
at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1515)
at reactor.core.publisher.MonoFlatMap$FlatMapInner.onNext(MonoFlatMap.java:241)
at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1515)
at reactor.core.publisher.FluxDefaultIfEmpty$DefaultIfEmptySubscriber.onComplete(FluxDefaultIfEmpty.java:100)
at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onComplete(FluxMapFuseable.java:144)
at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onComplete(FluxMapFuseable.java:144)
at reactor.core.publisher.FluxFilterFuseable$FilterFuseableSubscriber.onComplete(FluxFilterFuseable.java:166)
at reactor.core.publisher.MonoFlatMap$FlatMapMain.secondComplete(MonoFlatMap.java:189)
at reactor.core.publisher.MonoFlatMap$FlatMapInner.onComplete(MonoFlatMap.java:260)
at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:141)
at reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:114)
at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1515)
at reactor.core.publisher.MonoProcessor.subscribe(MonoProcessor.java:457)
at reactor.core.publisher.MonoMap.subscribe(MonoMap.java:55)
at reactor.core.publisher.MonoFlatMap.subscribe(MonoFlatMap.java:60)
at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:150)
at reactor.core.publisher.FluxFilterFuseable$FilterFuseableSubscriber.onNext(FluxFilterFuseable.java:113)
at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2071)
at reactor.core.publisher.FluxFilterFuseable$FilterFuseableSubscriber.request(FluxFilterFuseable.java:185)
at reactor.core.publisher.MonoFlatMap$FlatMapMain.onSubscribe(MonoFlatMap.java:103)
at reactor.core.publisher.FluxFilterFuseable$FilterFuseableSubscriber.onSubscribe(FluxFilterFuseable.java:82)
at reactor.core.publisher.MonoCurrentContext.subscribe(MonoCurrentContext.java:35)
at reactor.core.publisher.MonoFilterFuseable.subscribe(MonoFilterFuseable.java:47)
at reactor.core.publisher.MonoFlatMap.subscribe(MonoFlatMap.java:60)
at reactor.core.publisher.MonoFilterFuseable.subscribe(MonoFilterFuseable.java:47)
at reactor.core.publisher.MonoMapFuseable.subscribe(MonoMapFuseable.java:59)
at reactor.core.publisher.MonoMapFuseable.subscribe(MonoMapFuseable.java:59)
at reactor.core.publisher.MonoDefaultIfEmpty.subscribe(MonoDefaultIfEmpty.java:37)
at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:150)
at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:121)
at reactor.core.publisher.FluxFilterFuseable$FilterFuseableSubscriber.onNext(FluxFilterFuseable.java:113)
at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2071)
at reactor.core.publisher.FluxFilterFuseable$FilterFuseableSubscriber.request(FluxFilterFuseable.java:185)
at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.request(FluxMapFuseable.java:162)
at reactor.core.publisher.MonoFlatMap$FlatMapMain.onSubscribe(MonoFlatMap.java:103)
at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onSubscribe(FluxMapFuseable.java:90)
at reactor.core.publisher.FluxFilterFuseable$FilterFuseableSubscriber.onSubscribe(FluxFilterFuseable.java:82)
at reactor.core.publisher.MonoJust.subscribe(MonoJust.java:54)
at reactor.core.publisher.MonoFilterFuseable.subscribe(MonoFilterFuseable.java:47)
at reactor.core.publisher.MonoMapFuseable.subscribe(MonoMapFuseable.java:59)
at reactor.core.publisher.MonoFlatMap.subscribe(MonoFlatMap.java:60)
at reactor.core.publisher.Mono.subscribe(Mono.java:3852)
at reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.drain(FluxConcatMap.java:442)
at reactor.core.publisher.FluxConcatMap$ConcatMapImmediate.onSubscribe(FluxConcatMap.java:212)
at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:139)
at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:63)
at reactor.core.publisher.FluxConcatMap.subscribe(FluxConcatMap.java:121)
at reactor.core.publisher.MonoNext.subscribe(MonoNext.java:40)
at reactor.core.publisher.MonoDefaultIfEmpty.subscribe(MonoDefaultIfEmpty.java:37)
at reactor.core.publisher.MonoFilter.subscribe(MonoFilter.java:46)
at reactor.core.publisher.MonoSwitchIfEmpty.subscribe(MonoSwitchIfEmpty.java:44)
at reactor.core.publisher.MonoFlatMap.subscribe(MonoFlatMap.java:60)
at reactor.core.publisher.MonoSwitchIfEmpty.subscribe(MonoSwitchIfEmpty.java:44)
at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
at reactor.core.publisher.MonoOnErrorResume.subscribe(MonoOnErrorResume.java:44)
at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
at reactor.core.publisher.Mono.subscribe(Mono.java:3852)
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.drain(MonoIgnoreThen.java:172)
at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:56)
at reactor.core.publisher.Mono.subscribe(Mono.java:3852)
at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onComplete(FluxSwitchIfEmpty.java:75)
at reactor.core.publisher.FluxFilter$FilterSubscriber.onComplete(FluxFilter.java:160)
at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onComplete(FluxSwitchIfEmpty.java:78)
at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2073)
at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.set(Operators.java:1879)
at reactor.core.publisher.Operators$MultiSubscriptionSubscriber.onSubscribe(Operators.java:1753)
at reactor.core.publisher.MonoJust.subscribe(MonoJust.java:54)
at reactor.core.publisher.Mono.subscribe(Mono.java:3852)
at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onComplete(FluxSwitchIfEmpty.java:75)
at reactor.core.publisher.MonoNext$NextSubscriber.onComplete(MonoNext.java:96)
at reactor.core.publisher.FluxFilter$FilterSubscriber.onComplete(FluxFilter.java:160)
at reactor.core.publisher.FluxFlatMap$FlatMapMain.checkTerminated(FluxFlatMap.java:794)
at reactor.core.publisher.FluxFlatMap$FlatMapMain.drainLoop(FluxFlatMap.java:560)
at reactor.core.publisher.FluxFlatMap$FlatMapMain.drain(FluxFlatMap.java:540)
at reactor.core.publisher.FluxFlatMap$FlatMapMain.onComplete(FluxFlatMap.java:426)
at reactor.core.publisher.FluxIterable$IterableSubscription.slowPath(FluxIterable.java:265)
at reactor.core.publisher.FluxIterable$IterableSubscription.request(FluxIterable.java:201)
at reactor.core.publisher.FluxFlatMap$FlatMapMain.onSubscribe(FluxFlatMap.java:335)
at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:139)
at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:63)
at reactor.core.publisher.FluxFlatMap.subscribe(FluxFlatMap.java:97)
at reactor.core.publisher.FluxFilter.subscribe(FluxFilter.java:53)
at reactor.core.publisher.MonoNext.subscribe(MonoNext.java:40)
at reactor.core.publisher.MonoSwitchIfEmpty.subscribe(MonoSwitchIfEmpty.java:44)
at reactor.core.publisher.MonoFilter.subscribe(MonoFilter.java:46)
at reactor.core.publisher.MonoSwitchIfEmpty.subscribe(MonoSwitchIfEmpty.java:44)
at reactor.core.publisher.MonoMap.subscribe(MonoMap.java:55)
at reactor.core.publisher.MonoFlatMap.subscribe(MonoFlatMap.java:60)
at reactor.core.publisher.MonoFlatMap.subscribe(MonoFlatMap.java:60)
at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:150)
at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1515)
at reactor.core.publisher.FluxDefaultIfEmpty$DefaultIfEmptySubscriber.onComplete(FluxDefaultIfEmpty.java:100)
at reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:136)
at reactor.core.publisher.FluxMap$MapSubscriber.onComplete(FluxMap.java:136)
at reactor.core.publisher.FluxFilter$FilterSubscriber.onComplete(FluxFilter.java:160)
at reactor.core.publisher.FluxMap$MapConditionalSubscriber.onComplete(FluxMap.java:262)
at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1516)
at reactor.core.publisher.MonoProcessor.subscribe(MonoProcessor.java:457)
at reactor.core.publisher.MonoMap.subscribe(MonoMap.java:52)
at reactor.core.publisher.MonoFilter.subscribe(MonoFilter.java:46)
at reactor.core.publisher.MonoMap.subscribe(MonoMap.java:55)
at reactor.core.publisher.MonoMap.subscribe(MonoMap.java:55)
at reactor.core.publisher.MonoDefaultIfEmpty.subscribe(MonoDefaultIfEmpty.java:37)
at reactor.core.publisher.MonoFlatMap.subscribe(MonoFlatMap.java:60)
at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
at reactor.core.publisher.Mono.subscribe(Mono.java:3852)
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.drain(MonoIgnoreThen.java:172)
at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:56)
at reactor.core.publisher.Mono.subscribe(Mono.java:3852)
at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onComplete(FluxSwitchIfEmpty.java:75)
at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:141)
at reactor.core.publisher.FluxFilterFuseable$FilterFuseableSubscriber.onNext(FluxFilterFuseable.java:113)
at reactor.core.publisher.Operators$ScalarSubscription.request(Operators.java:2071)
at reactor.core.publisher.FluxFilterFuseable$FilterFuseableSubscriber.request(FluxFilterFuseable.java:185)
at reactor.core.publisher.MonoFlatMap$FlatMapMain.onSubscribe(MonoFlatMap.java:103)
at reactor.core.publisher.FluxFilterFuseable$FilterFuseableSubscriber.onSubscribe(FluxFilterFuseable.java:82)
at reactor.core.publisher.MonoJust.subscribe(MonoJust.java:54)
at reactor.core.publisher.MonoFilterFuseable.subscribe(MonoFilterFuseable.java:47)
at reactor.core.publisher.MonoFlatMap.subscribe(MonoFlatMap.java:60)
at reactor.core.publisher.MonoSwitchIfEmpty.subscribe(MonoSwitchIfEmpty.java:44)
at reactor.core.publisher.MonoFlatMap.subscribe(MonoFlatMap.java:60)
at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
at reactor.core.publisher.MonoSubscriberContext.subscribe(MonoSubscriberContext.java:47)
at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
at reactor.core.publisher.MonoSubscriberContext.subscribe(MonoSubscriberContext.java:47)
at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:150)
at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:121)
at reactor.core.publisher.FluxMapFuseable$MapFuseableSubscriber.onNext(FluxMapFuseable.java:121)
at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1515)
at reactor.core.publisher.MonoFlatMap$FlatMapInner.onNext(MonoFlatMap.java:241)
at reactor.core.publisher.Operators$MonoSubscriber.complete(Operators.java:1515)
at reactor.core.publisher.MonoCollectList$MonoCollectListSubscriber.onComplete(MonoCollectList.java:121)
at reactor.core.publisher.FluxIterable$IterableSubscription.fastPath(FluxIterable.java:333)
at reactor.core.publisher.FluxIterable$IterableSubscription.request(FluxIterable.java:198)
at reactor.core.publisher.MonoCollectList$MonoCollectListSubscriber.onSubscribe(MonoCollectList.java:72)
at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:139)
at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:63)
at reactor.core.publisher.MonoCollectList.subscribe(MonoCollectList.java:40)
at reactor.core.publisher.MonoFlatMap$FlatMapMain.onNext(MonoFlatMap.java:150)
at reactor.core.publisher.FluxSwitchIfEmpty$SwitchIfEmptySubscriber.onNext(FluxSwitchIfEmpty.java:67)
at reactor.core.publisher.MonoNext$NextSubscriber.onNext(MonoNext.java:76)
at reactor.core.publisher.FluxFilterWhen$FluxFilterWhenSubscriber.drain(FluxFilterWhen.java:295)
at reactor.core.publisher.FluxFilterWhen$FluxFilterWhenSubscriber.onNext(FluxFilterWhen.java:134)
at reactor.core.publisher.FluxIterable$IterableSubscription.slowPath(FluxIterable.java:243)
at reactor.core.publisher.FluxIterable$IterableSubscription.request(FluxIterable.java:201)
at reactor.core.publisher.FluxFilterWhen$FluxFilterWhenSubscriber.onSubscribe(FluxFilterWhen.java:194)
at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:139)
at reactor.core.publisher.FluxIterable.subscribe(FluxIterable.java:63)
at reactor.core.publisher.FluxFilterWhen.subscribe(FluxFilterWhen.java:69)
at reactor.core.publisher.MonoNext.subscribe(MonoNext.java:40)
at reactor.core.publisher.MonoSwitchIfEmpty.subscribe(MonoSwitchIfEmpty.java:44)
at reactor.core.publisher.MonoFlatMap.subscribe(MonoFlatMap.java:60)
at reactor.core.publisher.MonoMapFuseable.subscribe(MonoMapFuseable.java:59)
at reactor.core.publisher.MonoMapFuseable.subscribe(MonoMapFuseable.java:59)
at reactor.core.publisher.MonoFlatMap.subscribe(MonoFlatMap.java:60)
at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
at reactor.core.publisher.MonoPeekTerminal.subscribe(MonoPeekTerminal.java:61)
at reactor.core.publisher.MonoPeekFuseable.subscribe(MonoPeekFuseable.java:74)
at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52)
at reactor.core.publisher.MonoOnErrorResume.subscribe(MonoOnErrorResume.java:44)
at reactor.core.publisher.MonoOnErrorResume.subscribe(MonoOnErrorResume.java:44)
at reactor.core.publisher.MonoPeekTerminal.subscribe(MonoPeekTerminal.java:61)
at reactor.core.publisher.MonoOnErrorResume.subscribe(MonoOnErrorResume.java:44)
at reactor.core.publisher.Mono.subscribe(Mono.java:3852)
at reactor.core.publisher.MonoIgnoreThen$ThenIgnoreMain.drain(MonoIgnoreThen.java:172)
at reactor.core.publisher.MonoIgnoreThen.subscribe(MonoIgnoreThen.java:56)
at reactor.core.publisher.MonoPeekFuseable.subscribe(MonoPeekFuseable.java:70)
at reactor.core.publisher.MonoPeekTerminal.subscribe(MonoPeekTerminal.java:61)
at reactor.netty.http.server.HttpServerHandle.onStateChange(HttpServerHandle.java:64)
at reactor.netty.tcp.TcpServerBind$ChildObserver.onStateChange(TcpServerBind.java:226)
at reactor.netty.http.server.HttpServerOperations.onInboundNext(HttpServerOperations.java:442)
at reactor.netty.channel.ChannelOperationsHandler.channelRead(ChannelOperationsHandler.java:91)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352)
at reactor.netty.http.server.HttpTrafficHandler.channelRead(HttpTrafficHandler.java:161)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352)
at io.netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:438)
at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:328)
at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:302)
at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:253)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)
at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352)
at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1421)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374)
at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360)
at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:930)
at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:163)
at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:697)
at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:632)
at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:549)
at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:511)
at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:918)
at io.netty.util.internal.ThreadExecutorMap$2.run(ThreadExecutorMap.java:74)
at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30)
at java.base/java.lang.Thread.run(Thread.java:835)
Caused by: org.springframework.security.access.AccessDeniedException: Access Denied
at org.springframework.security.authorization.ReactiveAuthorizationManager.lambda$verify$1(ReactiveAuthorizationManager.java:53)
at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:44)
... 214 more
到目前为止,我已经通过使用以下AuthenticationEntryPoint将用户重定向到外部OpenID提供程序进行身份验证。如果用户能够登录到OpenID提供者,也可以重定向回前端
@Component
public class OpenIDAuthenticationEntryPoint implements ServerAuthenticationEntryPoint {
@Autowired
private OpenIdUtil openIdUtil;
@Override
public Mono<Void> commence(ServerWebExchange serverWebExchange, AuthenticationException e) {
e.printStackTrace();
return openIdUtil.authRequest(serverWebExchange); // invoke openid function
}
}
我尝试了各种方法,例如手动将身份验证设置到WebSessionServerSecurityContextRepository中,但仍然无法对用户进行身份验证,因为AuthenticationEntryPoint一直在为来自前端的每个请求获取调用
ServerSecurityContextRepository serverSecurityContextRepository = new WebSessionServerSecurityContextRepository();
return serverSecurityContextRepository.save(exchange,
new SecurityContextImpl(authentication))
.subscriberContext(ReactiveSecurityContextHolder.withAuthentication(authentication));
希望有人能提供一些见解/指导,说明为什么认证被视为未“认证”与预期结果不同的是,用户将能够访问前端,而无需通过AuthenticationEntryPoint反复来回重定向前端和OpenID提供程序,很难知道哪里出了问题,因为我无法运行您的代码,而您正在混合命令式编程和反应式编程 您的代码有几个问题,我已经在您原始问题下面的评论中指出了这些问题 我将试着更具体地解释什么是错的
public Mono<Void> authRequest(ServerWebExchange serverWebExchange) {
// Here we are in the imperative world and everything is fine, we get some
// stuff and set some parameters.
System.out.println("AUTH-REQUEST");
String returnToUrl = "...";
List discoveries = manager.discover( ... );
DiscoveryInformation discovered = manager.associate(discoveries);
// Here we now jump into the reactive world, and we start working with Monos.
// This means that we have to start chaining things, because we are going to
// declare what we want our service to do when we eventually get data in our
// Mono.
return serverWebExchange.getSession()
.map(session -> {
AuthRequest authReq = manager.authenticate(discovered, returnToUrl);
serverWebExchange.getResponse()
.setStatusCode(HttpStatus.TEMPORARY_REDIRECT);
serverWebExchange.getResponse()
.getHeaders()
.setLocation(URI.create(authReq.getDestinationUrl(true)));
session.getAttributes().put("openid-disc", discovered);
return serverWebExchange.getResponse().setComplete();
})
}
公共Mono authRequest(服务器WebExchange服务器WebExchange){
//我们现在处于命令式世界,一切都很好,我们得到了一些
//填充并设置一些参数。
System.out.println(“AUTH-REQUEST”);
字符串returnToUrl=“…”;
列表发现=manager.discover(…);
DiscoveryInformation discovered=manager.associate(discoveries);
//在这里,我们现在跳入反应世界,开始与Monos合作。
//这意味着我们必须开始链接东西,因为我们将
//声明当我们最终在数据库中获取数据时,我们希望服务做什么
//莫诺。
返回serverWebExchange.getSession()
.map(会话->{
AuthRequest authReq=manager.authenticate(已发现,返回ToURL);
serverWebExchange.getResponse()
.setStatusCode(HttpStatus.TEMPORARY_重定向);
serverWebExchange.getResponse()
.getHeaders()
.setLocation(URI.create(authReq.getDestinationUrl(true));
session.getAttributes().put(“openid光盘”,已发现);
返回serverWebExchange.getResponse().setComplete();
})
}
我希望您能通过这个示例更清楚地理解这个概念。很难知道哪里出了问题,因为我无法运行您的代码,而您正在混合命令式编程和反应式编程 您的代码有几个问题,我已经在您原始问题下面的评论中指出了这些问题 我将试着更具体地解释什么是错的
public Mono<Void> authRequest(ServerWebExchange serverWebExchange) {
// Here we are in the imperative world and everything is fine, we get some
// stuff and set some parameters.
System.out.println("AUTH-REQUEST");
String returnToUrl = "...";
List discoveries = manager.discover( ... );
DiscoveryInformation discovered = manager.associate(discoveries);
// Here we now jump into the reactive world, and we start working with Monos.
// This means that we have to start chaining things, because we are going to
// declare what we want our service to do when we eventually get data in our
// Mono.
return serverWebExchange.getSession()
.map(session -> {
AuthRequest authReq = manager.authenticate(discovered, returnToUrl);
serverWebExchange.getResponse()
.setStatusCode(HttpStatus.TEMPORARY_REDIRECT);
serverWebExchange.getResponse()
.getHeaders()
.setLocation(URI.create(authReq.getDestinationUrl(true)));
session.getAttributes().put("openid-disc", discovered);
return serverWebExchange.getResponse().setComplete();
})
}
公共Mono authRequest(服务器WebExchange服务器WebExchange){
//我们现在处于命令式世界,一切都很好,我们得到了一些
//填充并设置一些参数。
System.out.println(“AUTH-REQUEST”);
字符串returnToUrl=“…”;
列表发现=manager.discover(…);
DiscoveryInformation discovered=manager.associate(discoveries);
//在这里,我们现在跳入反应世界,开始与Monos合作。
//这意味着我们必须开始链接东西,因为我们将
//声明当我们最终在数据库中获取数据时,我们希望服务做什么
//莫诺。
返回serverWebExchange.getSession()
.map(会话->{
AuthRequest authReq=manager.authenticate(已发现,返回ToURL);
serverWebExchange.getResponse()
.setStatusCode(HttpStatus.TEMPORARY_重定向);
serverWebExchange.getResponse()
.getHeaders()
.setLocation(URI.create(authReq.getDestinationUrl(true));
session.getAttributes().put(“openid光盘”,已发现);
返回serverWebExchange.getResponse().setComplete();
})
}
我希望您能通过这个示例更清楚地理解这个概念。我认为您需要先了解oauth2流在spring中是如何工作的,然后在了解了OpenId在spring中的oauth2流中是如何使用的之后,再了解一下OpenId。此外,在使用webflux时,您必须编写代码,不应在应用程序中订阅。我还强烈建议您花30分钟阅读的技术概述,以便了解UserDetails服务的功能、authenticationManager的功能、过滤器以及如何配置oauth2流,所以你不需要编写自己的自定义过滤器。@ThomasAndolf谢谢,我已经阅读了文档,但是如果我错了,请纠正我,因为我对springwebflux还相当陌生。oauth2流中的OpenID是指我正在集成的OIDC而不是OpenID2.0协议。因此,这就是我创建自定义筛选器的原因,该筛选器将使用以下方法对身份验证进行身份验证:Authentication Authentication=new UsernamePasswordAuthenticationToken(user,null,updateAuthorities)代码>另外,据我所知,自定义反应式身份验证ma的身份验证成功
@Configuration
@EnableWebFluxSecurity
@RequiredArgsConstructor
public class SecurityConfiguration {
@Autowired
private PreAuthenticationConverter preAuthenticationConverter;
@Autowired
private OpenIDAuthenticationEntryPoint openIDAuthenticationEntryPoint;
@Autowired
private OpenIDReactiveAuthenticationManager openIDReactiveAuthenticationManager;
SecurityWebFilterChain securityWebFilterChainStg(ServerHttpSecurity http) {
return http.cors()
.and()
.csrf().disable()
.authorizeExchange()
.pathMatchers("/actuator/health", "/actuator/info").permitAll()
.anyExchange().authenticated()
.and()
.addFilterAt(preAuthenticationFilter(), SecurityWebFiltersOrder.AUTHENTICATION)
.exceptionHandling().authenticationEntryPoint(openIDAuthenticationEntryPoint)
.and()
.build();
}
@Bean
CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration configuration = new CorsConfiguration();
configuration.setAllowedOrigins(Collections.singletonList("*"));
configuration.addAllowedMethod("GET");
configuration.addAllowedMethod("POST");
configuration.addAllowedMethod("DELETE");
configuration.addAllowedHeader("authorization");
configuration.addAllowedHeader("content-type");
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
source.registerCorsConfiguration("/**", configuration);
return source;
}
private AuthenticationWebFilter preAuthenticationFilter(){
AuthenticationWebFilter preAuthenticationFilter = new AuthenticationWebFilter(openIDReactiveAuthenticationManager);
preAuthenticationFilter.setServerAuthenticationConverter(preAuthenticationConverter);
return preAuthenticationFilter;
}
}
ServerSecurityContextRepository serverSecurityContextRepository = new WebSessionServerSecurityContextRepository();
return serverSecurityContextRepository.save(exchange,
new SecurityContextImpl(authentication))
.subscriberContext(ReactiveSecurityContextHolder.withAuthentication(authentication));
public Mono<Void> authRequest(ServerWebExchange serverWebExchange) {
// Here we are in the imperative world and everything is fine, we get some
// stuff and set some parameters.
System.out.println("AUTH-REQUEST");
String returnToUrl = "...";
List discoveries = manager.discover( ... );
DiscoveryInformation discovered = manager.associate(discoveries);
// Here we now jump into the reactive world, and we start working with Monos.
// This means that we have to start chaining things, because we are going to
// declare what we want our service to do when we eventually get data in our
// Mono.
return serverWebExchange.getSession()
.map(session -> {
AuthRequest authReq = manager.authenticate(discovered, returnToUrl);
serverWebExchange.getResponse()
.setStatusCode(HttpStatus.TEMPORARY_REDIRECT);
serverWebExchange.getResponse()
.getHeaders()
.setLocation(URI.create(authReq.getDestinationUrl(true)));
session.getAttributes().put("openid-disc", discovered);
return serverWebExchange.getResponse().setComplete();
})
}