Вопрос или проблема
Я интегрирую Okta с моим приложением Spring Boot для аутентификации пользователей с использованием входа через OAuth2 и OIDC. Я установил следующие политики сессий в Okta
Ожидается, что если пользователь остается неактивным в браузере в течение 1 минуты, его следует автоматически выйти из системы и предложить войти снова через Okta. Однако этого не происходит, как ожидалось. Даже после 1 минуты неактивности пользователи остаются в системе.
Код Spring Boot
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http
.oauth2ResourceServer(oauth2 -> oauth2
.jwt(Customizer.withDefaults())
)
.authorizeHttpRequests(authorizeRequests ->
authorizeRequests
.anyRequest().authenticated()
)
.oauth2Login(oauth2 ->
oauth2
.userInfoEndpoint(userInfo ->
userInfo
.oidcUserService(oidcUserService())
)
);
return http.build();
}
Контроллер
`@RestController
public class UserController {
@GetMapping("/")
public String getToken(@RegisteredOAuth2AuthorizedClient OAuth2AuthorizedClient authorizedClient) {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
System.out.println("Authorities: " + authentication.getAuthorities());
return "Authorities: " + authentication.getAuthorities();
}
@PreAuthorize("hasAuthority('PAD')")
@GetMapping("/user")
public String getUser() {
return "Hello World";
}
@PreAuthorize("hasAuthority('CAD')")
@GetMapping("/usertest")
public String getUserTest() {
return "Hello World";
}`
Не хватает ли мне чего-то в моей конфигурации Spring Boot, чтобы применить таймаут сессии Okta? Должен ли Spring Boot управлять сессиями иначе или это полностью контролируется Okta? Как я могу убедиться, что после 1 минуты неактивности пользователи вынуждены снова войти в систему? Чтобы настроить ваше приложение Spring Boot так, чтобы оно полагалось исключительно на настройки таймаута сессии Okta для аннулирования сессий.
Ответ или решение
Проблема: Настройка тайм-аута сеанса Okta в Spring Boot
Вы интегрируете Okta с вашим приложением Spring Boot для аутентификации пользователей с помощью OAuth2 и OIDC. Однако вы столкнулись с проблемой: пользователи не выходят из системы автоматически после 1 минуты бездействия, хотя вы настроили соответствующие политики сеанса в Okta. Давайте рассмотрим решения этой проблемы.
Действия Okta и Spring Boot: Чьи это обязанности?
Okta управляет аутентификацией и сессиями пользователей, однако ваша Spring Boot конфигурация должна правильно взаимодействовать с Okta и учитывать настройки тайм-аута. Давайте обсудим, как правильно настроить эти компоненты.
1. Проверка настроек Okta
Для начала необходимо убедиться, что в вашей конфигурации Okta параметры тайм-аута для бездействия правильно заданы. Войдите в вашу панель управления Okta и перейдите в раздел Security > Authentication > Sign-On Policies. Убедитесь, что:
- Session Lifetime установлен на значение, соответствующее вашим ожиданиям (например, 1 минута).
- Idle Session Timeout так же установлен правильно.
Дополнительно стоит проверить параметры End-Session Endpoint, если они у вас есть.
2. Конфигурация Spring Boot
Ваш текущий фрагмент кода с конфигурацией Spring Security выглядит в целом правильно, однако необходимо удостовериться, что Spring Boot обрабатывает сессии с учетом настроек Okta. Проверьте следующее:
-
Убедитесь, что вы используете правильные библиотеки Spring Security для работы с OAuth2 и OIDC. Например, используйте
spring-security-oauth2-client
иspring-security-oauth2-resource-server
. -
Если вы используете Session Management в Spring, убедитесь, что session management настроен правильно:
http.sessionManagement()
.invalidSessionStrategy(new SimpleRedirectInvalidSessionStrategy("/login?error=sessionExpired"))
.maximumSessions(1)
.expiredUrl("/login?error=sessionExpired");
Этот код управляет сессиями и перенаправляет пользователя на страницу входа после истечения срока действия сессии.
3. Обработка сессий
Поскольку Okta управляет аутентификацией, Spring Boot должен следить за сессиями корректно. Убедитесь, что ваш application.properties или application.yml настроен на правильное использование:
spring.security.oauth2.client.registration.okta.client-id=<your-client-id>
spring.security.oauth2.client.registration.okta.client-secret=<your-client-secret>
spring.security.oauth2.client.registration.okta.scope=openid, profile, email
spring.security.oauth2.client.provider.okta.authorization-uri=https://<your-okta-domain>/oauth2/default/v1/authorize
spring.security.oauth2.client.provider.okta.token-uri=https://<your-okta-domain>/oauth2/default/v1/token
spring.security.oauth2.client.provider.okta.user-info-uri=https://<your-okta-domain>/oauth2/default/v1/userinfo
4. Интеграция с Frontend
Если ваше приложение использует клиентский интерфейс, убедитесь, что он правильно обрабатывает тайм-ауты сессий. Вам может потребоваться использовать JavaScript для проверки активности пользователя и, если необходимо, инициировать выход из системы.
let sessionTimeout;
function resetTimer() {
clearTimeout(sessionTimeout);
sessionTimeout = setTimeout(() => {
alert("Ваш сеанс истек по бездействию. Пожалуйста, войдите снова.");
window.location.href = '/login'; // Переход на страницу входа
}, 60000); // 60 секунд
}
window.onload = resetTimer;
window.onmousemove = resetTimer;
window.onkeypress = resetTimer;
Заключение
Если после выполнения всех вышеперечисленных шагов проблема не решена, рекомендуется проверить логи на предмет возможных ошибок или предупреждений, связанных с аутентификацией. Возможно, стоит обратиться в службу поддержки Okta или в документацию Spring Security для получения дополнительной информации.
Настройка тайм-аута сеанса — это важный аспект безопасности, и правильная конфигурация ваших приложений и сервисов обеспечит надежную защиту данных ваших пользователей.