🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# :-: 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)