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

mar*_*osh 2 spring-security

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

<security:form-login password-parameter="j_password_input" ... />
Run Code Online (Sandbox Code Playgroud)

Rob*_*nch 5

您有几个选项我已在下面进一步详细说明

  • 将Security Namespace与BeanPostProcessor一起使用
  • 使用services-ref并手动配置RememberMeServices

将Security Namespace与BeanPostProcessor一起使用

命名空间不支持配置remember me参数,但您可以使用FAQ中的提示来了解如何仍使用命名空间支持,但自定义结果.诀窍是使用a BeanPostProcessor来设置参数字段AbstractRememberMeServices.您可以在下面找到以下示例:

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;
  }
}
Run Code Online (Sandbox Code Playgroud)

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

<security:http ..>
  ...
  <security:remember-me/>
</security:http>
<bean class="sample.MyBeanPostProcessor"/>
Run Code Online (Sandbox Code Playgroud)

使用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>
Run Code Online (Sandbox Code Playgroud)