2012-04-29 83 views
10

在一个Spring MVC 3.1应用程序中,我试图实现一个记得功能(将信息保存在数据库中)。Spring Security:如何重命名“_spring_security_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> 
    

在 “<形式登录>” 豆,我已经能够重命名必须在jsp中使用的默认“j_password”和“j_username”字段,使用用户名参数密码参数ter。但是我找不到重命名“_spring_security_remember_me”复选框字段的方法。

关于如何重命名它的任何想法?

+0

我的上帝怎么这不是''??上的参数??! – HDave 2012-12-04 22:13:12

+0

看起来'remember-me-parameter'已被添加到[最新版本](https://github.com/SpringSource/spring-security/blob/master/config/src/main/java/org/springframework/ security/config/http/RememberMeBeanDefinitionParser.java) – 2013-03-26 09:47:39

回答

10

这是使用RememberMeServicesparameter特性设置的。

不幸的是,这是不能使用命名空间配置来设置的。这里有几个方法,你可以将其设置:

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

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

+1

现在可以通过名称空间进行配置,从Spring Security 3.2.0.M2开始 - https://jira.springsource.org/browse/SEC-2119 – Eugen 2013-08-01 14:16:28

+0

太棒了!感谢春天的家伙! – sourcedelica 2013-08-01 14:22:15

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> 

希望它有帮助。

+0

我接受了ericacm的回答,因为我认为它更一般。但在我的具体情况下,使用BeanPostProcessor bean是一种方式,我使用你的示例。所以非常感谢!请注意,我还使用AbstractRememberMeServices上的setCookieName()方法,从我的自定义BeanPostProcessor中以相同的方式更改了cookie名称! – electrotype 2012-04-29 14:07:58

相关问题