[TOC]
*****
# 1. 有狀態 VS 無狀態
```
1-1. 傳統架構(有狀態)
通常Sessinon Stroe可以是redis 或者 Memcached
```

```
1-2. 微服務架構(無狀態)
無狀態模式下服務器端只做解密和校驗,不做存儲;由客戶端(瀏覽器)做存儲
```

```
1-3. 優缺點對比
```

# 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. 微服務認證方案-[外部無狀態,內部有狀態方案]
```

```
2-3. 微服務認證方案-“網關認證授權,內部裸奔”方案
缺點: 網關被攻破,不安全
```

```
2-4. 微服務認證方案-“內部裸奔”改進方案
```

```
2-5. 微服務認證方案-方案對比與選擇
```

# 3. 訪問控制模型(授權)
```
即滿足什么樣的條件,才允許訪問
```

```
實現RBAC模型,如下:
簡單的說,就是為用戶分配角色,用角色關聯權限
```

# 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://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);
}
}
}
```