# :-: API鉴权
## 简介
* Secure 基于 JWT 封装,每次请求的时候,会拦截到需要鉴权的API请求,并对其请求头携带的Token进行认证。
* 若 Token 过期、不存在、错误,都会导致鉴权失败,继而无法访问到对应的API。
* SpringBlade 的安全框架 Secure 在[applets-Tool]中,有兴趣的小伙伴可以阅读下源码,查看实现原理。
* 本章介绍 Secure 的基本使用方法。
## 如何通过认证
1. 首先需要访问Auth接口,传入账号名密码,获得授权成功后的信息
2. 启动`AuthApplication`、`UserApplication`、`BladeLogApplication`三个服务
![](https://box.kancloud.cn/f929267260b15605e6eda440fab138ae_379x186.png)
3. 调用[http://localhost/applets-auth/token](http://localhost/applets-auth/token)传入对应参数,如下图所示则说明认证信息获取成功(商业版的用户请查看OAuth2章节)
`("c3dvcmQ6c3dvcmRfc2VjcmV0"为clientId:clientSecret串转换为的base64编码,这个是可变的)`
![](https://img.kancloud.cn/29/df/29df803a5be4b87f3d19509b07c19b50_1137x324.png)
![](https://img.kancloud.cn/26/ae/26aeaf18f6bf97e78bb2eb5e2b0e6d62_1173x691.png)
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`说明鉴权成功!
![](https://img.kancloud.cn/1b/e3/1be3d8078fa68002548140d136d007df_1161x463.png)
7. 理论上看,所有业务API,都需要进行鉴权,这样才能保证整个系统的安全性,但也有个别特例情况,API 不需要认证也可以调用,这里就需要用到 Secure 的 API 放行配置。
8. 有些业务 API 鉴权就算成功,也有可能需要根据角色权限来判断是否可以调用,这里就需要用到 Secure更细颗粒度的鉴权配置。
## API 鉴权
### 配置API放行
1. 参考`applets-auth`模块,将`RegistryConfiguration`拷贝至`applets-demo`中(**商业版由于集成oauth2,已将其移除,按照第二点的截图直接新增即可**)
![](https://img.kancloud.cn/63/63/6363fb70dc620b9da7e445be060c88c7_646x681.png)
2. 我们将放行的 API 配置改为`/api/info`
![](https://box.kancloud.cn/0f13d072c9c11345d1dd4e3490e2ad02_607x315.png)
3. 若需要拦截某个api下所有的请求,则可以改为`/api/**`, 其中`**`则代表下层所有请求
4. 重启工程,去掉请求头,可以看到,请求成功了,说明`API 放行`配置成功
![](https://img.kancloud.cn/24/a6/24a6c2fc0749b1621e26cbd40b269157_1138x432.png)
### 细颗粒度鉴权配置
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
- 开发进阶