2012-04-29 19 views
10

En una aplicación Spring MVC 3.1, estoy intentando implementar una función remember-me (con información guardada en la base de datos).Seguridad de primavera: cómo cambiar el nombre del campo de casilla de verificación "_spring_security_remember_me"?

Esto es lo que tengo actualmente:

  • creé una mesa persistent_logins.
  • tengo esto en mi archivo de contexto de seguridad:

    <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" /> 
    
  • En mi login.jsp, tengo:

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

En la "forma-login> <" grano , He podido cambiar el nombre de los campos predeterminados "j_password" y "j_username" que deben usarse en el jsp, usando username-parámetro y password-parame ter. Pero no encuentro una forma de cambiar el nombre del campo de la casilla de verificación "_spring_security_remember_me".

¿Alguna idea sobre cómo cambiarle el nombre?

+0

Dios mío, ¿cómo es esto no es un parámetro en '' ?? !! – HDave

+0

Parece que se ha agregado 'remember-me-parameter' a la [última versión] (https://github.com/SpringSource/spring-security/blob/master/config/src/main/java/org/springframework/ security/config/http/RememberMeBeanDefinitionParser.java) –

Respuesta

10

Esto se establece utilizando la propiedad parameter de RememberMeServices.

Lamentablemente, esto no se puede establecer con la configuración del espacio de nombres. Aquí hay un par de maneras que usted puede configurarlo:

  1. Crear un RememberMeServices personalizados y utilizarlo usando <remember-me services-ref="myRememberMeServices">. Establezca la propiedad en su bean.

  2. Use a BeanPostProcessor (see 1.8) para establecer la propiedad en el valor predeterminado RememberMeServices.

+1

Ahora es posible configurarlo a través del espacio de nombres que comienza con Spring Security 3.2.0.M2 - https://jira.springsource.org/browse/SEC-2119 – Eugen

+0

¡Eso es genial! Gracias chicos de primavera! – sourcedelica

3

Debe utilizar BeanPostProcessor establecer la propiedad correcta:

Consideremos que desea llamar a su propiedad "myRememberMeProperty"

A continuación, el código debería tener este aspecto:

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> 

Espero que ayude.

+0

Acepté la respuesta de ericacm, ya que creo que es más general. Pero en mi caso particular, el uso de un bean BeanPostProcessor fue el camino a seguir y utilicé tu ejemplo tal como está ... ¡Así que muchas gracias! Tenga en cuenta que también cambié el nombre de la cookie de la misma manera, usando setCookieName() en AbstractRememberMeServices, desde mi BeanPostProcessor personalizado. – electrotype

Cuestiones relacionadas