2012-04-29 34 views
10

Trong ứng dụng Spring MVC 3.1, tôi đang cố gắng triển khai tính năng nhớ-tôi (với thông tin được lưu trong cơ sở dữ liệu).Bảo mật mùa xuân: Cách đổi tên trường "_spring_security_remember_me"?

Dưới đây là những gì tôi hiện có:

  • Tôi tạo ra một bảng persistent_logins.
  • Tôi có điều này trong tập tin bối cảnh an ninh của tôi:

    <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" /> 
    
  • Trong login.jsp tôi, tôi có:

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

Trong "< hình thức đăng nhập>" đậu , Tôi đã có thể đổi tên các trường "j_password" và "j_username" mặc định phải được sử dụng trong jsp, sử dụng tên người dùng -tham sốmật khẩu ter. Nhưng tôi không tìm cách đổi tên trường "_spring_security_remember_me".

Bất kỳ ý tưởng nào về cách đổi tên?

+0

Thiên Chúa của tôi như thế nào đây không phải là một tham số trên '' ?? !! – HDave

+0

Có vẻ như 'remember-me-parameter' đã được thêm vào [phiên bản mới nhất] (https://github.com/SpringSource/spring-security/blob/master/config/src/main/java/org/springframework/ security/config/http/RememberMeBeanDefinitionParser.java) –

Trả lời

10

Được đặt bằng cách sử dụng thuộc tính parameter của RememberMeServices.

Đáng buồn là điều này không thể đặt bằng cấu hình không gian tên. Dưới đây là một vài cách bạn có thể đặt:

  1. Tạo tùy chỉnh RememberMeServices và sử dụng nó bằng cách sử dụng <remember-me services-ref="myRememberMeServices">. Đặt thuộc tính trên bean của bạn.

  2. Use a BeanPostProcessor (see 1.8) để đặt thuộc tính theo mặc định RememberMeServices.

+1

Điều này bây giờ có thể cấu hình thông qua không gian tên bắt đầu với Spring Security 3.2.0.M2 - https://jira.springsource.org/browse/SEC-2119 – Eugen

+0

Thật tuyệt vời! Cảm ơn các chàng trai mùa xuân! – sourcedelica

3

Bạn nên sử dụng BeanPostProcessor để thiết lập thuộc tính đúng:

Hãy xem xét mà bạn muốn gọi bất động sản của bạn "myRememberMeProperty"

Sau đó, mã của bạn sẽ trông như thế này:

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> 

Hy vọng nó sẽ giúp.

+0

Tôi chấp nhận câu trả lời của ericacm, vì tôi nghĩ rằng nó là tổng quát hơn. Nhưng trong trường hợp cụ thể của tôi, sử dụng bean BeanPostProcessor là cách để đi và tôi đã sử dụng ví dụ của bạn là .. Vì vậy, cảm ơn rất nhiều! Lưu ý rằng tôi cũng đã thay đổi tên cookie theo cùng một cách, bằng cách sử dụng setCookieName() trên AbstractRememberMeServices, từ bên trong BeanPostProcessor tùy chỉnh của tôi! – electrotype

Các vấn đề liên quan