【发布时间】:2018-12-08 01:13:34
【问题描述】:
我面临来自here 和here 的相同问题,但他们没有得到答复,我有更多信息和不同的设置,因此不会重复。
我有一个 spring boot 1.5.13 应用程序,使用带有 keycloak 3.4.3 服务器的 spring 安全适配器。一切正常,但是当我在 5 分钟后向应用程序发出 ajax 请求而不重新加载页面时,响应返回 401 错误。我知道这是因为访问令牌已过期。
文档说明如下:
令牌最小生存时间 在过期之前使用 Keycloak 服务器抢先刷新活动访问令牌的时间量(以秒为单位)。当访问令牌被发送到另一个 REST 客户端时,这在评估之前可能会过期,这尤其有用。此值不应超过领域的访问令牌生命周期。这是可选的。默认值为 0 秒,因此适配器会在访问令牌过期时刷新它。
文档here
我已经更改了 keycloak.json 中 token-minimum-time-to-live 的默认值,但我不起作用。
{
"realm": "APPS",
"auth-server-url": "http://localhost:9100/auth",
"ssl-required": "external",
"resource": "WebApp",
"public-client": true,
"confidential-port": 0,
"use-resource-role-mappings": true,
"principal-attribute":"preferred_username",
"token-minimum-time-to-live" : 15
}
所以我认为我在 spring 安全适配器配置中遗漏了一些东西:
@Configuration
@EnableWebSecurity
@ComponentScan(basePackageClasses = KeycloakSecurityComponents.class)
public class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws
Exception {
KeycloakAuthenticationProvider keycloakAuthenticationProvider =
keycloakAuthenticationProvider();
keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new
SimpleAuthorityMapper());
auth.authenticationProvider(keycloakAuthenticationProvider);
}
@Bean
@Override
protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
}
@Bean
ServletListenerRegistrationBean<HttpSessionEventPublisher> getHttpSessionEventPublisher() {
return new ServletListenerRegistrationBean<HttpSessionEventPublisher>(new HttpSessionEventPublisher());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
super.configure(http);
http
.logout()
.logoutRequestMatcher(new AntPathRequestMatcher("/sso/logout"))
.and()
.authorizeRequests()
.antMatchers("/Portal/**").hasRole("App_Access")
.anyRequest().permitAll()
.and()
.headers().frameOptions().sameOrigin()
;
}
}
【问题讨论】:
标签: ajax spring-boot spring-security keycloak