# :-: API鑒權
## 簡介
* Secure 基于 JWT 封裝,每次請求的時候,會攔截到需要鑒權的API請求,并對其請求頭攜帶的Token進行認證。
* 若 Token 過期、不存在、錯誤,都會導致鑒權失敗,繼而無法訪問到對應的API。
* SpringBlade 的安全框架 Secure 在[applets-Tool]中,有興趣的小伙伴可以閱讀下源碼,查看實現原理。
* 本章介紹 Secure 的基本使用方法。
## 如何通過認證
1. 首先需要訪問Auth接口,傳入賬號名密碼,獲得授權成功后的信息
2. 啟動`AuthApplication`、`UserApplication`、`BladeLogApplication`三個服務

3. 調用[http://localhost/applets-auth/token](http://localhost/applets-auth/token)傳入對應參數,如下圖所示則說明認證信息獲取成功(商業版的用戶請查看OAuth2章節)
`("c3dvcmQ6c3dvcmRfc2VjcmV0"為clientId:clientSecret串轉換為的base64編碼,這個是可變的)`


4. 從返回的Json中取到`tokenType`和`accessToken`,將他們拼接起來并以逗號隔開
5. 設置請求頭為`applets-auth`,請求頭對應的值為`tokenType`+`' '`+`accessToken`(后續的所有接口調用都需要帶上請求頭為`Authorization`值為`c3dvcmQ6c3dvcmRfc2VjcmV0`)
6. 再次調用[http://localhost/applets-demo/api/info?name=Chill](http://localhost/applets-demo/api/info?name=Chill)發現返回`Hello, My Name Is: Chill`說明鑒權成功!

7. 理論上看,所有業務API,都需要進行鑒權,這樣才能保證整個系統的安全性,但也有個別特例情況,API 不需要認證也可以調用,這里就需要用到 Secure 的 API 放行配置。
8. 有些業務 API 鑒權就算成功,也有可能需要根據角色權限來判斷是否可以調用,這里就需要用到 Secure更細顆粒度的鑒權配置。
## API 鑒權
### 配置API放行
1. 參考`applets-auth`模塊,將`RegistryConfiguration`拷貝至`applets-demo`中(**商業版由于集成oauth2,已將其移除,按照第二點的截圖直接新增即可**)

2. 我們將放行的 API 配置改為`/api/info`

3. 若需要攔截某個api下所有的請求,則可以改為`/api/**`, 其中`**`則代表下層所有請求
4. 重啟工程,去掉請求頭,可以看到,請求成功了,說明`API 放行`配置成功

### 細顆粒度鑒權配置
1. 鑒權配置用到了 Secure 模塊的`@PreAuth`注解
2. 為了可以起到對比的作用,對`count`進行權限放行(只要通過Token認證就可調用API)。
~~~
@GetMapping("count")
@PreAuth("permitAll()")
public Integer count(Integer cnt) {
return cnt * 10;
}
~~~
3. 對`info`進行權限判斷,調用方需要擁有`test`的角色權限才可以調用
~~~
@GetMapping("info")
@PreAuth("hasRole('test')")
public String info(String name) {
return "Hello, My Name Is: " + name;
}
~~~
4. 調用`/api/count`發現請求成功。
5. 調用`/api/info`發現又變回了`請求未授權`,因為我們的`admin`賬號沒有分配`test`角色
6. 嘗試改回`admin`權限
~~~
@GetMapping("info")
@PreAuth("hasRole('administrator')")
public String info(String name) {
return "Hello, My Name Is: " + name;
}
~~~
7. 調用`/api/info`發現請求成功。
## 結尾
* Secure 框架進行了兩層 API 鑒權。
* 第一層校驗請求攜帶的Token是否合法,不需要Token校驗的可通過配置放行。
* 第二層校驗`@PreAuth`配置的邏輯是否符合,若不符合也返回`請求未授權`。
* 注解`@PreAuth`支持類層級和方法層級,放到類層級則對該類的所有方法進行鑒權。
* 注解`@PreAuth`還支持 Spring el 表達式,可拓展性非常高,更多功能等您挖掘~
* Spring el 文檔地址:[https://docs.spring.io/spring/docs/4.3.16.RELEASE/spring-framework-reference/htmlsingle/#expressions-operators-logical](https://docs.spring.io/spring/docs/4.3.16.RELEASE/spring-framework-reference/htmlsingle/#expressions-operators-logical)
- 序
- 快速開始
- 環境要求
- 環境準備
- 工程導入
- 工程運行
- 技術基礎
- Java8
- Lambda
- Lambda 受檢異常處理
- Stream 簡介
- Stream API 一覽
- Stream API(上)
- Stream API(下)
- Optional 干掉空指針
- 函數式接口
- 新的日期 API
- Lombok
- SpringMVC
- Swagger
- Mybaties
- Mybaties-plus
- 開發初探
- 新建微服務工程
- 第一個API
- API鑒權
- API響應結果
- Redis 緩存
- 第一個CRUD
- 建表
- 建Entity
- 建Service和Mapper
- 新增API
- 修改API
- 刪除API
- 查詢API
- 單條查詢
- 多條查詢
- 分頁
- 微服務遠程調用
- 聲明式服務調用Feign
- 熔斷機制 Hystrix
- 開發進階