【问题标题】:Spring Security : How to rename the "_spring_security_remember_me" checkbox field?Spring Security:如何重命名“_spring_security_remember_me”复选框字段?
【发布时间】:2012-05-09 06:28:36
【问题描述】:

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

在“”bean 中,我已经能够使用 username-parameter重命名必须在 jsp 中使用的默认“j_password”和“j_username”字段> 和 密码参数。但我找不到重命名“_spring_security_remember_me”复选框字段的方法。

知道如何重命名吗?

【问题讨论】:

  • 天哪,这不是&lt;form-login&gt;上的参数吗??!!
  • 看起来remember-me-parameter 已添加到latest version

标签: spring spring-mvc spring-security


【解决方案1】:

这是使用RememberMeServicesparameter 属性设置的。

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

  1. 创建一个自定义的 RememberMeServices 并使用 &lt;remember-me services-ref="myRememberMeServices"&gt; 使用它。在你的 bean 上设置属性。

  2. Use a BeanPostProcessor (see 1.8) 将属性设置为默认RememberMeServices

【讨论】:

【解决方案2】:

您应该使用 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> 

希望对你有帮助。

【讨论】:

  • 我接受了 ericacm 的回答,因为我认为它更笼统。但是在我的特殊情况下,使用 BeanPostProcessor bean 是可行的方法,我按原样使用了您的示例。非常感谢!请注意,我也以相同的方式更改了 cookie 名称,在我的自定义 BeanPostProcessor 中使用 AbstractRememberMeServices 上的 setCookieName()!
猜你喜欢
  • 1970-01-01
  • 2012-03-08
  • 2017-11-15
  • 2016-11-12
  • 2011-08-31
  • 2017-05-19
  • 1970-01-01
  • 1970-01-01
  • 2014-03-03
相关资源
最近更新 更多