我们知道,在功能级访问控制中至少会有Account、Catalog、Role、Group、Function、Menu、AppSystem、Privilege这几种元素。并且之前我们认识到这若干种元素是可以任意两两组合的,(Account, Account)、(Account, Catalog)、(Catalog, Role)等每一种二元组都是可以有明确的访问控制意义的。到达数据级权限的时候就是又多出了一个元素:Object。这种Object元素也要与前面几种元素任意两两组合并且有明确的意义。每一种组合一定都是有意义的,合适的意义到底是什么这需要我们去发现。
最近发现前面那样的无方向的二元组的粒度不够。二元组合需要分裂为二元排列。比如(account1, account2)需要分裂为<account1, account2>和<account2, account1>,(catalog1, role1)需要分裂为<catalog1, role1>和<role1, catalog1>,(role1, function1)需要分裂为<role1, function1>和<function1, role1>等。
<Catalog,Role>和<Role,Catalog>是不同的,<Role,Catalog>也有意义。以前没发掘出<Role,Catalog>的意义,现在发现了。<Role,Catalog>的意义是限定role的作用范围,<role1,catalog1>和<role1,catalog2>共同限定了role1的作用范围只能是在catalog1和catalog2目录下,主体进入这俩目录的时候才会激活主体的role1角色,主体出了这俩目录时role1就被收回。而<catalog1, role1>的意思是授予catalog1主体目录下的主体role1角色。catalog1是主体目录,可以是组织机构(组织机构目录树上的每一个节点下组织的资源包括桌子、电脑、办公室等,重要的是包括“员工”这种主体类型的资源)。组织机构是一棵树,单继承的。如果subject1是catalog1.catalog1.001节点下的主体的话,由于<catalog1, role1>这条记录的存在,subject1就可以沿着组织机构树获得role1角色。
如果按照把一条二元组合记录分裂为两条二元排列记录这种模式思考的话会发现(Role, Function)可以被拆分为<Role, Function>和<Function, Role>。<Role, Function>是角色授权的意思,而<Function, Role>可以解释为:限制给定的功能可被授予的角色的范围。<function1, role1>、<function1, role2>、<function1, role3>
这三条记录共同限制function1只能被授予role1、role2、role3角色不能被授予role4角色。
由“Account、Catalog、Role、Group、Function、Menu、AppSystem、Privilege”这些元素组成的任意二元排列在权限引擎中都应有明确的意义,后续我们一一发现。至此终于完善了模型,一条二元排列记录由两个元素按照顺序组合得到,不可能再继续分裂了,再继续分裂就是对元素进行分裂了(对元素进行分裂是这样的分裂:比如Function这种类型的元素会被分裂为名称、入参、返回值,入参是个列表继续分裂,返回值也是列表也可以继续分裂。无论在什么层次运用组合和分裂,模式一定都是完全一样的,因为世界是分形的)。
看样子虽然以前的文字中一直使用的“组合”这个词,代码上却一直用的是“排列”,现在终于一致了。