spring security 实现免登陆功能大体也是基于COOKIE来实现的。
主要配置信息:
<remember-me data-source-ref="dataSource" key="rememberMeCookie"
authentication-success-handler-ref="authenticationSuccessHandler"
services-alias="rememberMeServices" />
1.首先登陆表单要Post URL: /j_spring_security_check 同时_spring_security_remember_me要等于yes,这时登陆后会记录cookie到数据库中;
/j_spring_security_check?_spring_security_remember_me=yes
代码逻辑:
UsernamePasswordAuthenticationFilter 登陆验证过滤器拦截/j_spring_security_check同时调用AbstractRememberMeServices 接口实现
this.rememberMeServices.loginSuccess(request, response, authResult);
2.当会话失效时,这个时候RememberMeAuthenticationFilter 过滤器会调用this.rememberMeServices.autoLogin(request, response);自动登陆;
同时successHandler.onAuthenticationSuccess(request, response, rememberMeAuth); 可以进行一些会话信息加载,这个地方需要根据项目的需要进行改造。
AbstractRememberMeServices
public final Authentication autoLogin(HttpServletRequest request, HttpServletResponse response) {
1.根据spring security 的cookiename获取spring security 保存的cookie
String rememberMeCookie = extractRememberMeCookie(request);
。。。。。
2. 解析rememberMeCookie的信息
UserDetails user = null;
String[] cookieTokens = decodeCookie(rememberMeCookie);
3. 获取cookie中信息,并生成登陆的session
user = processAutoLoginCookie(cookieTokens, request, response);
userDetailsChecker.check(user);
logger.debug("Remember-me cookie accepted");
return createSuccessfulAuthentication(request, user);
cancelCookie(request, response);
return null;
}
processAutoLoginCookie方法由子类PersistentTokenBasedRememberMeServices ,TokenBasedRememberMeServices来进行实现;
PersistentTokenBasedRememberMeServices 在登陆时保存登陆时的cookie备份,在处理processAutoLoginCookie时会首先比对cookie是否属于伪造的,
不是伪造的才可以获取登陆信息,进行登陆;这一点非常重要!!!
PersistentTokenBasedRememberMeServices 会实例化加密后的cookie信息到PersistentTokenRepository 接口的实现中,
private PersistentTokenRepository tokenRepository = new InMemoryTokenRepositoryImpl();
InMemoryTokenRepositoryImpl 的存储方式:Map<String, PersistentRememberMeToken> seriesTokens = new HashMap<String, PersistentRememberMeToken>();
JdbcTokenRepositoryImpl 的存储方式数据库表:推荐使用JdbcTokenRepositoryImpl 方式,这样集群环境下也可以实现cookie的信息的机器备份;
public static final String CREATE_TABLE_SQL =
"create table persistent_logins (username varchar(64) not null, series varchar(64) primary key, " +
"token varchar(64) not null, last_used timestamp not null)";
官方配置reference参考:
<remember-me> Attributes
authentication-success-handler-ref Sets the authenticationSuccessHandler property on theRememberMeAuthenticationFilter if custom navigation is required. The value should be the name of aAuthenticationSuccessHandler bean in the application context.
data-source-ref A reference to a DataSource bean. If this is set, PersistentTokenBasedRememberMeServices will be used and configured with a JdbcTokenRepositoryImpl instance.
remember-me-parameter The name of the request parameter which toggles remember-me authentication. Defaults to "_spring_security_remember_me". Maps to the "parameter" property of AbstractRememberMeServices.
key Maps to the "key" property of AbstractRememberMeServices. Should be set to a unique value to ensure that remember-me cookies are only valid within the one application [26]. If this is not set a secure random value will be generated. Since generating secure random values can take a while, setting this value explicitly can help improve startup times when using the remember me functionality.
services-alias Exports the internally defined RememberMeServices as a bean alias, allowing it to be used by other beans in the application context.
services-ref Allows complete control of the RememberMeServices implementation that will be used by the filter. The value should be the id of a bean in the application context which implements this interface. Should also implement LogoutHandler if a logout filter is in use.
token-repository-ref Configures a PersistentTokenBasedRememberMeServices but allows the use of a customPersistentTokenRepository bean.
token-validity-seconds Maps to the tokenValiditySeconds property of AbstractRememberMeServices. Specifies the period in seconds for which the remember-me cookie should be valid. By default it will be valid for 14 days.
use-secure-cookie It is recommended that remember-me cookies are only submitted over HTTPS and thus should be flagged as "secure". By default, a secure cookie will be used if the connection over which the login request is made is secure (as it should be). If you set this property to false, secure cookies will not be used. Setting it to true will always set the secure flag on the cookie. This attribute maps to the useSecureCookie property of AbstractRememberMeServices.
user-service-ref The remember-me services implementations require access to a UserDetailsService, so there has to be one defined in the application context. If there is only one, it will be selected and used automatically by the namespace configuration. If there are multiple instances, you can specify a bean id explicitly using this attribute.
分享到:
相关推荐
Spring MVC是Spring框架的一部分,用于处理Web应用程序的请求-响应模型,而Spring Security则是一个强大的安全管理框架,提供了认证和授权功能,帮助开发者保护应用免受恶意攻击。 1. **Spring MVC**: - **核心...
Spring Security是一个功能强大、高度定制的安全框架,它专门用于为基于Spring的应用程序提供安全性解决方案。Spring Security架构的设计初衷是为了解决认证和授权的需求,确保应用程序的安全性。它提供了全面的安全...
登录功能是Spring Security的基础,它提供了默认的登录页面和处理机制。你可以通过配置HttpSecurity来定制登录过程,例如设置登录URL、失败URL和成功处理器。Spring Security支持基于表单的身份验证,也支持OAuth2和...
SpringSecurity是Java开发中用于构建安全Web应用的框架,它提供了强大的身份验证、授权和访问控制功能。在本文中,我们将深入探讨SpringSecurity的核心概念、关键组件以及如何配置和使用这个框架。 首先,Spring...
总的来说,Spring Security 4.0.0的这些jar包是构建安全、健壮的Java Web应用不可或缺的组件,它们提供了一套灵活且强大的工具,可以帮助开发者保护应用程序免受各种安全威胁。通过仔细阅读提供的Java文档和源代码,...
SpringSecurity是Java开发领域中广泛使用的安全框架,用于保护Web应用程序免受各种安全威胁。它提供了全面的身份验证、授权和访问控制功能。本压缩包包含了两份重要的SpringSecurity中文文档,分别为“Spring ...
为了实现身份验证,Spring Security支持多种方式,如基于表单的登录、JWT(JSON Web Tokens)或者OAuth2。在这个例子中,我们使用了基于表单的登录。这意味着Spring Security会自动处理登录表单的提交,并尝试验证...
Spring Security通过一系列拦截器和过滤器来实现这些功能,使得开发者能够轻松地在Spring MVC应用中集成安全控制。 二、Spring Security 组件 1. **Filter Chain**: Spring Security通过一系列预定义的过滤器来...
标题:springsecurity3.1.pdf 描述:springsecurity3.1.pdf 标签:spring security3.1 部分内容:SpringSecurity Reference Documentation by Ben Alex and Luke Taylor 3.1.4.RELEASE **一、Spring Security 3.1...
这个"springSecurityTest.zip"文件是一个IDEA(IntelliJ IDEA)与MAVEN项目,设计用于帮助初学者理解并入门Spring Security。下面将详细阐述Spring Security的主要概念和其在实际开发中的应用。 首先,Spring ...
通过熟练掌握`http`和`security`命名空间,开发者能够创建强大且灵活的安全机制,保护Spring应用免受未经授权的访问。同时,深入研究源码和利用相关工具能进一步提升对Spring Security的理解和使用能力。
在这个"springboot+springsecurity入门"项目中,我们将关注如何将这两个框架结合使用,实现一个自定义表单登录的功能。自定义表单登录意味着我们可以根据应用需求设计登录界面,并且处理用户提交的登录信息。 1. ...
5. Thymeleaf模板:学习如何创建和使用Thymeleaf模板,结合Spring Security实现动态展示登录状态、权限提示等。 6. 错误页面处理:配置Spring Boot的错误页面,处理未授权、未登录等异常情况。 7. 登录和注销流程:...
在"SpringSecurity2Demo"这个项目中,我们可以预期看到以下组成部分: 1. **配置文件**: `spring-security.xml`,这是Spring Security的核心配置文件,包含了过滤器链的配置、用户认证源、授权规则等。 2. **控制...
Spring Security则是在Spring框架基础上构建的安全管理组件,为应用程序提供了全面的身份验证、授权和访问控制功能。 Spring框架的主要组成部分包括: 1. **IoC容器**:是Spring的核心,负责管理对象的生命周期和...
5. **会话管理**:Spring Security提供了会话管理功能,如会话固定保护(Session Fixation Protection)和会话超时控制。源码分析可以帮助理解如何自定义这些策略。 6. **Remember Me服务**:这个特性允许用户在...
SpringSecurity是Java领域中一款强大的安全框架,专为Web应用程序设计,用于实现身份验证和授权。这个名为"SpringSecurity素材.zip"的压缩包文件很可能包含了关于如何使用SpringSecurity进行安全控制的各种资料。...
10. **记住我功能**:SpringSecurity提供了“Remember Me”服务,允许用户在关闭浏览器后仍然保持登录状态。这个功能在示例中可能已经配置好,你可以查看源码了解实现细节。 通过这个教程,开发者不仅可以了解...
2. **配置RememberMeServices**:你需要实现RememberMeServices接口,Spring Security提供了一个默认实现RememberMeAuthenticationProvider。通常,你会使用TokenBasedRememberMeServices,它基于令牌存储用户的登录...