Как я могу получить время входа при использовании Spring Security - PullRequest
1 голос
/ 06 июля 2011

Я использую Spring Security 3 и хотел бы отобразить время, когда пользователь вошел в текущий сеанс.

Предоставляет ли Spring Security такой токен?

Спасибо, - Акшай

Ответы [ 2 ]

4 голосов
/ 06 июля 2011

Наиболее надежным вариантом будет настройка цепочки фильтров Spring Security для сохранения метки времени в сеансе пользователя при успешном входе в систему.Тогда вы получите к нему доступ так же, как и к любому атрибуту сеанса.

1 голос
/ 07 июля 2011

Согласно документации, вы можете добавить свои собственные фильтры в цепочку фильтров Spring Security.
Вы можете добавить фильтр после UsernamePasswordAuthenticationFilter, если вы используете http/form-login, или после BasicAuthenticationFilter, в случае http/http-basic, поэтому мы гарантируем, что сеанс уже создан.
Чтобы охватить оба варианта, вы можете добавить фильтр после последнего и добавить информацию в сеанс.

Объявите ваш bean-компонент фильтра:

<bean id="myFilter" class="com.MyFilter"/>

Добавьте его в цепочку сразу после BasicAuthenticationFilter:

<http>
    <custom-filter ref="myFilter"  after="BASIC_AUTH_FILTER"/>
    ...

Ваш doFilter метод должен выглядеть следующим образом:

private static final String LOGGED_TIME_KEY = "LOGGED_TIME";

@Override
public void doFilter(ServletRequest req, ServletResponse res,
        FilterChain chain) throws IOException, ServletException {
    HttpServletRequest request = (HttpServletRequest) req;

    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
    if (authentication != null && authentication.isAuthenticated()) {
        HttpSession session = request.getSession(false);
        if (session != null && session.getAttribute(LOGGED_TIME_KEY) == null) {
            session.setAttribute(LOGGED_TIME_KEY, new Date());
        }
    }
    chain.doFilter(req, res);
}

Имейте в виду, что вы можете использовать другие крючки. Вы можете добавить его даже в свой AuthenticationProvider .

РЕДАКТИРОВАТЬ:

Существует более простой способ сделать это, если вы используете form-login.
Вы можете использовать пользовательские AuthenticationSuccessHandler. Чтобы определить его, обновите свой тег form-login, добавив атрибут authentication-success-handler-ref.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...