权限系统学习

"oauth"

Posted by yueLng on 2015-03-10

基于角色的访问控制(Role-Based Access Control)

基本概念

RBAC认为权限授权实际上是Who、What、How的问题。在RBAC模型中,who、what、how构成了访问权限三元组,也就是“Who对What(Which)进行How的操作”。   

简单理解

简单理解就是把系统中所有的功能都作为一个权限(或者称呼为资源),将这些权限赋予不同的角色,这个角色就具有了诸多的功能权限,在角色之上为用户分配角色,该用户便具有了该角色所具有的这一类权限。画一个简单的示意图如下:

一般来说,基于角色的访问控制拥有以下几张基本的数据表
1)用户信息表
2)系统功能表
3)角色信息表
4)权限信息表(角色的权限信息)
角色表示的是用户能在系统中进行的操作

基于shiro身份认证和模拟授权认证

安全四要素

Shiro为解决下列问题,提供了保护应用的API:
认证 - 用户身份识别,常被称为用户“登录”;
授权 - 访问控制;
密码加密 - 保护或隐藏数据防止被偷窥;
会话管理 - 每用户相关的时间敏感的状态。

认证

1)收集用户的身份信息,称为当事人(principal),以及身份的支持证明,称为证书(Credential)。
2)将当事人和证书提交给系统。
3)如果提交的证书与系统期望的该用户身份(当事人)匹配,该用户就被认为是经过认证的,反之则被认为未经认证的。

授权

授权实质上就是访问控制 - 控制用户能够访问应用中的哪些内容,比如资源、Web页面等等。多数用户执行访问控制是通过使用诸如角色和权限这类概念完成的。也就是说,通常用户允许或不允许做的事情是根据分配给他们的角色或权限决定的。那么,通过检查这些角色和权限,你的应用程序就可以控制哪些功能是可以暴露的。如你期望的,Subject API让你可以很容易的执行角色和权限检查。如下的代码片段所示:如何检查Subject被分配了某个角色:
角色检查

1
2
3
4
5
if ( subject.hasRole(“administrator”) ) {
//显示‘Create User’按钮
} else {
//按钮置灰?
}

如你所见,你的应用程序可基于访问控制检查打开或关闭某些功能。

权限检查是执行授权的另一种方法。上例中的角色检查有个很大的缺陷:你无法在运行时增删角色。角色名字在这里是硬编码,所以,如果你修改了角色名字或配置,你的代码就会乱套!如果你需要在运行时改变角色含义,或想要增删角色,你必须另辟蹊径。

为此,Shiro支持了权限(permissions)概念。权限是功能的原始表述,如‘开门’,‘创建一个博文’,‘删除‘jsmith’用户’等。通过让权限反映应用的原始功能,在改变应用功能时,你只需要改变权限检查。进而,你可以在运行时按需将权限分配给角色或用户。
权限检查

1
2
3
4
5
if ( subject.isPermitted(“user:create”) ) {
//显示‘Create User’按钮
} else {
//按钮置灰?
}

参考资料

1.让Apache Shiro保护你的应用主要讲到什么是shiro,shiro的基本概念以及认证、授权、密码加密、会话管理功能。
2.ThinkPHP的RBAC(基于角色权限控制)详解(用户表) (用户分组表)(操作节点) (用户和用户分组的对应) (各个操作和用户组的对应)