[TOC]
*****
# 1. 有状态 VS 无状态
```
1-1. 传统架构(有状态)
通常Sessinon Stroe可以是redis 或者 Memcached
```
![](https://img.kancloud.cn/a8/6c/a86c18715e54ba9322ab8e92afc70bc6_807x471.png)
```
1-2. 微服务架构(无状态)
无状态模式下服务器端只做解密和校验,不做存储;由客户端(浏览器)做存储
```
![](https://img.kancloud.cn/1d/bf/1dbf1a4c0a1daf266982a4c77e2e3b9e_726x435.png)
```
1-3. 优缺点对比
```
![](https://img.kancloud.cn/91/2d/912d0856f2af30ca47740643a3e2310f_799x295.png)
# 2. 微服务常用的安全登录方案(认证/授权)
```
2-1. "处处登录"方案(OAth2.0)
参考: https://www.cnblogs.com/cjsblog/p/10548022.html
OAth2.0系列文档: http://ifeve.com/oauth2-tutorial-all/
Spring Cloud Security认证授权示例代码: https://github.com/chengjiansheng/cjs-oauth2-sso-demo.git
Keycloak认证授权示例代码: https://www.github.com/eacdy/spring-cloud-yes.git
```
```
2-2. 微服务认证方案-[外部无状态,内部有状态方案]
```
![](https://img.kancloud.cn/e6/26/e6269795aa91f48db9d69e5636e270aa_781x442.png)
```
2-3. 微服务认证方案-“网关认证授权,内部裸奔”方案
缺点: 网关被攻破,不安全
```
![](https://img.kancloud.cn/67/a6/67a6af26890170f4a64208fdab2dc1cd_776x347.png)
```
2-4. 微服务认证方案-“内部裸奔”改进方案
```
![](https://img.kancloud.cn/60/4d/604d90ea34742aaa6be5a795a1264b91_761x447.png)
```
2-5. 微服务认证方案-方案对比与选择
```
![](https://img.kancloud.cn/52/2d/522d23943790247fa51bb7e156625e5a_749x236.png)
# 3. 访问控制模型(授权)
```
即满足什么样的条件,才允许访问
```
![](https://img.kancloud.cn/08/69/0869d9f85d46186cf991a6cf4778ce55_527x338.png)
```
实现RBAC模型,如下:
简单的说,就是为用户分配角色,用角色关联权限
```
![](https://img.kancloud.cn/e1/3d/e13d3a785e7d44ff071c578615af4d1b_756x162.png)
# 4. JWT是什么?【是什么、组成、上手】
```
1. JWT是什么?
JWT(JSON Web Token) 是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,
用于作为JSON对象在各方之间安全地传输信息.该信息可以被验证和信任,因为它是数字签名的.
```
```
2. JWT组成
Token=Base64(Header).Base64(Payload).Base64(Signature) 如: aaa.bbb.ccc
Signature=Header指定的签名算法(Base64(Header).Base64(Payload), 秘钥), HS256("aaa.bbb",秘钥)
```
![](https://img.kancloud.cn/34/08/3408872fe46dc0e54cbb35580afab478_756x162.png)
```
开发参考文档: https://www.imooc.com/article/290892
```
# 5. AOP实现登录状态检查
```
1. 过滤器
2. 拦截器
3. Spring AOP
```
# 6. Feign实现Token传递
```
1. 单个方法传递在请求参数及调用Feign接口的参数传递 @RequestHeader("X-Token")
2. 统一处理:
/**
* feign中拦截器传递Token
* @FeignClient(configuration = TokenRelayRequestIntecepor.class)
*/
public class TokenRelayRequestIntecepor implements RequestInterceptor {
@Override
public void apply(RequestTemplate template) {
//1. 获取到Token
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
ServletRequestAttributes attributes = (ServletRequestAttributes)requestAttributes;
HttpServletRequest request = attributes.getRequest();
String token = request.getHeader("X-Token");
//2. Token传递
if(StringUtils.isNotBlank(token)) {
template.header("X-Token", token);
}
}
}
```