我已经将Spring webflux配置为使用Keycloak的Open Id连接作为IDP。
问题是,对于对我的应用程序的每次调用,oauth2客户机都调用keycloak,而不是使用安全会话。
我已经配置了我的webflux安全如下:
@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http, ServerLogoutSuccessHandler handler) {
http
.authorizeExchange(exchanges -> exchanges
.anyExchange().authenticated()
)
.securityContextRepository(new WebSessionServerSecurityContextRepository())
.oauth2Login(withDefaults());
return http.build();
}
我在Web会话中保存了一个安全上下文存储库。我在内存中配置了Web会话,如下所示:
@Bean
public ReactiveSessionRepository reactiveSessionRepository() {
return new ReactiveMapSessionRepository(new ConcurrentHashMap<>());
}
在我的日志中,我可以看到已找到安全上下文:
WebSessionServerSecurityContextRepository : Found SecurityContext 'SecurityContextImpl [Authentication=OAuth2AuthenticationToken [Principal=Name: [alex], Granted Authorities: [[ROLE_USER, SCOPE_email, SCOPE_openid, SCOPE_profile]], User Attributes: [{sub=bdc6b386-623f-4fe4-a013-2c694678797b, email_verified=true, name=Aleksandar KIRILOV, preferred_username=alex, given_name=John, family_name=Doe, email=mymail@mail.com}], Credentials=[PROTECTED], Authenticated=true, Details=null, Granted Authorities=[ROLE_USER, SCOPE_email, SCOPE_openid, SCOPE_profile]]]' in WebSession: 'org.springframework.session.web.server.session.SpringSessionWebSessionStore$SpringSessionWebSession@5a17f06f'
如果安全上下文在websession中仍然有效,请帮助如何避免调用keycloak。
此致!
1条答案
按热度按时间wlzqhblo1#
我的一位同事找到了解决办法:
在spring oauth2客户端中似乎存在时钟偏差保护,并且我已经将access_token设置为仅在一分钟后过期。
时钟偏移保护也被设置为一分钟,这意味着spring将抢先去刷新令牌,因为我们接近到期时间。