前言
最近老板让我实现一个可以统一全部业务的权限系统,说实话,一开始我自信满满。但是不断深入研究后,心里就开始慌了,这也太难了!但是毕竟东西都是人做的,慢慢搞总会搞出来的。我阅读了大量的文章,找了各种解决方案,在不断的研究以及试错之中不断的总结。本篇就是在研究中的一个经验,希望能对大家有所启发。
权限系统介绍
目前我们业务中的权限系统非常的分散,主要都是由各个业务系统本身进行维护,但是我们的业务本身是打通的,为了方便管理以及统一授权和鉴权,我们急需研发一套通用的权限系统。
一个通用的权限系统应该满足以下几点:
- 向各种各样的业务去提供一个统一的、满足各类业务要求的鉴权服务
- 控制业务系统的菜单渲染能力,其实就是对有权限资源的listObjects能力
- 不能向用户(业务开发人员)展现太大的复杂度
- 要让原本的业务系统使用我们的权限系统之后业务改造成本足够低
- 不能与业务系统产生过多交互
- 支持环境属性(ip 时间)
ABAC和OPA
ABAC
由于我们需要统一各种业务的权限系统,比如文档,表单,这种粒度非常小的资源,使用ABAC
是一个非常适合的权限模型之一,那为什么不用RBAC
呢?
RBAC
是一个在权限系统中常见的权限模型,非常适用于菜单这种资源,相信很多人了解RBAC
也是通过菜单的权限管理来的。但是对于细粒度的资源,RBAC就会产生角色爆炸的问题。所以我们要做一个统一的权限系统,就直接将RBAC
排除掉。
所以我们需要更细粒度的权限控制就可以选择ABAC
的权限模型,而OPA
就是ABAC
现在市面上常规的实现。
哪些公司用到了OPA
我在研究权限系统的过程中阅读了很多的文章,并从中窥见了一些大厂的权限的实现方式,并且可以看到OPA的广泛应用场景,比如这些:
- 阿里云,亚马逊云
- 国内的付费软件Authing(为知乎提供了权限控制)
- 权限系统Styra
- 开源项目Zadig
说了半天,那什么是OPA呢?
OPA
Open Policy Agent (OPA) 是一种开源的通用策略引擎,可在整个堆栈中实现统一、上下文感知的策略控制。OPA 可将策略决策与应用程序的业务逻辑分离(解耦),透过现象看本质,策略就是一组规则,请求发送到引擎,引擎根据规则来进行决策。
OPA 并不负责具体任务的执行,它仅负责决策,需要决策的请求通过 JSON 的方式传递给 OPA ,在 OPA 决策后,也会将结果以 JSON 的形式返回。
本文不做详细介绍,如果你想了解更多关于OPA的相关内容,我在可以这里分享部分我看过的文章。
- cloudnative.to/blog/introd…
- Golang访问控制框架:Open Policy Agent与Casbin之争
- www.cnblogs.com/jingzh/p/17…
- 云上细粒度访问管理的参考架构
- 使用OPA策略实现细粒度访问控制
- OPA 实现 ABAC 权限模型
为什么我不推荐使用OPA
虽然我看了很多的OPA相关的文章,但是让我越看,越心寒,这玩意儿也太复杂了吧。所以我直接抛弃了OPA
几个原因:
-
OPA的策略较为复杂,学习成本较高。
-
OPA与资源数据耦合,需要有input的数据。
-
不能实现授权只能鉴权。
-
对于层级关系的传递,判断复杂(为什么会有这一条。我后面的文章介绍ReBAC时会说到)。
破坏了最初的权限系统的初衷
我现在要做一个统一的权限系统,各个业务都需要接入,那么策略谁写,难不成要我写吗🐶。当然是各个业务自己去定义自己业务的策略。
OPA的策略语言是Rego,虽然也不难,但是我怎么才能去说服大家去学呢。
而且OPA需要提供一个input的数据(OPA只做决策)。
业务开发人员一定给我一个大大的问号!
“你是说,你是一个通用的权限系统,但我还要把if else这种权限判断语句在你那里再实现一遍,而且要我把业务数据给你传进去?”
如果我们要实现一个通用且低学习成本的权限系统,那么我们最佳的方式就是提供一个API,让别人直接实现授权、鉴权,这样才能统一,并且开箱即用。
OPA的反向例子
在寻找OPA的解决方案过程中,我希望能够看见一个使用OPA的具体例子。于是在拜读了Zadig分享的文章-《Zadig 基于 OPA 实现 RBAC 和 ABAC 权限管理技术方案详解》之后去GitHub上拉了对应的代码。
Zadig介绍
Zadig 是由 KodeRover 公司基于 Kubernetes 研发的自助式云原生 DevOps 平台,源码 100% 开放。Zadig 提供灵活可扩展的工作流支持、多种发布策略编排以及一键安全审核等特性。该平台还支持定制的企业级 XOps 敏捷效能看板,深度集成多种企业级平台,并通过项目模板化批量快速接入,实现数千个服务的一键纳管治理。其主要目标是帮助企业实现产研的数字化转型,使工程师成为创新引擎,并为数字经济的无限价值链接提供支持。
但是!!!
当我去看源代码时发现代码中没有OPA,只有之前的版本里面有,于是在网上他们的各种渠道去了解为什么他们移除了OPA。
终于在对方的哔哩哔哩账号中找到了原因!!!
总结
最后的总结就是,如果你要做一个小的权限系统,可以用OPA试试。但是如果你要应对一个很复杂的权限控制,哥们,我劝你别用OPA!!!
甚至于ABAC都不一定是一个很好的方案,因为ABAC实践起来非常复杂,所以市面上目前还没有一个常见且通用的ABAC解决方案。
最后留一个狗头。
最后还要说一句,本文为本人呕心力作,非本人允许,请勿转载🐶。