17

私は現在、プログラムでユーザーをログインさせています (Facebook やログイン フォームを使用する以外の方法でログインする場合など)。

SecurityContextHolder.getContext().setAuthentication(
  new UsernamePasswordAuthenticationToken(user, "", authorities)
);

私が代わりにやりたいことは、ログインフォームでremember-meオプションをオンに設定したかのようにユーザーをログインさせることです。RememberMeAuthenticationTokenの代わりにを使用する必要があると思いUsernamePasswordAuthenticationTokenます。keyしかし、コンストラクターの引数には何を入れればよいでしょうか?

RememberMeAuthenticationToken(String key, Object principal, Collection<? extends GrantedAuthority> authorities) 

更新:ここで説明されている永続的なトークン アプローチを使用しています。そのため、単純なハッシュベースのトークン アプローチのようなキーはありません。

4

2 に答える 2

14

すでに構成に<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);  
于 2011-10-18T17:32:55.110 に答える