授权
授权指认证成功后系统对主体
对指定资源
执行指定操作
的权限控制。
#
基本概念- 主体(
subject
):执行操作的主体,通常是用户(user
)、也可以是程序。 - 角色(
role
):权限的集合,同一角色的用户将用有一组相同的权限。 - 权限(
privilege
):权限定了允许哪些用户、角色对本哪些资源执行哪些操作 - 资源(
resourse
):操作的对象。在 REST 世界中在表现层以 URI 形式呈现。 - 资源许可(
resourse permission
):权限定了允许哪些用户对本哪些资源执行哪些操作。
#
权限控制策略权限控制策略有 3 种:基于主体属性
、基于角色
、基于资源许可
。
对于大部分互联网产品来说 C 端只有单一角色,和 B 端的协作关系也极其简单,(工具类的产品可能很复杂,如 SaaS 型 OA 系统),可采用基于主体属性的策略; B 端则通常是一个典型的企业级应用场景,基于角色的权限控制策略是一个不错的选择。基于资源许可的策略是为了满足更加细化的需求。
#
基于用户属性基于主体属性来实现权限控制适合较简单的权限关系。例如,一款在线服务产品分普通和 VIP 两种用户。普通用户能使用部分功能,VIP用户能使用所有功能。
这里需要强调
简单的权限关系
,站在业务的角度 VIP 用户所享有的特权背后可能是极其庞大复杂的业务逻辑,但站在权限关系的角度这仍然是一个简单模型,用一个属性区分即可。
下面通过一个例子来说明如何通过主体属性来实现权限控制。
业务场景
API 及 Policy
#
基于角色较复杂的权限关系适合采用基于角色的权限控制。例如,一个企业 ERP 系统中有 员工、项目经理、部门经理、总经理等角色划分,他们在系统中拥有不同的权限,相互协作。
下面通过一个例子来说明如何通过角色来实现权限控制。
业务场景
API 及 Policy
#
资源许可有些业务场景要求根据资源本身的访问许可来实现访问控制,这是更加细化的访问控制。例如,一个重要的报表文件被要求设置成只能某几个部门经理有权限访问,这个业务场景是基于主体属性、角色策略无法满足的。另外的一个非常典型的例子就是微信朋友圈发帖时可以设置谁可以看(公开、秘密、部分可见、不给谁看)。
下面通过一个例子来说明如何通过资源许可实现权限控制。
业务场景
API 及 Permission
#
权限控制实现权限控制策略 | 实现方式 | 未通过检查时的响应 |
---|---|---|
基于主体属性 | 基于 subject_property policy 的权限检查 | 403 Forbidden NOT_AUTHORIZED 没有被授权访问当前资源 |
基于角色 | 基于 role policy 的权限检查 | 403 Forbidden NOT_AUTHORIZED 没有被授权访问当前资源 |
基于资源许可 | 基于 resourse 数据主体中 permission 定义的权限检查 | 403 Forbidden NOT_AUTHORIZED 没有被授权访问当前资源 |
其他 | 具体的业务逻辑代码 | 400 Bad Request INVALID_REQUEST 没有被授权访问当前资源 |
#
设计与实现设计一个权限检查过滤器,访问控制权限检查逻辑为:
- 校验用户令牌,取得用户信息;
- 请求发送者的身份(用户的 ID、用户的类型、加入的组织及在各组织中的角色等信息)
- 请求操作的资源
- 根据路由定义从 HTTP 请求路径中解构路径参数;
- 根据权限检查配置,使用路径参数构造权限检查过滤器的参数;
- 执行访问权限检查。
- 用户类型检查;
- 所有者检查;
- 用户所属群组检查;
- 用户所属群组角色检查;
- 资源访问许可检查。
#
角色#
业务逻辑配置路由时,我们可以为每一个路由设置一个权限检查的参数,路由器根据客户端请求的路径以及这个权限检查配置参数解构出上述权限检查过滤器的 permission
参数,并将其与访问令牌携带的用户信息一起传递给权限检查过滤器函数。
例如,消费者取消未支付订单接口的路由定义及其权限检查配置参数为:
店员修改订单应付金额接口的路由定义及其权限检查配置参数为:
这里我们增加一个需求:店员在店铺的角色必须为销售员(
salesman
)
管理员取消已支付订单的路由定义及其权限检查配置参数为:
下面是店员管理商品的接口的权限设计。
创建商品的路由定义及其权限检查配置参数:
更新商品的路由定义及其权限检查配置参数: