前言:
Remember-me认证方式指的是能在不同的会话间记录用户认证信息的功能。通常通过向客户端发送一个cookie,在以后用户访问网站时通过这个cookie中的信息来自动登录实现。spring security 已经为我们提供了必要的hooks实现这个功能,并提供了两种具体的实现。一种是cookie中token包含了所有认证所需信息,并通过hash算法来保护这个token,另一种通过数据库或者其他持久化机制来存储生成的token。两种实现方式都需要我们提供一个UserDetailsService。如果我们采取的认证方式没有用到UserDetailsService(如LDAP),除非我们在application context中创建一个UserDetailsService来适配,否则Remember-me功能将不能正确执行。
一、remember-me功能实现逻辑
[list]
[*]用户首次登录认证成功后,调用RememberMeServices的loginSuccess方法,将用户凭证信息序列化成token,以某种形式存储起来
[*]用户session失效后再次访问系统,会调用RememberMeServices的autoLogin方法,根据客户端传过来的cookie信息,获取之前存储的token信息,并解析出认证需要的信息,完成自动认证
[/list]
二.基于简单hash的方式
1.这种方式MD5算法实现remember-me功能,核心思想是在用户认证成功后通过下面的算法生成一个token,token中包含用户名和密码等信息,并将此token缓存到客户端的cookie中。
通过上面的算法得到的token,如果在有效期内,并且用户名和密码没有变化的情况下就可以实现自动认证功能,过程如下
[list]
[*]服务器接收到token后,利用base64对token值解码,获取到username、expirationTime、以及一个特定的hash串,hash串中包含了用户的密码信息(因为hash算法的不可逆性,这个密码是不能恢复出来的)
[*]服务器判断expira
Remember-me认证方式指的是能在不同的会话间记录用户认证信息的功能。通常通过向客户端发送一个cookie,在以后用户访问网站时通过这个cookie中的信息来自动登录实现。spring security 已经为我们提供了必要的hooks实现这个功能,并提供了两种具体的实现。一种是cookie中token包含了所有认证所需信息,并通过hash算法来保护这个token,另一种通过数据库或者其他持久化机制来存储生成的token。两种实现方式都需要我们提供一个UserDetailsService。如果我们采取的认证方式没有用到UserDetailsService(如LDAP),除非我们在application context中创建一个UserDetailsService来适配,否则Remember-me功能将不能正确执行。
一、remember-me功能实现逻辑
[list]
[*]用户首次登录认证成功后,调用RememberMeServices的loginSuccess方法,将用户凭证信息序列化成token,以某种形式存储起来
[*]用户session失效后再次访问系统,会调用RememberMeServices的autoLogin方法,根据客户端传过来的cookie信息,获取之前存储的token信息,并解析出认证需要的信息,完成自动认证
[/list]
二.基于简单hash的方式
1.这种方式MD5算法实现remember-me功能,核心思想是在用户认证成功后通过下面的算法生成一个token,token中包含用户名和密码等信息,并将此token缓存到客户端的cookie中。
base64(username + ":" + expirationTime + ":" +
md5Hex(username + ":" + expirationTime + ":" password + ":" + key))
username: 用户名
password: 密码
expirationTime: 过期日期,单位是毫秒,默认两周
key: 一个私有的key值,用来保护token,防止被伪造
通过上面的算法得到的token,如果在有效期内,并且用户名和密码没有变化的情况下就可以实现自动认证功能,过程如下
[list]
[*]服务器接收到token后,利用base64对token值解码,获取到username、expirationTime、以及一个特定的hash串,hash串中包含了用户的密码信息(因为hash算法的不可逆性,这个密码是不能恢复出来的)
[*]服务器判断expira