访问控制之9种元素

14-10-15 liangshan
              

anycmd是个权限引擎:

使用者初始化这个引擎的状态,然后往这个引擎中输入一个运动的标识它会回答是否允许这个运动发生:允许、不允许、我异常了(权限引擎异常了)。

如何标识一个运动?有这么几个要素:1 谁发起的这'个'运动,2 这'种'运动的‘种’标识。3 这个运动的实参列表。

所谓运动,其实就是一个过程,其实就是一个计算。

其实就是一个输入和输出。其实就是对象的方法啦,没什么高深的

他使用“运动”这个概念,而不使用更具体的概念是想表明,它是设计用来控制任何运动的。

比如3D打印机的打印运动,不停的运动,系统不停的采样,不停的改变权限引擎的状态,然后终于发现用户99%是在试图打印一把枪!

枪有它的核心模型,无论你怎么伪装,打印出来的枪都是使用同样的物理定律去发射子弹的,它的那个核心模型是一样的,anycmd就是要采样识别出他们的伪装从而在这个运动完成之前终止它!

在运动完成之前总是有办法终止这个运动。计算机指挥3D打印机打印的运动过程只是它的父过程的子过程,还有打印后从3D打印机中取结果的过程啊,没有权限就让你取不出。

anycmd明白rbac处在acl和安全策略语言中间的意义和重要性,anycmd明白人们花费集体智慧人力指定出标准的意义和重要性。anycmd致力于让高高在上的国家标准、国际标准发挥价值。

anycmd定义了可以任意两两组合的9中AC元素:Account 、Organization、Role、Group、Function、Menu、AppSystem、ResourceType、Privilege(暂不支持,该取值的存在是为了概念完整性。组成授权路由链表。如同面向对象机制中类的“继承”)。

发现有很多概念相互交叉甚至能够相互替代。比如Group被定义为‘资源组’,复杂的Group中放置的可以是不止一种类型的资源对于这种组改称‘手工仓库’,而组中只放置了一种资源的组称‘简单组’。按照这种思路理解的话Role其实也是一种组,Role这种组中放置了两种资源:Account和Privilege。工作组也是组,工作组中放置的也是两种资源:Account和Role。

anycmd中有9中ac元素,为什么这么多种元素?这不是我抽象出来的,而是观察现在的世界观察出来的。人们抽象出这些元素是为了帮助简化复杂的问题,这9种ac元素是站在一个更低的抽象层次来观察的,而在高一级的抽象层次看ac只有三种元素:主体、资源、运动

组织结构是对资源的单元划分,组织结构节点是边界,每一个边界绑定的角色应该只在当前用户进入这个边界后激活离开这个边界后收回,从而不能将从一个边界内得到的角色带出这个边界去操作其他边界内的资源。

计划从11个维度去考量到来的每一条命令('到来'不是说要跨进程跨网络什么的,到来可以理解为调用,就像调用一个对象的方法)。11个维度的叫法是不是正确我也不知道,11个维度的本意是想要提取出11个基本变量,控制权限就是从这11个变量出发去控制。

但是现在发现这11个变量不一定都是完全正交的,应该去除若干个。应该会随着目标数据的被一步步定位而一步步降维。

11个维度到达具体的数据单元格的时候可能只剩下两三个维度了,设计为终极降到为两维,因为我感觉如果将级为只有一维的话世界失去了意义。

[该贴被anycmd于2014-10-15 17:09修改过]

              

liangshan
2014-11-11 08:43

有9种AC元素:Account、Organization、Role、Group、Function、Menu、AppSystem、ResourceType、Privilege。

Privilege的定义是这9种AC元素的任意两两组合,两元中的一元是“主体”,一元是“客体”,主体负责感知客体。区分主客体就是为这两两组合定义了方向。一共是(9 * 8)/(2*1) = 36 + 9 = 45种结果。

在功能级权限的这45种组合中只有一种组合最关键:(Account,Function),主体是Account,客体是Function。其余44种组合的目的最终都是为了得出这个主体为Account客体为Function的组合。

每一个组合实例称作一个Privilege,Privilege也是9种AC元素的一员,有一种组合比较特殊,它是(Privilege,Privilege),这种组合目的是组成Privilege的继承链条,类似面向对象中的继承。另外上面的36+9中的9种是(Account,Account)、(Organization,Organization)、(Role,Role)、(Group,Group)、(Function,Function)、(Menu,Menu)、(AppSystem,AppSystem)、(ResourceType,ResourceType)、(Privilege,Privilege)。

功能级的权限是常驻内存的。

进入数据权限的时候又多了一个元素,第10种元素是Entity或者叫资源记录,数据级权限是10种AC元素的组合。数据级权限和资源记录存储在相同的物理位置,随同对资源记录的访问一起加载进内存,用完后随时丢弃不会常驻内存。

按照rbac标准上的说法是能够完成任何功能级的权限控制的,那么多ac元素最终都是为了得到(account,function)组合,系统运行到一个受控的区域时什么都不管只认(account,function)组合,只问当前用户是否可以执行当前function。

要鉴权只需要知道当前的account和当前正在试图访问的function分别是什么,其中account可以从UserSession中直接读取,而如何识别function相对曲折,对于asp.net mvc来说可以基于这样的约定:ControllerName=ResourceTypeCode,ActionName=FunctionCode,知道了ResourceType.Code和Function.Code就可以直接到FunctionSet中索引到function了。

为了开始构建后100层的数据级权限,anycmd需要尽快为前100层的功能级权限打个好节。现在看来,anycmd构建时找到的最重要的指向标是:始终以(主体,客体)的两两组合为中心,始终将主客体组合看作干流,始终将那单个的9种AC元素看作是支流。