持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第11天,点击查看活动详情
登录流程学习
普通登录认证
通过浏览器第一次访问某个服务端时,需要提供用户名、密码进行登入认证,成功认证后,服务端产生session(记录用户已登录状态)
并写入浏览器中的cookie(session的key,一般为jsessionId).
浏览器第二次访问服务端时,通过jsessionId查询得到对应的session。用来判断用户是否登录。
SSO(单点登录)登录认证
核心设计
前台站点:业务站点A、业务站点B(需要登录的站点)
SSO站点:登录、退出
SSO服务:登录(登录服务)、登录状态(提供登录状态校验/登录信息查询的服务)、退出(用户注销服务)
数据库:存储用户账户信息
缓存:存储用户的登录信息,通常使用 Redis
SSO 应用登录/退出
同域下单点登录
设计原理
- 门户系统设置 Cookie 的 domain 为一级域名 authing.com,这样就可以将门户的 Cookie 共享给所有使用该域名(authing.com)的系统。
- 使用 Spring Session 等技术让所有系统共享 Session。
- 门户系统登录之后,无论是跳转应用一还是应用二,都能通过门户 Cookie 中的 SessionId 读取到 Session 中的登录信息,实现单点登录。
同域 SSO 原理分析
HTTP 协议是无状态的,单个系统的会话由服务端 Session 进行维持,Session 保持会话的原理是通过给浏览器返回 Set-Cookie 请求头,浏览器收到后把包含 Sessionid 的 Cookie 写入浏览器,每次访问都会自动携带该站点下的 Cookie,在服务端读取其中的 Sessionid 进行验证,实现会话保持。通过巧用 Cookie 顶域的特性和 Session 共享,可以实现同域下的多个系统登录认证,也就是同域下的单点登录。
Session-Cookie 机制
服务端通过 Cookie 认证客户端。用户在第一次登录后,服务端将返回一个 Cookie 给客户端(这个 Cookie 包含 Sessionid),用户下一次发起请求后将在 header 带上这个 Cookie,服务端便可以识别出具体的客户端。
Spring-Session 共享
解决同域下集群 Session 共享的问题。当服务端为集群而不是单点的时候,需要集群服务器之间的 Session 共享才能实现 Session-Cookie 机制的同域 SSO。实现方式:通过过滤器拦击请求,获取 Session 数据并保存到数据库(Session 持久化),之后 Session 数据将统一从数据库中获取。
不同域下单点登录
CAS