概念
单点登录(Single Sign-On,SSO)是一种身份验证服务,允许用户使用单个标识来登录多个应用程序或系统。如下图所示,用户只需要用户名/密码登陆一次就可以访问系统A、系统B和系统C。
在传统的登录方式中,用户必须为每个应用程序或系统提供不同的凭据和密码。如下图所示,用户访问系统A、系统B和系统C都必须用用户名/密码登陆。
这种方式既不方便也容易被攻击者利用,而 SSO 解决了这个问题,使得用户只需通过一次身份验证就可以无缝地访问多个应用程序或系统,从而提高了用户体验的便利性和安全性。
单点登陆的优点
- 用户体验改善:用户只需要登录一次,就可以访问多个系统或应用程序,不需要重复输入用户名和密码。这可以大大提高用户的工作效率。
- 安全性增强:单点登陆可以提供更高级别的安全性,因为用户只需要在一个系统中进行身份验证,其他系统就可以共享这个身份验证信息。这可以有效地防止黑客入侵多个系统。
- 管理更方便:单点登陆可以简化管理员的工作,因为它可以集中管理用户和权限。管理员可以在一个系统中管理多个系统的用户和权限,这样可以更方便地进行管理和维护。
单点登陆的实现方式
- 共享身份验证:多个系统共享一个身份验证系统,用户只需要在一个系统中进行身份验证,就可以访问所有系统。这种方式需要建立一个共享的身份验证系统,这样可以保证用户信息的安全性。
- 代理身份验证:一个系统代表其他系统进行身份验证,用户在登录时输入用户名和密码,然后其他系统会代表用户进行身份验证。这种方式需要建立一个代理系统,这样可以保证用户信息的安全性。
- 基于令牌的身份验证:用户在登录后,会获得一个令牌,这个令牌可以在多个系统上进行身份验证。这种方式需要建立一个令牌管理机制,这样可以保证用户信息的安全性。
实战一
架构图
- 用户输入用户名/密码登陆 ServiceA 系统;
- 用户点击 ServiceA 系统中的某个按钮跳转到 ServiceB 系统,在跳转时需要带上 ServiceA 系统颁发的 ticket 票据;
- ServiceB 系统拿 ServiceA 系统的 ticket 去获取 ServiceA 系统的用户信息;
- ServiceA 系统会校验该 ticket 票据,然后将用户信息返回给 ServiceB 系统;
- ServiceB 系统根据用户信息生成 token 并附带重定向地址返回给 ServiceA 系统;
- ServiceA 系统就可以拿着获取的 token 去访问 ServiceB 系统的资源信息了。
代码实现
数据库
首先是初始化数据库,用户、公司等表依据自己的具体业务而定,此处不再赘述。提供公共的单点登陆信息表。
插入测试数据
- platform_id和platform_secret,阿Q是使用 apache 的 commons-lang3 包下的RandomStringUtils.randomAlphanumeric()方法生成的。
- sso_url就是上边提到的 ServiceB 系统的地址。
- encrypt_type、public_key在此方式中未使用,可以忽略。
细心的阿Q还给大家准备了一个接口,只需要传入 platformName 和 ssoUrl 就可以自动生成单点登陆信息。
接下来我们就进入真正的代码部分了,回复“sso”即可获取实战源码。
A跳转B
B获取票据,并请求A获取用户信息
A提供的获取用户信息接口
测试结果
实战二
架构图
这次我们用 ServiceB 系统单点登陆 ServiceA 方式:
- 用户输入用户名/密码登陆 ServiceB 系统;
- 用户点击 ServiceB 系统中的某个按钮跳转到 ServiceA 系统,在跳转时需要带上 ServiceB 系统加密后的用户信息;
- ServiceA 系统拿到 ServiceB 系统加密后的用户信息后进行验签和解密操作;
- ServiceA 系统将用户信息保存到本地并生成 token 返回给 ServiceB 系统;
- ServiceB 系统拿到 ServiceA 系统返回的 token 就可以访问 ServiceA 系统的资源信息了;
代码实现
此种方式就用到了上边提到的数据库中的encrypt_type、public_key字段,其中 public_key 是 ServiceA 给 ServiceB 提供的。为了演示方便直接在application.yml中进行配置。
B的配置
A的配置
B跳转A并加密用户信息
A获取用户信息后续操作
你可能会好奇,验签解密的逻辑去哪了?
此处我们通过注解的方式实现自动验签和解密的逻辑,至于具体的逻辑,大家可以回复“sso”获取源码自行解读,当然后续阿Q还会推出新的文章进行详细的讲解,点击关注【阿Q说代码】进行预约吧!
测试
补充知识
本文中用到的 RSA 的密钥是通过在线网站https://www.bchrt.com/tools/rsa/生成的,当然大家也可以使用 hutool 中的 RSA 类来生成,也可以使用 java 自带的 security 来生成。
原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/315059.html