Dav*_*d V 5 spring spring-security spring-boot spring-security-oauth2
我们有一个使用 Spring Security、OAuth2 登录和 Zuul 路由的基于 Spring Boot 的网关。它还使用 Spring Session 在 Redis 中存储会话。此网关在会话中存储 OAuth2 令牌并将 OAuth2 承载令牌转发到后端服务。
我们有一个问题,即用户经常被注销。这似乎大约每小时发生一次。我们甚至不太确定是什么导致了所有不同的工具到位。
我们在浏览器中的会话 cookie 会在更长的时间内过期。所以我怀疑是 Spring 使会话无效,或者 OAuth2 令牌过期。
从代码的快速检查来看,似乎OAuth2TokenRelayFilter支持刷新令牌。这样对吗?
如何找出造成这种情况的原因并解决它?
作为参考,我们正在使用这些版本:
以下是一些相关的片段。
我们的网页安全配置。
@Configuration
@EnableWebSecurity
@EnableOAuth2Sso
@Order(SecurityProperties.BASIC_AUTH_ORDER - 2)
@Profile("!security-disabled")
public class WebSecurityConfig extends WebSecurityConfigurerAdapter
{
@Override
public void configure(HttpSecurity http) throws Exception {
// @formatter:off
http
.authorizeRequests()
.antMatchers("/login", "/login/**", "/favicon.ico").permitAll()
.antMatchers("/signout").authenticated()
.anyRequest().hasAnyRole("ADMIN", "MEMBER")
.and()
.csrf()
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
.and()
.httpBasic()
.disable()
.formLogin()
.disable()
.logout()
.logoutUrl("/signout")
.deleteCookies("SESSION")
.and()
// @formatter:on
}
Run Code Online (Sandbox Code Playgroud)
API 路径的安全配置。
@Configuration
@Order(SecurityProperties.BASIC_AUTH_ORDER - 2 - 10)
@Profile("!security-disabled")
public class ApiSecurityConfig extends WebSecurityConfigurerAdapter
{
public void configure(HttpSecurity http) throws Exception {
// @formatter:off
http.requestMatchers()
.antMatchers("/api/**")
.and()
.authorizeRequests()
.antMatchers("/**").hasAnyRole("ADMIN", "MEMBER")
.and()
.csrf()
.csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse())
.and()
.headers()
.frameOptions().sameOrigin()
.and()
.httpBasic()
.disable()
.formLogin()
.disable()
.logout()
.disable()
.exceptionHandling().authenticationEntryPoint(new Http403ForbiddenEntryPoint());
// @formatter:on
}
}
Run Code Online (Sandbox Code Playgroud)
更新
我们已经对 Spring 内部进行了一些调试。首先,我们发现我们缺少一个OAuth2RestTemplate. 根据OAuth2 启动文档,我们找到了如何添加它:
@Bean
public OAuth2RestTemplate oauth2RestTemplate(
OAuth2ClientContext oauth2ClientContext,
OAuth2ProtectedResourceDetails details)
{
return new OAuth2RestTemplate(details, oauth2ClientContext);
}
Run Code Online (Sandbox Code Playgroud)
这现在在OAuth2TokenRelayFilter调用时抛出异常restTemplate.getAccessToken().getValue();。
需要重定向才能获得用户批准
该异常是从AuthorizationCodeAccessTokenProvider抛出的。
OAuth2TokenRelayFilter
OAuth2TokenRelayFilter是一个预类型过滤器,它使用ACCESS_TOKEN和TOKEN_TYPE设置上下文,这些上下文将用于进一步的身份验证。它使用方法验证令牌getAccessToken(),并以 401 状态响应“无法获取有效的访问令牌”。
您可以检查令牌的有效性,并且刷新令牌是否正确配置为grant_type作为刷新令牌,因为当访问令牌过期时,客户端使用刷新令牌授予类型将刷新令牌交换为访问令牌,这允许客户端继续拥有有效的访问令牌,无需与用户进一步交互。
如果您想禁用OAuth2TokenRelayFilter,您可以使用以下命令
zuul.OAuth2TokenRelayFilter.pre.disable=true
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
588 次 |
| 最近记录: |