Пользователь, аутентифицированный как анонимный, попытался получить доступ к сеансу, принадлежащему
Прежде чем войти в систему, я могу нажать что-нибудь за пределами моего каталога ограничений безопасности. Если я пытаюсь перейти в каталог внутри каталога ограничений безопасности, он перенаправляет меня на страницу входа в форму. Как и следовало ожидать.
После входа в систему я могу заниматься своими делами и получать доступ к ресурсам как вне, так и внутри моего ограничения безопасности.
Но когда срок действия маркера LTPA истекает (все еще есть активный сеанс), и я пытаюсь перейти на неограниченную страницу, скажем, как если бы меня перенаправили на страницу входа, я получаю ошибку в заголовке.
Итак, несколько вещей, которые я хотел бы выяснить: 1. Могу ли я получить токен LTPA, чтобы он не истек, как мой сеанс? 2. Могу ли я закончить сеанс, когда токен LTPA завершится? 3. Почему я не могу открыть неограниченную страницу анонимно? Ясно признаю, что мой токен LTPA истек и пытается перенаправить меня для входа в систему. В этот момент это не удается.
ОК, так что получил где-то с фильтром. Фильтр перенаправляет кого-то, кто не вошел на страницу входа. Но проблема снова заключается в том, что как только срок действия токена ltpa истечет, эта строка завершится сбоем ((HttpServletRequest) request).getSession(false)
бросить исключение в заголовке, UnauthorizedSessionRequestException
, Итак, как вы можете видеть, я попытался отловить эту ошибку и выйти из системы. Который, woops, бросает другой UnauthorizedSessionRequestException
, Так как же мне не использовать сессию?
@Override
public void doFilter(final ServletRequest request, final ServletResponse response,
final FilterChain chain) throws IOException, ServletException
{
final String sourceMethod = "doFilter";
if (logger.isLoggable(Level.FINER)) {
logger.entering(sourceClass, sourceMethod, new Object[] { request, response, chain });
}
try {
final HttpSession session = ((HttpServletRequest) request).getSession(false);
final UserBean user = (session != null) ? (UserBean) session.getAttribute("userBean")
: null;
if (user == null || (user != null && !user.isLoggedOn())) {
final HttpServletResponse res = (HttpServletResponse) response;
res.sendRedirect("../login.jsf");
}
} catch (final UnauthorizedSessionRequestException exc) {
((HttpServletRequest) request).logout();
final HttpServletResponse res = (HttpServletResponse) response;
res.sendRedirect("../login.jsf");
} catch (final Exception exc) {
final ServletException exception = new ServletException(
"[UserBeanFilter] Exception doFilter.", exc);
logger.throwing(sourceClass, sourceMethod, exception);
throw exception;
}
chain.doFilter(request, response);
logger.exiting(sourceClass, sourceMethod);
}
2 ответа
Могу ли я получить токен LTPA, чтобы он не истек, как мой сеанс?
К сожалению нет. Токен LTPA имеет фиксированное время ожидания, а сеанс имеет время ожидания неактивности. Если вам нужно, вы можете продлить тайм-аут LTPA, например, до 8 часов, чтобы избежать истечения срока действия.
Почему я не могу открыть неограниченную страницу анонимно?
Потому что он пытается получить доступ к сеансу, который ранее был связан с аутентифицированным пользователем. Вы можете разрешить анонимный доступ к сеансу, отключив Security integration
установка в Servers > Server Types > WebSphere application servers > server_name > Session management
,
Вы также можете проверить, если Use available authentication data when an unprotected URI is accessed
включен в Security > Global security > Authentication > Web and SIP security > General settings
,
Ясно признаю, что мой токен LTPA истек и пытается перенаправить меня для входа в систему. В этот момент это не удается.
Попробуйте отключить поддержку сеанса на странице входа в систему, если это JSP, попробуйте установить <@page session="false">
на странице.
ОБНОВИТЬ
Поэтому, если вы хотите быть превентивным, вы можете проверить истечение срока действия LTPA и на основе этого пользователя выхода из системы до истечения срока действия токена, например, за 5 минут до этого. Конечно, если пользователь будет неактивен в течение этих 5 минут, вы все равно получите это исключение, но этого должно быть достаточно для 90% случаев.
Чтобы получить срок действия токена, используйте следующий код (псевдокод):
WSSubject subject = WSSubject.getRunAsSubject();
Set<WSCredential> credentials = subject.getPublicCredentials(WSCredential.class);
for(WSCredential credential : credentials) {
// in the most cases you will find only one credential, but if you
// want to be sure you can check credential OID
System.out.println("Exp date:" + new Date(credential.getExpiration()));
System.out.println("userName: " + credential.getSecurityName());
System.out.println("cred: " + credential.getOID());
// if expiration date closer than your threshold - logout user
// ...
}
OIDs for auth mechanisms
BasicAuth (GSSUP): oid:2.23.130.1.1.1
KRB5: OID: 1.2.840.113554.1.2.2
LTPA: oid:1.3.18.0.2.30.2
ОБНОВЛЕНИЕ 2
Хорошо, я нашел лучшее решение для вас.
Просто установите следующий флаг в менеджере сессий:
InvalidateOnUnauthorizedSessionRequestException=true
InvalidateOnUnauthorizedSessionRequestException
Задайте для этого свойства значение true, если в ответ на неавторизованный запрос вы хотите, чтобы менеджер сеансов аннулировал сеанс вместо того, чтобы выдавать сообщение об ошибке UnauthorizedSessionRequestException.
Когда сеанс признан недействительным, запрашивающая сторона может создать новый сеанс, но не имеет доступа к каким-либо ранее сохраненным данным сеанса. Эта аннулирование позволяет одному пользователю продолжать обработку запросов после выхода из системы, сохраняя при этом данные сеанса.
Подробнее см. Здесь Пользовательские свойства управления сеансом
Для Вебшепре 8.5 . Перейдите в раздел Серверы> Типы серверов> Серверы приложений WebSphere> имя_сервера (server1) > Управление сеансами (см. Меню справа). Пользовательские свойства -> Добавить новые свойства.
Name =InvalidateOnUnauthorizedSessionRequestException
Value=true.
Сохраните его и перезапустите сервер в Eclipse. Я столкнулся с этой проблемой при тестировании веб-сервиса в SOAPUI.