[TOC] ## 一、原理说明 ### 1.1. 基本原理 ![](https://img.kancloud.cn/b4/ef/b4ef61edc3d42817f1ca8be01cf51603_441x479.png) SSO单点登录是基于共享`auth-server授权中心`的`cookie`来实现的,大概流程如下: 1. 当**系统1**登录成功后 2. **auth-server授权中心**里面会保存了**系统1**中的登录信息建立全局会话,并把自己的cookie写到用户的浏览器中 3. 当同一个浏览器访问**系统2**时,当跳转到**auth-server授权中心**授权时会把浏览器中`auth-server`的`cookie`也带过去 4. **auth-server授权中心**根据自己的`cookie`判断该浏览器的用户已经登录过,则自动登录完成**单点登录** ### 1.2. 架构图 ![](https://img.kancloud.cn/33/fc/33fc69dc35dcc4dfd09b0d19b0cafc26_806x880.jpg) >[info] webApp应用可以使用其他oauth2模式登录不一定必需`password模式`,但是如果多个系统之间不同域(跨域)则必需使用`授权码`或者`简单`模式 ### 1.3. 单点时序图 ![](https://img.kancloud.cn/3a/d7/3ad7ac25a0eadec1e1f4ae393ea29af3_1209x1102.jpg) ### 1.4. 单点登录的请求步骤 下图是访问`sso-demo`的地址[http://127.0.0.1:8001](http://127.0.0.1:8001/)时`@EnableOAuth2Sso`注解与`auth-server授权中心`通过`Oauth2授权码模式`交互完成单点登录的步骤 ![](https://img.kancloud.cn/04/cc/04cc3ad1b09c07e3e50d10917104e9fa_1186x513.png) > 结合上面`单点时序图`中**访问系统2**的1~5步 ### 1.5. 基于`Spring Security`实现 ![](https://img.kancloud.cn/da/f3/daf3a658eeff31d1b79e035afdb2549d_1062x495.png) 最简单的方式就是使用`Spring Security`的`@EnableOAuth2Sso注解`,该注解会自动添加一个认证过滤器,自动完成`授权码模式`的oauth2授权流程 > 如果不是使用`Spring Security`框架或者不想用`授权码模式`怎么办?按照原理自己实现即可 ![](https://img.kancloud.cn/4f/ec/4fecf5aa0f667f62654d1e3209956050_901x424.png) > **security.oauth2.sso.login-path**:设置回调地址(默认是/login) ## 二、注意事项 ### 2.1. 授权类型 ![](https://img.kancloud.cn/a1/20/a12032bbb2ce543f2ff5da416ef87e58_1153x139.png) 应用的授权类型需要支持`授权码模式`参考上图#2位置,应用的`authorized_grant_types`字段需要支持授权码模式 ### 2.2. 回调地址 ![](https://img.kancloud.cn/a1/20/a12032bbb2ce543f2ff5da416ef87e58_1153x139.png) 回调地址必需与应用配置的地址一致,参考上图的#3位置,可以通过`security.oauth2.sso.login-path`配置指定回调地址,否则会出现一下错误 ![](https://img.kancloud.cn/61/5e/615e589aef9119b8d24bcb84c1bcbee7_1634x350.png) ### 2.3. 单点的系统间访问auth-server的域名必需一致 由于原理是共享`auth-server授权中心`的`cookie`,首先需要使用同一个浏览器访问,并且不同系统跳转auth-server时所使用的域名必需一致才能`共享cookie` >[danger] 一个用域名访问auth-server另一个用ip访问auth-server不行 >[danger] 一个用`localhost`访问auth-server另一个用`127.0.0.1`访问auth-server也不行