我在客户端使用 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
中的key
与rememberMeAuthenticationProvider
不匹配。
但是当我将 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/