【SpringBlade-权限缺陷】API鉴权逻辑缺陷漏洞
一、理论部分
简介
-
Secure 基于 JWT 封装,每次请求的时候,会拦截到需要鉴权的API请求,并对其请求头携带的Token进行认证。 若 Token 过期、不存在、错误,都会导致鉴权失败,继而无法访问到对应的API。 SpringBlade 的安全框架 Secure 在 中 本章介绍 Secure 的基本使用方法。
如何通过认证
- 首先需要访问Auth接口,传入账号名密码,获得授权成功后的信息
- 启动AuthApplication、UserApplication、 BladeLogApplication三个服务
- 调用 传入对应参数,如下图所示则说明认证信息获取成功 ("c3dvcmQ6c3dvcmRfc2VjcmV0"为clientId:clientSecret串转换为的base64编码,这个是可变的)
4.从返回的Json中取到 tokenType 和 accessToken,将他们拼接起来并以逗号隔开
5.设置请求头为blade-auth,请求头对应的值为 tokenType + + accessToken (后续的所有接口调用都需要带上请求头为 Authorization 值为 c3dvcmQ6c3dvcmRfc2VjcmV0)
6.再次调用 发现返回 Hello, My Name Is: Chill 说明鉴权成功!
7.理论上看,所有业务API,都需要进行鉴权,这样才能保证整个系统的安全性,但也有个别特例情况,API 不需要认证也可以调用,这里就需要用到 Secure 的 API 放行配置。
8.有些业务 API 鉴权就算成功,也有可能需要根据角色权限来判断是否可以调用,这里就需要用到 Secure更细颗粒度的鉴权配置。
扩展:密码可能会进行二次加密
如这一个admin就是md5加密后
将得到的Authorization、Blade-Auth填入
(请求参数Params中填name:vulue即可)
API 鉴权
配置API放行
- 若是使用SpringBoot版本,前往对应配置文件,增加接口放行配置
2.若是使用SpringCloud,则打开nacos,找到对应配置文件增加接口放行配置
3.若需要拦截某个api下所有的请求,则可以改为 /api/**, 其中 ** 则代表下层所有请求
4.重启工程,去掉请求头,可以看到,请求成功了,说明 API 放行 配置成功
细颗粒度鉴权配置
- 鉴权配置用到了 Secure 模块的 @PreAuth 注解
- 为了可以起到对比的作用,对 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 文档地址:
二、实战部分
更多请参考springBlade开发手册:
下一篇:
VS常规配置及快捷键使用技巧