changgou-day09
目标
- 理解 【单点登录】
- 理解【第三方登录】
- 掌握实现单点登录的技术
- CAS
- shiro
- spring security + jwt
- oauth2.0(掌握的),也能实现第三方的登录,授权
- 最终的解决方案:spring cloud security + jwt +oauth2.0+RSA算法实现畅购的单点登录和授权。
- oauth2.0
- 授权模式
- 角色
- 掌握解决方案的思路。
1 单点登录
实现单点登录的技术:用户只需要登录一次,就可以访问相互信任的系统。这种解决方案就是 单点登录(SSO).
1.自定义实现 利用token机制。
2.CAS
3.shiro
4.spring security +jwt
5.oauth2.0
2 第三方登录
就是通过第三方的软件来进行登录。
实现第三方认证的技术解决方案:(oauth 2.0)
使用oauth2.0实现第三方的认证的例子。3 oauth2.0
官方的流程:oauth2.0是一种协议,允许用户授权 第三方 访问其他的系统。
``` 角色:
- 客户端
- 资源拥有者
- 认证服务器
- 资源服务器
客户端 请求 资源拥有者 授权
资源拥有者 授权客户端
客户端 去认证服务器申请令牌
客户端携带令牌 到资源服务器 获取资源
1.授权码模式(Authorization Code) * 2.隐式授权模式(Implicit) 3.密码模式(Resource Owner Password Credentials) * 利用密码模式实现单点登录。 4.客户端模式(Client Credentials)<a name="Jdqs2"></a>
### 4 搭建认证服务器
参考工程
<a name="UC4xu"></a>
### 5 授权模式
公钥 和私钥 秘钥对: 非堆成加密算法 RSA算法 私钥 加密 公钥进行【校验】 公钥 加密 私钥进行【解密】认证的表结构:用于存储客户端的注册的信息<br />![](https://cdn.nlark.com/yuque/0/2021/png/12589476/1636038878452-453864da-1489-46f0-959a-e453ee95ae59.png#id=x8knU&originHeight=688&originWidth=1178&originalType=binary&ratio=1&status=done&style=none)
<a name="G0Xwk"></a>
### 6 公钥和私钥
1.用户打开页面 2.输入用户名和密码 3.认证服务器接收到用户 请求 获取到用户名和密码 4.认证服务器作为客户端 发送请求 去认证服务器 申请令牌 5.传递参数(usernme,password ,grant_type(写死),client_id(写死),client_secret(写死)) 6.认证服务器颁发了令牌给 客户端(认证服务器) 7.将数据进行处理好了之后,返回给页面(1.放到cookie)<a name="PVZPb"></a>
### 7 认证流程说明
![](https://cdn.nlark.com/yuque/0/2021/png/12589476/1636038878578-f7f632ee-42a8-4bc9-bee8-000ca69e24b3.png#id=pWsoa&originHeight=463&originWidth=1084&originalType=binary&ratio=1&status=done&style=none)
<a name="fHlIH"></a>
### 8 认证(登录并申请令牌流程)
![](https://cdn.nlark.com/yuque/0/2021/png/12589476/1636038878663-58457848-4ad5-49ad-bf27-9bb16826a7cf.png#id=uB34x&originHeight=393&originWidth=1273&originalType=binary&ratio=1&status=done&style=none)
https://projects.spring.io/spring-security-oauth/docs/oauth2.html ```<a name="yyAgg"></a>
### 9 认证服务器项目结构
![](https://cdn.nlark.com/yuque/0/2021/png/12589476/1636038878762-0636f801-a389-492e-966a-53ce8344b07b.png#id=Tftkt&originHeight=574&originWidth=1177&originalType=binary&ratio=1&status=done&style=none)