Spring Security记住自动登录,安全和便捷
用户登录网后,一般情况为了用户的账号安全如果停留网站太久没有操作,或者隔一段时间再打开,浏览器就会跳转到用户的登录界面,但是如果是自己的电脑,设置了屏幕锁密码,又经常访问的网站,就会想让它自动登录。所以有的网站登录页多一个勾选的按钮有了免登录三天,或者自动登录。
自动登录实现原理
在用户勾选自动登录成功后,后端生成两个cookie浏览器本地存储,set-cookie remember-me来存储免登录用户名,过期时间。cookie session标识当前用户登录会话标识。等用户当前会话过期后,就会用每次请求带的remember-me的cookie信息去登录,这样就实现用户自动登录。
Spring Security 免登录实现
上文介绍到Spring security 的核心是过滤链SecurityFilterChain,
用户登录匹配到对应过滤器UsernamePasswordFilter进行业务逻辑处理。
用户登录成功后调用RememberMeService.loginSeccess(),
用户失败时也调用RememberMeService.loginFail(),当用户的会话过期后调 匹配到它过滤器RememberMeServie.autoLogin()进行自动登录。
1、TokenBased 简单实现
TokenBasedRememberMeServices生成remember-me的cookie规则如下
base64(username + ":" + expirationTime + ":" + algorithmName + ":"
algorithmHex(username + ":" + expirationTime + ":" password + ":" + key))
- username: 用户名
- password: 密码
- expirationTime:有效期
- key:加密key
- algorithmName: 加密签名
用户自动登录,通过解析cookie,用冒号切分,第一个是username,第二是有效期,第三个是签名。userDetailService查询用户名找到用户信息,进行签名对比校验通过即自动登录成功。
2、PersistentTokenBased 存储实现
PersistentTokenBasedRememberMeServices 是实现token存储后端的方式,一种是具有内存,一种是基于数据库存储。
- InMemoryTokenRepositoryImpl
- JdbcTokenRepositoryImpl
前端cookie:remember-me的生成规则:
base64(series:token)
- username:用户名
- series:作为id查询
- token:登录凭证
- last_used:有效时间
3、RememberMeFilter 自动登录
RememberMeAuthenticationFilter 拦截器进行自动登录,dofilter方法里面两段核心代码,获取rememberMeAuth登录
Authentication rememberMeAuth = this.rememberMeServices.autoLogin(request, response);
rememberMeAuth = this.authenticationManager.authenticate(rememberMeAuth);
参考样例
spring-security-easy-sample是集成spring-security-easy-starter的参考样例工程。初始化数据脚本后启动样例工程,登录访问路径 http://localhost:9080/static/index.html
1、参考配置文档application-local.yml
2、参考readme文档
3、用户名密码 + 图形验证码登录
代码仓库
https://gitee.com/fjh2017/spring-security-easy-starter
本文由mdnice多平台发布