Spring Security 自动登录实现

166 阅读2分钟

Spring Security 自动登录实现

原创 Fanjh 有范编程笔记 2023-03-06 08:13 发表于广东

收录于合集#Spring Security Easy Starter6个

 打造一款让人上手起来得心应手的Spring Security Easy Starter 安全认证框架。勾选自动登录,安全和便捷

图片

1、自动登录场景

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

2、自动登录原理

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

图片

3、自动登录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);

4、参考样例

spring-security-easy-sample是参考样例工程。根据readme文档,按需修改配置文件application-local.yml,初始化数据库脚本后直接启动sample样例工程,访问下面地址:http://localhost:9080/static/index.html

图片

代码仓库地址:gitee.com/fjh2017/spr…

扫码_搜索联合传播样式-白色版.png