有人用过 casbin?后台权限管理你们一般如何选型?

2019-01-27 18:31:05 +08:00
 zhuzhibin

begin

最近再琢磨 casbin,支持多种 models 的权限管理方案,类似第三方类库吧,但是文档看着很难受,基于 go 写的。

question

code

model:模型 policy:规则

    $path =realpath(__DIR__ . '/../config/casbin');
    $modelPath = $path.'/model.conf';
    $policyPath = $path .'/policy.csv';
    $casbin = new Enforcer($modelPath,$policyPath);
    $sub = 'tester';
    $obj = 'backend';
    $act = 'read';

    if (true === $casbin->enforce($sub, $obj, $act)) {
    // permit alice to read data1x
    } else {
    throw new \Exception('deny the request');
    }

上面的例子就是简单 match:用户 tester 是否有 backend 后台读取的权限

talk

casbin: https://github.com/casbin/casbin
gayhub: https://github.com/BinZhiZhu

8263 次点击
所在节点    程序员
5 条回复
xuanbg
2019-01-27 20:09:24 +08:00
权限管理其实分两块:授权和鉴权。
对于功能权限来说,授权一般采用 RBAC 模型,把每个需要授权的功能定义成资源即可。鉴权也很简单,只需要在调用服务的时候进行就可以了,在网关、服务的拦截器或者控制器都可以进行鉴权。无非就是需要服务调用者提供 Token 或者别的可以表明用户身份的东西,然后鉴权模块根据服务调用者提供的身份信息去找这个用户是否有授权罢了。
然鹅,RBAC 模型不提供数据权限的管理方案,于是只能自己造轮子了。我的方案其实和 RBAC 一脉相承,就是把数据的拥有者定义成资源,然后查询的时候由权限管理模块提供一个资源集合作为查询条件。这个方案的缺点是无法抽象成和业务无关的独立功能,完全和业务耦合在一起。
zhuzhibin
2019-01-27 20:22:40 +08:00
@xuanbg 我之前组织 Rbac 仅仅是通过路由 用户访问到控制器这一层的时候进行判断权限 一般用户会拥有角色加权限 角色实际上就是权限的集合 然后把这些授权访问的资源通过路由组织成一个个子节点 这样的话会变得很有局限性 举个例子 某个 curd 操作不走路由怎么办?
xuanbg
2019-01-28 08:51:07 +08:00
@zhuzhibin 你这个是前端实现的伪权限,最大的用处是提升人机交互的友好度。真要控制权限,得在服务端进行鉴权。你一个页面有多个功能操作最正常不过了,不同的操作是调用不同的接口来实现的,只要一个或多个接口对应一个操作,鉴权就不是问题了。唯一无法在服务端进行鉴权的,就是复制内容这种完全在前端实现的功能了,好在这种功能有前端实现伪权限也就够了。
ruoxie
2019-01-28 10:14:22 +08:00
自己实现一下 RBAC 就已经够用,要做到数据权限控制,那就是 ABAC 了,可以在 RBAC 的基础上做扩展
xkeyideal
2019-01-28 11:10:12 +08:00
自己写了一个,在 RBAC 的基础上封装数据权限,casbin 的配置比较麻烦,也没在实际项目中使用过。
实现的方案是基于数据签名的方式,还算比较好用

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/531053

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX