
fjh
2023/03/07阅读:24主题:红绯
spring security 自动登录
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
作者介绍

fjh
java 微服务开发