Принудительный выход из приложения Spring Webflux после тайм-аута сеанса?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Принудительный выход из приложения Spring Webflux после тайм-аута сеанса?

Сообщение Anonymous »

Итак, у меня есть загрузочное приложение Spring, которое работает на двух службах: одна — это шлюз с Spring-Cloud-Gateway, Webflux и Spring-Session, а другая — сервер ресурсов. Они аутентифицируются с помощью единого входа OAuth2. По сути, моя проблема заключается в том, что я пытаюсь ввести принудительный выход пользователя из приложения, который срабатывает после определенного периода бездействия. Сначала я попытался использовать свойство server.servlet.session.timeout=60s в свойствах моего приложения, но, похоже, это не приводит к выходу из системы. Чего я точно хочу, так это когда сеанс истечет из-за бездействия, чтобы сервер перенаправился на конечную точку «/logout» и вышел из системы из-за бездействия.
Итак, что я пробовал теперь нужно создать LogoutHandler, который запускается WebFilter по истечении срока действия сеанса. Единственная проблема в том, что я не уверен, что смотрю правильный сеанс. У меня есть этот метод:
@Bean
public WebFilter expireSpringSessionFilter () {
return (exchange, chain) -> exchange.getSession
.flatMap( exchangeSession -> {
if (exchangeSession.isExpired()) {
logoutHandler.logout(
new WebFilterExchange(exchange, chain), (Authentication) ReactiveSecurityContextHolder.getContext()
).then(
logoutSuccessHandler.onLogoutSuccess(new WebFilterExchange(exchange, chain), null)
);
return Mono.defer(() ->
{
exchange.getResponse().getStatusCode(HttpStatus.FOUND);
exchange.getResponse().getHeaders().setLocation(URI.create("/logout"));
return exchange.getResponse().setComplete();
}
);
}
return chain.filter(exchange);
});
}

Но когда я его отлаживаю, кажется, что объект сеанса является объектом OidcSessionRegistryWebSession, и это кажется правильным, поскольку именно так пользователь аутентифицируется, но время ожидания сеанса в отладчик составляет 3600 сеансов/1 час, а это не то, что я установил в своем application.properties, как я упоминал ранее. (Пожалуйста, простите меня, я новичок). Я не могу сказать, стоит ли мне использовать HttpSessionListener для проверки HttpSession вместо сеанса сервлета? Но мой репозиторий не использует javax/jakarta.servlet, поэтому я не думаю, что это проблема
Поэтому я думаю, что мои вопросы следующие:
< ol>
[*]Как определить, какой объект/класс сеанса определяет, должен ли пользователь выходить из серверной части? АКА, в каком сеансе мне нужно изменить тайм-аут, чтобы убедиться, что аутентификация пользователя недействительна?
[*]Как мне заставить пользователя выйти из системы, поскольку я думаю, что мой фильтр может быть чем-то вроде глупая идея - есть ли какой-нибудь другой способ принудительного перенаправления на /logout после истечения сеанса?

Надеюсь, это имеет смысл, дайте мне знать если вам нужны какие-либо разъяснения. Я также приложил части своей кодовой базы, которые, по моему мнению, могут иметь отношение к делу:
Конфигурация безопасности (некоторые части удалены для краткости, но все они настроены):
@Bean
public SecurityWebFilterChain SecurityWebFilterChain (
ServerHttpSecurity http, ReactiveAuthenticationManagerResolver tokenAuthManagerResolver,
ServerAuthenticationConverter authTokenConverter
) {
return http
.csrf()
.authorizeExchange()
.oAuth2Login()
.logout(
logout -> logout
.logoutUrl("/logout")
.logoutHandler(logoutHandler())
.logoutSuccessHandler(logoutSuccessHandler())
)
.oauth2ResourceServer()
.build()
}

Выход/LogoutSuccessHandler:
@Bean
public ServerLogoutHandler logoutHandler() {
return (exchange, authentication) -> {
authentication.setAuthentication(false);
return exchange.getExchange().getSession().flatMap(
webSession ->
webSession.invalidate();
return Mono.empty();
)
}
}

@Bean
public ServerLogoutSuccessHandler logoutSuccessHandler() {
RedirectServerLogoutSuccessHandler logoutSuccessHandler = new RedirectServerLogoutSuccessHandler();
logoutSuccessHandler.setLogoutSuccessUrl(logoutRedirectUrl);
return logoutSuccessHandler;
}


Подробнее здесь: https://stackoverflow.com/questions/793 ... on-timeout
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»