2026-03-10 12:20:24
单点登陆(SSO)
单点登陆(SSO,Single Sign-On)是一种身份认证机制,允许用户在一个系统或平台上登录后,无需再次登录即可访问该平台下的所有相关系统和应用。以下是关于SSO的详细解释:
一、SSO的基本概念SSO的核心思想是,在用户首次登录时,通过一次身份认证过程,生成一个全局唯一的会话标识(如Token),该标识在用户访问平台下的其他系统和应用时,用于验证用户的身份和权限,从而实现无需多次登录的便捷体验。
二、SSO的实现方式SSO的实现方式有多种,常见的有基于Cookie+Redis的有状态登录和基于Cookie+JWT的无状态登录。
1. 有状态登录(Cookie+Redis)登录流程:
用户输入账号和密码,通过Controller调用Service到数据库进行查询。
如果查询不到用户信息,则返回状态码404;如果查询到,则将用户对象存储在Redis中,Key包含UUID信息(如user:token:uuid),Value为用户对象(通常只包含用户名,不包含密码),并设置有效期。
向Controller返回一个状态码为200,数据为UUID的ResponseBean对象。
Controller判断返回的Response对象,如果是404,则向客户端回复用户名或密码错误;如果是200,则创建一个Cookie,Key为user-token,Value为UUID,并设置Cookie的路径、HttpOnly属性和域名。
查看登录状态:
客户端请求查看登录状态,携带user-token的Cookie。
Server端判断Cookie是否存在,如果存在,则通过UUID到Redis中查询用户信息是否过期。
如果未过期,则刷新有效期并返回用户信息;如果已过期,则返回未登录状态。
注销登录:
客户端请求注销登录,携带UUID。
Server端通过UUID删除对应的Cookie和Redis中的用户信息。
JWT(JSON Web Token):JWT是一套开放的标准(RFC 7519),用于安全地在客户端和服务器端传输JSON格式的信息。JWT由Header、Payload和Signature三部分组成,通过Base64编码和加密算法生成一个唯一的Token。
登录流程:
用户输入账号和密码进行登录。
Server端验证用户信息,如果验证通过,则生成JWT Token,并返回给客户端。
客户端将Token存储在Cookie中,并设置Cookie的路径、HttpOnly属性和域名。
验证流程:
客户端请求访问受保护资源,携带JWT Token(通过Cookie)。
Server端对JWT Token进行解码和验证,如果验证通过,则允许访问资源;如果验证失败,则返回未授权状态。
注销登录:
客户端请求注销登录。
Server端可以通过某种方式(如黑名单机制)使JWT Token失效,或者客户端直接删除存储的Token。
由于同源策略(协议、域名、端口一致)的限制,SSO在实现过程中可能会遇到跨域问题。解决跨域问题的方法有多种,常见的有JSONP、CORS等。
JSONP:JSONP是一种通过<script>标签实现跨域请求的技术。客户端通过<script>标签的src属性指向Server端的跨域接口,并在接口返回的数据中包含一个回调函数名,Server端将数据作为回调函数的参数返回给客户端。客户端通过定义该回调函数来处理返回的数据。
CORS:CORS(Cross-Origin Resource Sharing)是一种允许Web应用服务器进行跨源访问的机制。Server端通过设置响应头中的Access-Control-Allow-Origin等字段来允许或拒绝来自不同源的请求。客户端在发起跨域请求时,可以设置withCredentials: true来携带Cookie等凭据信息。
优势:
提升用户体验:用户只需登录一次即可访问平台下的所有系统和应用。
降低管理成本:统一身份认证和权限管理,减少重复工作。
增强安全性:通过集中管理和审计,提高系统的安全性。
挑战:
跨域问题:需要解决同源策略的限制,实现跨域请求和响应。
会话管理:需要维护全局唯一的会话标识,并处理会话过期和注销等问题。
安全性:需要防止Token泄露和中间人攻击等安全问题。
综上所述,SSO是一种高效、便捷的身份认证机制,但在实现过程中需要解决跨域问题、会话管理和安全性等挑战。通过合理的设计和实现,可以为用户提供更好的登录体验和管理效率。