贡献一份精心整理的RBAC规范接口及其解说

这是花费了我半天时间从国标GBT 25062-2010 RBAC上整理得到的IRBACService接口。不要感觉惊奇,GBT 25062-2010 RBAC是和美国的NIST RBAC标准完全一样的。如果您希望阅读GBT 25062-2010 RBAC国标文档的话可以从这里下载http://git.oschina.net/anycmd/anycmd/tree/master/Docs

国家标准文档是用z语言书写的,一下子读不懂没关系,不要灰心,把丢掉的知识拾起来就可以了。咱们都是在同样的教育体系下接收教育的,咱们的知识结构是被众多金字塔尖的人精心设计和建造的,只要你静下心来没有你阅读不懂的人类知识人类文明。

各种标准文档上书写着的是无数人的智慧与聪明才智。那是他们的价值、荣誉与生命,希望你撇开相互的偏见去获取你想要的知识。理论与生产没有矛盾。

为了帮助大家阅读,我斗胆预先帮助大家预热一下一些重要概念。

主体:指对客体有认识和实践能力的对象。比如人、系统、服务提供者。

客体:可被主体感知或想象到的任何事物。如文件、打印机、终端、数据库记录等。

对象/资源:资源是需要进行访问控制的系统资源,例如文件、打印机、终端、数据库记录等。

资源类型:基于人类发明的分类法对资源按照性质、特点、用途等作为区分的标准而做的第一次分类。

权限:对受保护的对象执行某个操作的许可。

操作:一个过程,这个过程通常有输入与输出,这个过程可能影响系统的状态也可能不影响系统的状态,是否影响系统的状态有赖于你的领域边界。首先基于资源类型定义一类资源的操作列表,通常这就够了,但也有可能会需要针对特定对象实例定义操作列表。

你也可以直接查看IRBACService.cs代码文件,它上面承载的是和下面的表格承载的同样的信息。


方法签名


说明


void AddUser(IAccountCreateInput input)

该命令创建一个新用户。当要待创建用户尚不存在于Account集合(Account表)中时,该命令可用。命令执行后,Account集合(Account表)被更新,新创建的用户不拥有任何的会话。
void DeleteUser(Guid accountID)
该命令从RBAC数据库中删除一个已经存在的用户。该命令可用当且仅当被删除的用户是Account数据集(Account表)
的一个成员(记录)。Accounts数据集(Account表)将被更新、PrivilegeBigram数据集(PrivilegeBigram表)将被更新,

PrivilegeBigram集合中主体为当前被删除的账户的成员将被删除。如果一个正处在会话中的用户被删除,anycmd

的实现会等待该会话结束后删除,但账户管理员是可以看到被删除的账户是否正在会话的且有权的管理员是可以强行终止给定的账户的会话的。
void AddRole(IRoleCreateInput input)
该命令创建一个新的角色。该命令可用当且仅当要创建的角色尚且不存在于RoleSet数据集中。RoleSet数据集
将被更新。初始时,新创建的角色没有分配任何用户和权限。
void DeleteRole(Guid roleID)
该命令从RBAC数uk中删除一个角色。该命令可用当且仅当被删除的角色是RoleSet数据集的成员。如果被删除的角色在某些会话中尚且是激活的,则Anycmd会从会话中删除这个角色然后允许会话继续执行。
void AssignUser(Guid accountID, Guid roleID)
该命令给用户分配角色。该命令可用当且仅当该用户是Account数据集(Account表)的成员(记录),该角色是RoleSet
数据集的成员,并且该角色尚未分配给该用户。数据集(表)PrivilegeBigram将被更新。

1 该用户是Account数据集(表)的成员(记录);2 该角色是RoleSet数据集的成员;3 该用户还没有被分配该角色;4 所有SSD约束在执行完命令后仍然被满足。

void DeassignUser(Guid accountID, Guid roleID)
该命令删除一个角色role到用户account的分配。该命令可用当且仅当account是Account数据集的成员,role
是RoleSet数据集的成员,并且角色role已经分配给了用户account。
void GrantPermission(Guid functionID, Guid roleID)
该命令给一个角色分配对一个对象执行某个操作的权限。该命令可用当且仅当给定的(操作,对象)代表了
一项权限并且该角色是RoleSet数据集的成员。
void RevokePermission(Guid functionID, Guid roleID);
该命令从分配给角色的权限集中撤销对某个对象执行某个操作的权限。该命令可用当且仅当(操作、对象)代表一项权限,并且该权限已经分配给了该角色。
IUserSession CreateSession

(

Guid sessionID, AccountState worker,List<PrivilegeBigramState> privileges

);
该函数创建一个新的会话,以指定的用户作为会话拥有者,以指定的角色集作为激活角色集。该函数可用
当且仅当:

1 该用户是Account数据集(表)的成员(记录);2 该会话的激活角色集是该用户分配的角色集的子集。3 该会话的激活角色集满足所有的DSD约束。

void DeleteSession(Guid sessionID)
该函数删除一个会话。该函数可用当且仅当会话标识符是UserSession数据集(表)的成员(记录)。
List<RoleState> SessionRoles(Guid sessionID)
该函数返回给定会话的激活角色。该函数可用当且仅当该会话标识符是UserSession数据集(表)的成员(记录)。
List<PrivilegeBigramState> SessionPermissions(Guid sessionID)
该函数返回给定会话的权限,即该会话的激活角色拥有的权限。该函数可用当且仅当会话标识符是

UserSession数据集(表)的成员(记录)。

void AddActiveRole

(

Guid accountID, Guid roleID, Guid sessionID

)
该函数为给定的用户会话增加一个激活角色。该函数可用当且仅当:

1 该用户是Account数据集(表)的成员(记录);2 该角色是RoleSet数据集的成员;3 会话标识符是UserSession数据集(表)的成员(记录);4 该角色已经分配给了该用户;5 该用户拥有该会话;6 在给该会话增加新的激活角色后,所有的DSD约束都被满足。

void DropActiveRole(Guid accountID, Guid roleID)
该函数从给定用户会话中删除一个激活角色。该函数可用当且仅当该用户是Account数据集(表)的成员(记录),
会话标识是UserSession数据集(表)的成员(记录),该用户是该会话的拥有者并且该角色是该会话的一个激活角色。
bool CheckAccess

(

Guid sessionID, Guid functionID, IManagedObject obj

);
该函数决定一个给定的会话的主体是否允许对给定的对象执行某个给定的操作并返回一个布尔值。该函数可用当且仅当
会话标识符是UserSession数据集(表)的成员(记录),该对象是它对应类型的对象的数据集的成员,该操作是FunctionSet
数据集的成员。会话的主体可以对该对象执行该操作当且仅当会话的某个激活角色拥有对应的权限。
List<AccountState> AssignedUsers(Guid roleID)
该函数返回被分配给了某个指定角色的用户。该函数可用当且仅当该角色是RoleSet数据集的成员。
List<RoleState> AssignedRoles(Guid accountID)
该函数返回分配给了一个给定用户的角色。该函数可用当且仅当该用户是Account数据集(表)的成员(记录)。
List<AccountState> AuthorizedUsers(Guid roleID)
该函数返回拥有给定角色的授权用户。该函数可用当且仅当给定角色是RoleSet的成员。
List<RoleState> AuthorizedRoles(Guid accountID)
该函数返回给定用户的授权角色。该函数可用当且仅当该用户是Account数据集(表)的成员(记录)。
List<PrivilegeBigramState> RolePermissions(Guid roleID)
该函数返回分配给一个给定角色的权限。该函数可用当且仅当该角色是RoleSet数据集的成员。
List<PrivilegeBigramState> UserPermissions(Guid accountID)
该函数返回一个给定用户的权限。该函数可用当且仅当该用户是Account数据集(表)的成员(记录)。
List<FunctionState>

RoleOperationsOnObject

(Guid roleID, IManagedObject obj)

该函数返回一个给定角色被允许的对给定对象执行的操作。该函数可用当且仅当该角色是RoleSet数据集的成员,该对象是obj对应类型数据集的成员。
List<FunctionState>

UserOperationsOnObject

(Guid accountID, IManagedObject obj)

该函数返回给定用户被允许的针对给定角色执行的操作。该函数可用当且仅当该用户是Account数据集(表)的成员(记录),该对象是obj对应类型数据集的成员。
void AddInheritance

(

Guid subjectRoleID, Guid objectRoleID

)
该命令在两个已经存在的角色r_asc/客体和r_desc/主体之间建立直接继承关系。r_asc>>r_desc。该命令可用当且仅当:

1 r_asc/客体和r_desc/主体都是RoleSet数据集的成员;2 r_asc/客体不是r_desc/主体的直接祖先,3 r_desc/主体不继承r_asc/客体(不免产生回路)。4 SSD约束在该命令执行后扔是满足的。

void DeleteInheritance

(

Guid subjectRoleID, Guid objectRoleID

)
该命令删除已经存在的直接继承关系r_asc>>r_desc。该命令可用当且仅当r_asc/客体和r_desc/主体都是RoleSet数据集的成员,r_asc/客体是r_desc/主体的直接祖先。在执行完该命令以后,新的继承关系是新的直接继承关系的自反传递包。
void AddAscendant

(

Guid childRoleID, IRoleCreateInput parentRoleCreateInput

)
该命令创建一个新角色r_asc/客体/父角色,并作为现存角色r_desc/主体/子角色 的直接祖先插入到角色层次中去。该命令可用当且仅当r_asc/客体/父角色 不是RoleSet数据集的成员,r_desc/子角色 是RoleSet数据集的成员。
void AddDescendant

(

Guid parentRoleID, IRoleCreateInput childRoleCreateInput

)
该命令创建一个新的角色作为现存角色 r_asc/客体/父角色 的直接后代插入到角色层次中。该命令可用当且仅当r_desc/主体不是RoleSet数据集的成员,r_asc/客体/父角色 是RoleSet数据集的成员。
void CreateSSDSet(ISSDSetCreateInput input)
该命令创建一个命名的SSD角色集合,并设定相应的阀值。该命令可用当且仅当:

1 SSD角色集的标识和名称还没有被使用;2 SSD角色集中的角色都是RoleSet数据集的成员;3 SSDCard是一个大于或等于2的自然数,同事还要小于或等于SSD角色集的基数(基数:有限集的元素个数);4 新的SSD角色集的约束当前是被满足的。

void DeleteSSDSet(Guid ssdSetID)
该命令删除一个SSD角色集。该命令可用当且仅当该SSD角色集存在。
void AddSSDRoleMember(Guid ssdSetID, Guid roleID)
该命令为SSD角色集增加一个角色,该SSD角色集关联的阀值不发生改变。该命令可用当且仅当:

1 该SSD角色集存在;2 该角色是RoleSet数据集的成员,并且尚不属于该SSD角色集;3 该命令执行之后,SSD约束仍然是满足的。

void DeleteSSDRoleMember(Guid ssdRoleID)
该命令从SSD角色集中删除一个角色,其关联的阀值不发生改变。该命令有效当且仅当:

1 SSD角色集已经存在;2 要删除的角色是该SSD角色集的成员;3 该SSD角色集关联的阀值小于该角色集的成员数。

<remarks>
注意:修改后的SSD约束当前应该是被满足的。
void SetSSDCardinality(Guid ssdSetID, int cardinality)
该命令设定与给定的SSD角色集关联的阀值。该命令可用当且仅当:

1 该SSD角色集存在;2 新的阀值是一个大于或等于2的自然数,它要小于或等于SSD角色集的基(基:有限集元素的个数);3 新的SSD约束当前应该是被满足的。

List<SSDRoleState> SSDRoleSets()
该函数返回所有的SSD角色集。
List<RoleState> SSDRoleSetRoles(Guid ssdSetID)
该函数返回与一个指定SSD角色集合相关联的角色的集合
int SSDRoleSetCardinality(Guid ssdSetID)
该函数返回与给定SSD角色集关联的阀值。该函数可用当且仅当该角色集存在。
void CreateDSDSet(IDSDSetCreateInput input)
创建一个动态责任分离角色集并设定相应的阀值。该DSD约束要求DSD角色集中任何【阀值】个或者更多角色不能都在某个用户会话过程中被激活。
该命令可用当且仅当:

1 DSD角色集的标识和名称还没有被使用;2 DSD角色集中的角色都是RoleSet数据集的成员;3 SSDCard是一个大于或等于2的自然数;4 新的DSD角色集的约束当前是被满足的。

void DeleteDSDSet(Guid dsdSetID)
该命令删除一个DSD角色集。该命令可用当且仅当该DSD角色集存在。
void AddDSDRoleMember(Guid dsdSetID, Guid roleID)
该命令为一个给定的DSD角色集增加一个角色,DSD角色集关联的阀值不发生改变。该命令有效当且仅当:

1 该DSD角色集存在;2 该角色是RoleSet数据集的成员,并且尚不属于该DSD角色集;3 该命令执行成功之后,DSD约束仍然是满足的。SSDCard要小于或等于DSD角色集的基(基:有限集元素的个数)

void DeleteDSDRoleMember(Guid dsdRoleID)
该命令从DSD角色集中删除一个角色,其关联的阀值不发生改变。该命令有效当且仅当:

1 DSD角色集已经存在;2 要删除的角色是该DSD角色集的成员;3 该DSD角色集关联的阀值小于该角色集的成员数。

注意:修改后的DSD约束当前应该是被满足的。
void SetDSDCardinality(Guid dsdSetID, int cardinality)
该命令设定与给定的DSD角色集关联的阀值。该命令可用当且仅当:

1 该DSD角色集存在;2 新的阀值是一个大于或等于2的自然数,它要小于或等于DSD角色集的基(基:有限集元素的个数);3 新的DSD约束当前应该是被满足的。

List<DSDRoleState> DSDRoleSets()
该函数返回所有的DSD角色集。
List<RoleState> DSDRoleSetRoles(Guid dsdSetID)
该函数返回给定的DSD角色集中的角色。该函数可用当且仅当该角色集存在。
int DSDRoleSetCardinality(Guid dsdSetID)
该函数返回与给定DSD角色集关联的阀值。该函数可用当且仅当该角色集存在。

Anycmd会完整的支持来自国籍标准的IRBACService接口,熟悉了这套接口也就学会了使用Anycmd。同时Anycmd也会提供一套稳定的、风格一致的、在AC领域近乎功能完备的、流畅的api。这些会在发布1.0版本的时候完成。

anycmd是一个.net平台的完全开源的,完整支持RBAC的,将会支持xacml的通用的权限框架、中间件、系统。

如果您感兴趣的话现在可以先观察Anycmd的源码,期待您为Anycmd.AC提供帮助确保她走在正确的道路上。

Anycmd的开源地址在http://git.oschina.net/anycmd/anycmd

贡献一份精心整理的RBAC规范接口及其解说

时间: 2024-10-12 12:55:10

贡献一份精心整理的RBAC规范接口及其解说的相关文章

个人整理--Java编码规范

编码规范对于开发人员来说是非常重要的,有以下几个原因: 1.一个软件的生命周期中,80%的花费在于维护 2.几乎没有任何一个软件,在其整个生命周期中,均由最初的开发人员来维护 3.编码规范可以改善软件的可读性,可以让程序员尽快而彻底地理解新的代码 4.如果你将源码作为产品发布,就需要确任它是否被很好的打包并且清晰无误,一如你已构建的其它任何产品 5.为来自不同的项目组或个人提供标准的代码格式. 6.增加易读性. 在不用Java两年多后因工作需要我又要转入Java开发,为此我整理出下面的编码规范,

qsort函数、sort函数 (精心整理篇)

先说明一下qsort和sort,只能对连续内存的数据进行排序,像链表这样的结构是无法排序的. 首先说一下, qsort qsort(基本快速排序的方法,每次把数组分成两部分和中间的一个划分值,而对于有多个重复值的数组来说,基本快速排序的效率较低,且不稳定).集成在C语言库函数里面的的qsort函数,使用 三 路划分的方法解决排序这个问题.所谓三路划分,是指把数组划分成小于划分值,等于划分值和大于划分值的三个部分. 具体介绍:-^^ void qsort( void *base, size_t n

qsort函数、sort函数 (精心整理篇)(转载)

qsort函数.sort函数 (精心整理篇) 先说明一下qsort和sort,只能对连续内存的数据进行排序,像链表这样的结构是无法排序的. 首先说一下, qsort qsort(基本快速排序的方法,每次把数组分成两部分和中间的一个划分值,而对于有多个重复值的数组来说,基本快速排序的效率较低,且不稳定).集成在C语言库函数里面的的qsort函数,使用 三 路划分的方法解决排序这个问题.所谓三路划分,是指把数组划分成小于划分值,等于划分值和大于划分值的三个部分. 具体介绍:-^^ void qsor

java8 新特性精心整理(全)

前言 越来越多的项目已经使用 Java 8 了,毫无疑问,Java 8 是Java自Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库.工具和 JVM 等方面的十多个新特性.在本文中我们将学习这些新特性,并用实际的例子说明在什么场景下适合使用. 引用:本文参考了这两篇文章,加以自己的理解,整理成一份最容易理解的 Java8 新特性文章,有少部分章节可能内容一致,但绝对不是抄袭,只是为了文章的完整性,大部分常用的地方加了我自己的理解和示例. https://blog.

学习一份百度的JavaScript编码规范

JavaScript编码规范 1 前言 2 代码风格 2.1 文件 2.2 结构 2.2.1 缩进 2.2.2 空格 2.2.3 换行 2.2.4 语句 2.3 命名 2.4 注释 2.4.1 单行注释 2.4.2 多行注释 2.4.3 文档化注释 2.4.4 类型定义 2.4.5 文件注释 2.4.6 命名空间注释 2.4.7 类注释 2.4.8 函数/方法注释 2.4.9 事件注释 2.4.10 常量注释 2.4.11 复杂类型注释 2.4.12 AMD 模块注释 2.4.13 细节注释 3

Java名企高频率面试题及答案 精心整理(三)

17.Override和Overload的含义去区别 重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写!返回值和形参都不能改变.即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为. 也就是说子类能够根据需要实现父类的方法. 在面向对象原则里,重写意味着可以重写任何现有方法.实例如下: class Animal{ public void move(){ System.out.println("动物可以移动"); } } class

整理的代码规范

突然想自己整理一下,优秀的代码规范,让自己的代码变得优雅. 参考:http://docs.typecho.org/phpcoding 约定 文件编码 请调整您的编辑器文件编码为UTF-8,并关闭UTF-8 BOM的功能.请不要使用windows自带的记事本编辑项目文件. 缩进 详细的代码缩进会在后面提到,这里需要注意的是,Typecho项目中的代码缩进使用的是4个空格(space),而不是制表符(tab),请务必调整. UNIX编码规范 如果你正在编写一个php文件,那么根据UNIX的C语言编码

java8 新特性精心整理

前言 越来越多的项目已经使用 Java 8 了,毫无疑问,Java 8 是Java自Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库.工具和 JVM 等方面的十多个新特性.在本文中我们将学习这些新特性,并用实际的例子说明在什么场景下适合使用. 引用:本文参考了这两篇文章,加以自己的理解,整理成一份最容易理解的 Java8 新特性文章,有少部分章节可能内容一致,但绝对不是抄袭,只是为了文章的完整性,大部分常用的地方加了我自己的理解和示例. https://blog.

关于量子计算机的一些整理 (精心整理原创) (一)

首先祝贺中国在量子计算方面的突出进步. "5月3日,中国科技大学潘建伟教授宣布,研究团队在去年首次实现十光子纠缠操纵的基础上,构建了世界首台超越早期经典计算机的单光子量子计算机.量子计算利用量子相干叠加原理,计算能力随可操纵的粒子数呈指数增长. " 既然是超越了早期经典计算机,作为软件计算机方向的一只程序猿就不得不转头学习了解关于量子物理学的知识,遂整理一发,如有纰漏,欢迎指出 一起进步! 支持转载.请注明出处哈,谢! 首先我们回顾一下计算机的发展史,个人认为计算机的历史要追溯到最早的