Keycloak: обновить токен доступа после истечения срока действия для вызовов ajax - PullRequest
0 голосов
/ 29 июня 2018

Я столкнулся с той же проблемой, что и здесь и здесь , но они не получили ответа, и у меня есть немного больше информации и другой настройки, поэтому она не дублируется.

У меня есть приложение Spring Boot 1.5.13, использующее адаптер Spring Security с сервером Keycloak 3.4.3. Все работает нормально, но когда я делаю ajax-запрос к приложению через 5 минут без перезагрузки страницы, ответ возвращается с ошибкой 401. Я знаю, что это потому, что срок действия токена истек.

Документация гласит следующее:

Токен-минимум времени к жизни Время в секундах для упреждающего обновления активного маркера доступа на сервере Keycloak до его истечения. Это особенно полезно, когда маркер доступа отправляется другому клиенту REST, где он может истечь до оценки. Это значение никогда не должно превышать срок жизни маркера доступа области. Это НЕОБЯЗАТЕЛЬНО. Значение по умолчанию равно 0 секундам, поэтому адаптер обновит токен доступа, только если срок его действия истек.

Документация здесь

Я изменил значение по умолчанию token-minimum-time-to-live в keycloak.json, но у меня не работает.

{
"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
}

Так что я думаю, что что-то упущено в конфигурации адаптера пружинной безопасности:

@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()
    ;
  }
}
...