Spring Security:如何自定义remember-me请求参数名称?

时间:2011-12-28 08:18:00

标签: spring-security

我正在使用password-parameter(如下所示)来自定义包含密码的请求参数的名称。如何使用remember-me(默认_spring_security_remember_me)?

<security:form-login password-parameter="j_password_input" ... />

2 个答案:

答案 0 :(得分:5)

您有几个选项,我已在下面进一步详细解释

  • 将安全名称空间与BeanPostProcessor一起使用
  • 使用services-ref并手动配置RememberMeServices

将安全命名空间与BeanPostProcessor一起使用

命名空间不支持配置remember me参数,但您可以使用FAQ中有关如何仍然使用命名空间支持的提示,但可以自定义结果。诀窍是使用BeanPostProcessorAbstractRememberMeServices上设置参数字段。您可以在下面找到以下示例:

public class MyBeanPostProcessor implements BeanPostProcessor {
  public Object postProcessAfterInitialization(Object bean, String name) {
    if (bean instanceof AbstractRememberMeServices) {
      AbstractRememberMeServices rememberMe = (AbstractRememberMeServices) bean;
      rememberMe.setParameter("myParamname");
    }
    return bean;
  }    
  public Object postProcessBeforeInitialization(Object bean, String name) {
    return bean;
  }
}

然后你需要像往常一样使用命名空间,并将MyBeanPostProcessor添加到Spring配置中,如下所示:

<security:http ..>
  ...
  <security:remember-me/>
</security:http>
<bean class="sample.MyBeanPostProcessor"/>

使用services-ref并手动配置RememberMeServices

您也可以使用services-ref属性,但这需要更多配置。例如,如果您需要,可以使用以下配置:

<security:http ..>
  ...
  <security:remember-me services-ref="rememberMeServices"/>
</security:http>
<bean id="rememberMeServices"
      class="org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices">
  <property name="key" value="mustMatchRememberMeAuthenticationProvidersKey"/>
  <property name="parameter" value="myParamName"/>
  <!-- You must refer to a bean that implements UserDetailsService 
       in this example the bean id is userDetailsService -->
  <property name="userDetailsService" ref="userDetailsService"/>
</bean>

答案 1 :(得分:0)

从Spring Security 3.2.x开始,您可以使用remember-me-parameter元素上的remember-me参数进行设置。