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