Я предполагаю, что в вашей конфигурации уже установлено <remember-me>
.
Способ, которым помнят меня, заключается в том, что он устанавливает cookie, который распознается, когда пользователь возвращается на сайт после истечения срока его сессии.
Вам придется создать подкласс RememberMeServices
(TokenBased
или PersistentTokenBased
), который вы используете, и сделать onLoginSuccess () общедоступным. Например:
public class MyTokenBasedRememberMeServices extends PersistentTokenBasedRememberMeServices {
@Override
public void onLoginSuccess(HttpServletRequest request, HttpServletResponse response, Authentication successfulAuthentication) {
super.onLoginSuccess(request, response, successfulAuthentication);
}
}
<remember-me services-ref="rememberMeServices"/>
<bean id="rememberMeServices" class="foo.MyTokenBasedRememberMeServices">
<property name="userDetailsService" ref="myUserDetailsService"/>
<!-- etc -->
</bean>
Внедрите свои RememberMeServices в компонент, где вы выполняете программный вход в систему. Затем вызовите onLoginSuccess()
для него, используя UsernamePasswordAuthenticationToken, который вы создали. Это установит печенье.
UsernamePasswordAuthenticationToken auth =
new UsernamePasswordAuthenticationToken(user, "", authorities);
SecurityContextHolder.getContext().setAuthentication(auth);
getRememberMeServices().onLoginSuccess(request, response, auth);
UPDATE
@ улучшено, без подклассов RememberMeServices:
UsernamePasswordAuthenticationToken auth =
new UsernamePasswordAuthenticationToken(user, "", authorities);
SecurityContextHolder.getContext().setAuthentication(auth);
// This wrapper is important, it causes the RememberMeService to see
// "true" for the "_spring_security_remember_me" parameter.
HttpServletRequestWrapper wrapper = new HttpServletRequestWrapper(request) {
@Override public String getParameter(String name) { return "true"; }
};
getRememberMeServices().loginSuccess(wrapper, response, auth);