rememberMeAuthenticationProvider

rememberMeAuthenticationProvider

我在客户端使用GWT构建了一个应用程序(以后我重写了JS的接口),并通过REST请求复制了功能。基于Spring框架。
现在,我需要实施授权。

这是我的security-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 ..........>
<security:http auto-config="false">
    <security:form-login login-page="/login.html"/>
    <security:intercept-url pattern="/login" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
    <security:intercept-url pattern="/mainGWT.html**" access="ROLE_USER"/>
    <security:remember-me services-ref="rememberMeServices" />
</security:http>

<bean id="userDetailsService" class="com.damintsev.servlet.UserDetailsServiceImpl"/>

<bean id="daoAuthenticationProvider" class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
    <property name="userDetailsService" ref="userDetailsService"/>
</bean>
<bean id="rememberMeAuthenticationProvider" class="org.springframework.security.authentication.RememberMeAuthenticationProvider">
    <constructor-arg name="key" value="rock"/>
</bean>

<context:component-scan base-package="com.login"/>

<bean id="rememberMeServices" class=
       "org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices">
    <property name="userDetailsService" ref="userDetailsService"/>
    <property name="key" value="rock"/>
    <property name="tokenValiditySeconds" value="5000"/>
    <property name="alwaysRemember" value="true"/>
</bean>

<bean id="rememberMeFilter" class=
        "org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter">
    <property name="rememberMeServices" ref="rememberMeServices"/>
    <property name="authenticationManager" ref="authenticationManager"/>
</bean>

<bean id="providerManager" class="org.springframework.security.authentication.ProviderManager">
    <property name="providers">
        <list>
            <ref bean="daoAuthenticationProvider"/>
            <ref bean="org.springframework.security.authentication.RememberMeAuthenticationProvider#0"/>
        </list>
    </property>
</bean>

<security:authentication-manager alias="authenticationManager">
</security:authentication-manager>




但记住我的服务没有工作。所以我开始调试它,发现rememberMeAuthenticationProvider初始化了twise!
第一次使用名称org.springframework.security.authentication.RememberMeAuthenticationProvider#0进行初始化,然后使用奇怪的(可能是自动生成的)key进行初始化。

第二个提供者使用适当的密钥初始化为适当的名称rememberMeAuthenticationProvider

后来出现了一个问题,因为key中的TokenBasedRememberMeServicesrememberMeAuthenticationProvider不匹配。
但是,当我将bean的名称更改为org.springframework.security.authentication.RememberMeAuthenticationProvider#0时,它可以正常工作。

我究竟做错了什么 ?谁初始化提供者twise?

<spring.version>3.2.3.RELEASE</spring.version>


问题的第二部分:我不了解如何将RememberMe cookie设置为客户端,因此我编写了类。如果我从客户那里得到的记忆=真,那我就称为这种满足感。而且有效。如果您提供一些示例来提醒我+ REST,则将有所帮助。

 @Component
 public class Security {

    @Autowired
    private RememberMeServices rememberMeServices;

    public void remeberMe(HttpServletRequest request, HttpServletResponse response, Authentication authentication1) {
        rememberMeServices.setAlwaysRemember(true);
        rememberMeServices.loginSuccess(request, response, authentication1);
    }
}

最佳答案

您有一个名为rememberMeAuthenticationProvider的bean,并且还在使用名称空间remember-me元素,该元素也将创建一个,因此也是重复的。您还声明了一个过滤器,除非您将其实际插入过滤器链中,否则它将不会使用。

要么删除命名空间元素,然后自己完全声明所有bean,要么坚持使用命名空间,让它完成工作。如果您想自定义RememberMeServices,则可以保留它和services-ref不变,但不清楚为什么需要自定义内容。

如果客户端发送了一个记住我的cookie,则无论客户端的类型如何,服务器都会对其进行处理。首先如何设置取决于登录机制。表单登录处理将自动调用RememberMeServices并在适当时设置cookie。

10-05 23:28