自动登录
自动登录的原理是将用户的登录信息保存在用户浏览器的cookie中,当用户下次访问时实现自动校验并建立登录状态的一种机制。
Spring Security 提供了两种令牌机制
- 用散列算法加密用户必要的登录信息并生成令牌
- 数据库等持久化存储机制持久化令牌
散列算法
将用户名(username)、过期时间(expirationTime)、密码(password)和散列盐值(key)进行md5运算得到令牌。再下次登录时会使用base64简单解码得到用户名、过期时间和加密散列值,然后通过用户名得到密码,接着重新计算与旧的散列值进行对比确认是否有效。
1 | java复制代码hashInfo = md5Hex(username+":"+expirationTime+":"+password+":"+key); |
在Spring Security中实现该功能非常简单,只需要在javaconfig进行配置即可。这里在learn-05上进行修改。
1 | java复制代码 @Override |
在前端登录页面添加记住我的功能。
1 | html复制代码<!DOCTYPE html> |
存在的问题
在每次服务重启之后,key的值都会进行更新导致重启之前的cookie失效而且如果是多实例部署的情况下,由于实例之间的key值不同,所以当用户访问另一个实例的时候自动登录状态就会失效。合理的用法是指定key,这里测试即使是指定了key在重启之后仍然需要进行登录。
1 | java复制代码 .rememberMeCookieName("remember-cookies") |
持久化令牌
持久化在交互逻辑上和散列加密是一致的,都是用户在勾选了remember-me后将生成的令牌发送给浏览器,用户在下次访问系统时读取该令牌进行认证。不同的是持久化令牌采取了更加严格的验证。
在持久化令牌方案中最核心的是series
和token
两个值,都是采用MD5散列过的随机字符串,不同的是series
在用户使用密码进行重新登录后进行更新,而token则是每次会话都会进行更新。自动登录并不会将series进行更改,当令牌在未使用时就被盗用时,系统会在非法验证用户通过后刷新token。此时的合法用户的token也会失效,系统因此可以对合法用户进行提醒 用户账号可能被盗用。
创建持久化令牌的数据库表
1 | sql复制代码SET NAMES utf8mb4; |
引入新的依赖
1 | xml复制代码 <dependency> |
配置数据库连接
1 | yml复制代码spring: |
实现repository
1 | java复制代码 @Resource |
实现自定义退出
实现自定义退出
1 | java复制代码@Component |
1 | java复制代码 @Resource |
本文转载自: 掘金