1 RBAC介绍
RBAC模型作ؓ目前最为广泛接受的权限模型?span>
NISTQThe National Institute of Standards and TechnologyQ美国国家标准与技?/strong>研究院)标准RBAC模型?个部件模型组成,q?个部件模型分别是基本模型RBAC0QCore RBACQ、角色分U模型RBAC1QHierarchal RBACQ、角色限制模型RBAC2QConstraint RBACQ和l一模型RBAC3QCombines RBACQ?sup>[1]。RBAC0模型如图1所C?span>
图表1 RBAC 0模型
l RBAC0定义了能构成一个RBAC控制pȝ的最的元素集合
在RBAC之中,包含用户users(USERS)、角色roles(ROLES)、目标objects(OBS)、操作operations(OPS)、许可权permissions(PRMS)五个基本数据元素Q权限被赋予角色,而不是用P当一个角色被指定l一个用hQ此用户拥有了该角色所包含的权限。会话sessions是用户与Ȁzȝ角色集合之间的映。RBAC0与传l访问控制的差别在于增加一层间接性带来了灉|性,RBAC1、RBAC2、RBAC3都是先后在RBAC0上的扩展?span>
l RBAC1引入角色间的l承关系
角色间的l承关系可分Z般承关pd受限l承关系。一般承关pM要求角色l承关系是一个绝对偏序关p,允许角色间的多ѝ而受限承关pdq一步要求角色承关pL一个树l构?span>
l RBAC2模型中添加了责Q分离关系
RBAC2的约束规定了权限被赋予角色时,或角色被赋予用户?以及当用户在某一时刻ȀzM个角色时所应遵循的强制性规则。责dd括静态责dd动态责dR约束与用户-角色-权限关系一起决定了RBAC2模型中用L讉K许可?span>
l RBAC3包含了RBAC1和RBAC2
既提供了角色间的l承关系Q又提供了责ddpR?span>
建立角色定义表。定出当前系l中角色?span>
因ؓ有承的问题Q所以角色体现出的是一个树形结构?span>
2 权限设计Q?span>
配置资源以及资源的操?Q?q里资源可以定义Z个通用的资源模型。提供通用的资源统一接口?span>
数据?/strong>ER图:
关系图:
3 分析Q?span>
Ҏ以上的类关系囑֒ER囑֏以看出。整个权限可以抽象ؓ五个对象l成?span>
OrgBean :用于描述org模型?span>
RoleQ?用于描述角色?span>
PermissionQ?用于描述权限?span>
ResourceQ?用于描述资源?span>
OperationQ?用于描述操作?span>
其中Permission中有Resource , Operation的聚合,资源和操作组成权限?span>
Role和Permission都有自包含。因计到权限的ѝ?span>
资源Resource也可能出C颗树形结构,那资源也要有自包含?span>
思想:
权限pȝ的核心由以下三部分构成:1.创造权限,2.分配权限Q?/span>3.使用权限Q然后,pȝ各部分的主要参与者对照如下:1.创造权?/span>-Creator创造,2.分配权限- Administrator分配Q?/span>3.使用权限- UserQ?span>
1.Creator创?/span>PrivilegeQ?/span>Creator在设计和实现pȝ时会划分Q一个子pȝ或称为模块,应该有哪些权限。这里完成的?/span>Privilege?/span>Resource的对象声明,q没有真正将Privilege与具?/span>Resource实例联系在一P形成Operator?span>
2.Administrator指定Privilege?/span>Resource Instance的关?/span>。在q一步,权限真正与资源实例联pd了一P产生?/span>OperatorQ?/span>Privilege InstanceQ?/span>Administrator利用Operatorq个基本元素Q来创造他理想中的权限模型。如Q创Ԍ创徏用户l,l用L分配用户Q将用户l与角色兌{等...q些操作都是?/span>Administrator来完成的?/span>
3. User使用Administrator分配l的权限M用各个子pȝ?/span>Administrator是用P在他的心目中有一个比较适合他管理和l护的权限模型。于是,E序员只要回{一个问题,是什么权限可以访问什么资源,也就是前面说?/span>Operator。程序员提供Operator意味着l系l穿上了盔甲?/span>Administrator可以按照他的意愿来建立他所希望的权?a onclick="javascript:tagshow(event, '%BF%F2%BC%DC');" href="javascript:;" target="_self">框架可以自行增加Q删除,理Resource?/span>Privilege之间关系。可以自行设定用?/span>User和角?/span>Role的对应关pR?/span>(如果?/span>Creator看作?/span>Basic的发明者,Administrator是Basic的用者,他可以做一些脚本式的编E?/span>) Operator是这个系l中最关键的部分,它是一个纽带,一个系?/span>ProgrammerQ?/span>AdministratorQ?/span>User之间的纽带?/span>
4 权限API
getPermissionByOrgGuid(String orgGuid )
通过传入一个org的GuidQ?拿到当前q个org对象都具有那些访问权限?span> getSourcePermissionByOrgGuid(String orgGuid , String resouceGuid)
通过传入一个org的Guid?一个资源的GuidQ?q回改Org对当前这个资源的讉K权限?span>
getPermissionByResourceGuid(String resource)
通过传入一个资源的GuidQ?得到当前资源下都有那些权限定义?span>
havingHeritPermission(String orgGuid , String resouceGuid) : Boolean
传入一个orgGuidQ?资源GUIDQ查看改OrgGuid下对资源是否有向下承的权限。这里承是资源的ѝ即对父栏目有权限,可以l承下去对父栏目下的子栏目同h权限?span>
havingPermission(String orgGuid , String resourceGuid) : Boolean
判断某OrgҎ一资源是否用权限?span>
以上是粗_度的权限API?以下为细_度的权限:
getOperationByPermission(String permissionGuid)
通过permission的Guid得到该permission的所有有效操作?span>
getOperationByGuid(String permissionGuid , String resourceGuid)
通过permision的GuidQ?资源的Guid得到该资源下所有的有效操作?span>
screeningOpreationByGuid (String permissionGuid , String resourceGuid , String orgGuid)
通过permissionQresourceQorg的Guid得到改Org对这一资源的有效操作?span>
hasOperation(String operationGuid) : boolean
通过传入的operationGuidq回是否h操作权限?span>
5 权限的实玎ͼ
1Q表单式认证Q这是常用的Q但用户到达一个不被授权访问的资源ӞWeb容器发
Z?/span>html面Q要求输入用户名和密码?/span>
2Q用Filter防止用户讉K一些未被授权的资源Q?/span>Filter会截取所?/span>Request/ResponseQ?/span>
然后攄一个验证通过的标识在用户?/span>Session中,然后Filter每次依靠q个标识来决定是否放?/span>Response?/span>
q个模式分ؓQ?/span>
GatekeeperQ采?/span>Filter或统一Servlet的方式?/span>
AuthenticatorQ?/span>?/span>Web中?/span>JAAS自己来实现?/span>
Filter拦截只是拦截该用h否有讉Kq个面Q或q一资源的权限。真正做到显C后拦截是在应用E序内部d?span>
做显C拦截提供APIQ?标签q两U方式?/p>