Spring Security:如何重命名“_spring_security_remember_me”复选框字段?

时间:2012-04-29 00:29:41

标签: spring spring-mvc spring-security

在Spring MVC 3.1应用程序中,我正在尝试实现 remember-me 功能(信息保存在数据库中)。

以下是我目前的情况:

  • 我创建了一个persistent_logins表。
  • 我在安全上下文文件中有这个:

    <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" />
    
  • 在我的login.jsp中,我有:

    <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>
    

在“&lt; form-login&gt;”中bean,我已经能够使用 username-parameter password-parameter 重命名必须在jsp中使用的默认“j_password”和“j_username”字段。但我找不到重命名“_spring_security_remember_me”复选框字段的方法。

有关如何重命名的想法吗?

2 个答案:

答案 0 :(得分:10)

使用RememberMeServices的{​​{3}}属性设置。

遗憾的是,使用命名空间配置无法设置。您可以通过以下几种方式进行设置:

  1. 创建自定义RememberMeServices并使用<remember-me services-ref="myRememberMeServices">使用它。在bean上设置属性。

  2. parameter在默认RememberMeServices上设置属性。

答案 1 :(得分:3)

您应该使用BeanPostProcessor来设置正确的属性:

让我们考虑您要将您的财产称为“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> 

希望它有所帮助。