Итак, у меня есть загрузочное приложение 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
Принудительный выход из приложения Spring Webflux после тайм-аута сеанса? ⇐ JAVA
Программисты JAVA общаются здесь
1736689932
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;
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79350011/force-logout-from-spring-webflux-application-after-session-timeout[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия