Согласно документации, вы можете добавить свои собственные фильтры в цепочку фильтров 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
.