spring security 自动登录

Spring Security记住自动登录,安全和便捷
spring security 自动登录_第1张图片

用户登录网后,一般情况为了用户的账号安全如果停留网站太久没有操作,或者隔一段时间再打开,浏览器就会跳转到用户的登录界面,但是如果是自己的电脑,设置了屏幕锁密码,又经常访问的网站,就会想让它自动登录。所以有的网站登录页多一个勾选的按钮有了免登录三天,或者自动登录。

自动登录实现原理

在用户勾选自动登录成功后,后端生成两个cookie浏览器本地存储,set-cookie remember-me来存储免登录用户名,过期时间。cookie session标识当前用户登录会话标识。等用户当前会话过期后,就会用每次请求带的remember-me的cookie信息去登录,这样就实现用户自动登录。
spring security 自动登录_第2张图片

Spring Security 免登录实现

上文介绍到Spring security 的核心是过滤链SecurityFilterChain,
用户登录匹配到对应过滤器UsernamePasswordFilter进行业务逻辑处理。
用户登录成功后调用RememberMeService.loginSeccess(),
用户失败时也调用RememberMeService.loginFail(),当用户的会话过期后调 匹配到它过滤器RememberMeServie.autoLogin()进行自动登录。
spring security 自动登录_第3张图片

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
spring security 自动登录_第4张图片
1、参考配置文档application-local.yml
2、参考readme文档
3、用户名密码 + 图形验证码登录

代码仓库
https://gitee.com/fjh2017/spring-security-easy-starter

本文由mdnice多平台发布

你可能感兴趣的:(java)