すでに構成に<remember-me>
設定されていると思います。
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>
プログラムによるログインを行っている Bean に、RememberMeServices を挿入します。onLoginSuccess()
次に、作成した UsernamePasswordAuthenticationToken を使用して呼び出します。これにより、Cookieが設定されます。
UsernamePasswordAuthenticationToken auth =
new UsernamePasswordAuthenticationToken(user, "", authorities);
SecurityContextHolder.getContext().setAuthentication(auth);
getRememberMeServices().onLoginSuccess(request, response, auth);
アップデート
@at はこれを改良し、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);