2012-04-29 12 views
10

Spring MVC 3.1アプリケーションでは、remember-me機能(データベースに情報が保存されています)を実装しようとしています。ここで春のセキュリティ: "_spring_security_remember_me"チェックボックスフィールドの名前を変更する方法は?

は、私が現在持っているものです。

  • 私はpersistent_loginsテーブルを作成しました。
  • 私は私のセキュリティコンテキストファイルでこれを持っている:私のlogin.jspで

    <form-login login-page="/login" 
         authentication-failure-url="/login?err=true" 
         default-target-url="/" 
         username-parameter="username" 
         password-parameter="password" 
         login-processing-url="/validatelogin" /> 
    
    <remember-me key="some_random_key" 
         token-validity-seconds="31536000" 
         data-source-ref="dataSource" /> 
    
  • を、私が持っている: "<フォームログイン>" 豆で

    <form action="/validatelogin" method="post"> 
        username : <input type='text' id='username' name='username' value='${SPRING_SECURITY_LAST_EXCEPTION.authentication.principal}' /> 
        <br /> 
        password : <input type='password' id='password' name='password' /> 
        <br /><br /> 
        remember me : <input type="checkbox" name="_spring_security_remember_me" /> 
        <br /><br /> 
        <input type="submit" value="submit" /> 
    </form> 
    

私はユーザ名パラメータを使用して、jspで使用されるデフォルトの "j_password"と "j_username"フィールドの名前を変更することができました。 ter。しかし、 "_spring_security_remember_me"チェックボックスフィールドの名前を変更する方法はありません。

名前を変更する方法はありますか。

+0

私の神様は、これがどのように ''のパラメータではありませんか? – HDave

+0

'remember-me-parameter'のようなものが[最新版](https://github.com/SpringSource/spring-security/blob/master/config/src/main/java/org/springframework/)に追加されましたセキュリティ/ config/http/RememberMeBeanDefinitionParser.java) –

答えて

10

parameterプロパティを使用して設定されます。RememberMeServicesです。

悲しいことに、これは名前空間の設定を使用して設定できません。ここではいくつかの方法は、あなたがそれを設定することができます:

  1. は、カスタムRememberMeServicesを作成し、<remember-me services-ref="myRememberMeServices">を使用してそれを使用しています。 Beanのプロパティを設定します。

  2. Use a BeanPostProcessor (see 1.8)デフォルトのRememberMeServicesにプロパティを設定します。

    あなたは正しいプロパティを設定するためにBeanPostProcessorを使用する必要があります
+1

これで、Spring Security 3.2.0.M2から始まる名前空間で設定できるようになりました - https://jira.springsource.org/browse/SEC-2119 – Eugen

+0

これは素晴らしいことです!ありがとうございます。 – sourcedelica

3

次に、あなたのコードは次のようになりますのは、あなたがあなたの財産 "myRememberMeProperty" を呼び出したいこと

を考えてみましょう:

public class MyBeanPostProcessor implements BeanPostProcessor { 

String myRememberMeProperty; 


    public Object postProcessAfterInitialization(Object bean, String name) { 
    if (bean instanceof AbstractRememberMeServices) { 
     AbstractRememberMeServices rememberMe = (AbstractRememberMeServices) bean; 
     rememberMe.setParameter(getMyRememberMeProperty()); 
    } 
    return bean; 
    }  
    public Object postProcessBeforeInitialization(Object bean, String name) { 
    return bean; 
    } 

    public void setMyRememberMeProperty(String myRememberMeProperty){ 
    this.myRememberMeProperty = myRememberMeProperty;  

    } 

public String getMyRememberMeProperty(){ 
    return this.myRememberMeProperty;  

    } 
} 


<bean id="myBeanPostProcessor" 
    class="x.y.z.MyBeanPostProcessor"> 
    <property name="myRememberMeProperty" value="myRememberMeProperty" /> 
</bean> 

希望します。

+0

私はそれがより一般的だと思うので、私はエリックの答えを受け入れました。しかし、私の特別なケースでは、BeanPostProcessor Beanを使用する方法がありました。私はあなたの例を使っていました。だから大変ありがとう!私のカスタムBeanPostProcessor内からAbstractRememberMeServicesでsetCookieName()を使用して、同じ方法でクッキー名を変更しました。 – electrotype

関連する問題