java - Spring security 复制了 RemeberMeProvider

标签 java spring spring-security

我在客户端使用 GWT 构建了一个应用程序(将来我将接口(interface)重写为 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>

但是rememberMe服务不起作用。所以我开始调试它,我发现 rememberMeAuthenticationProvider 两次初始化! 第一次使用名称 org.springframework.security.authentication.RememberMeAuthenticationProvider#0 和奇怪的(可能是自动生成的)key 进行初始化。

第二个提供程序使用正确的名称 rememberMeAuthenticationProvider 和正确的 key 进行初始化。

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

我做错了什么?谁两次初始化提供者?

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

问题的第二部分:我不明白如何将 RememberMe cookie 设置到客户端,所以我编写了类。如果我从客户那里收到remember = true,我称之为方法。它有效。如果您提供一些有关记住我 + 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(如果适用)。

关于java - Spring security 复制了 RemeberMeProvider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23316872/

相关文章:

java - 在背景Java中播放音乐

ajax - POST FormData 对象到 Spring MVC

Java:如何从 Spring 的 DMLC 取消订阅持久订阅者?

java - 我应该使用一个全局 Retrofit 实例还是为 Android 中的每个请求创建一个实例?

spring - Grails、SpringSecurity - 如果未记录则禁用重定向

java - Keycloak和Spring Boot : session creation policy

Spring Security - 需要 403 错误,而不是重定向

java - jhipster 身份验证登录邮箱

java - Show(),这里放什么?

java - Spring 3.x 和 Hibernate Envers