概念:
基于角色的访问控制。在RBAC中,权限与角色相互关联,用户可通过适当的角色而得到这些角色的权限。
RBAC支持三个著名的安全原则:最小权限原则,责任分离原则,数据抽象原则。
(1)最小权限原则,是RBAC可以将其角色配置成其完成任务所需要的最小的权限集。
(3)数据抽象可以通过权限的抽象来体现,如财务操作用借款、存款等抽象权限,而不用操作系统提供的典型的读、写、执行权限。然而这些原则必须通过RBAC各部件的详细配置才能得以体现。
特点:
RBAC模型支持最小权限原则、责任分离原则,这些原则是任何组织的管理工作都需要的。这就使得RBAC模型有广泛的应用前景。
RBAC模型支持数据抽象原则和继承概念。由于目前主流程序设计语言都支持面向对象技术,RBAC的这一特性便于在实际系统中应用实现。
模型中概念与实际系统紧密对应。RBAC模型中的角色、用户和权限等概念都是实际系统实际存在的实体,便于设计者建立现存的或待建系统的RBAC模型。
接下来,实现代码.
首先你的添加角色,给用户设置角色,这里就不详细介绍了。下来添加节点(权限)
父级权限要实现无限极分类。
节点入库之后,应该是这样
分配权限
<
table
border=
"0"
height=
"170"
>
<
foreach
name=
"authority"
item=
"value"
>
<
tr
style=
"
border-bottom:
1
px solid
;border-top:
1
px solid
;border-left:
1
px solid"
>
<
td
style=
"
border-right:
1
px solid"
><
input
type=
"checkbox"
name=
"quan_id[]"
class=
"fa"
value=
"{$value.q_id}"
>{$value.authority_name}</
td
>
<
foreach
name=
"value['son']"
item=
"val"
>
<
td
>
<
input
type=
"checkbox"
name=
"quan_id[]"
class=
"son"
pid=
"{$val.pid}"
value=
"{$val.q_id}"
>{$val.authority_name}
</
td
>
</
foreach
>
</
tr
>
</
foreach
>
</
table
>
同时,增强用户体验可以加点小特效
<
script
>
//点父级子级全部选中
$
(
function
(){
$
(
".fa"
).
click
(
function
(){
var
status2
=
$
(
this
).
prop
(
"checked"
);
var
nid
=
$
(
this
).
val
();
var
son
=
$
(
".son"
);
for
(
var
i
=
0
;
i
<
son
.
length
;
i
++)
{
if
(
son
.
eq
(
i
).
attr
(
"pid"
)==
nid
)
{
son
.
eq
(
i
).
prop
(
"checked"
,
status2
);
}
}
})
//点子级选父级
$
(
".son"
).
click
(
function
(){
var
status3
=
$
(
this
).
prop
(
"checked"
);
var
nid2
=
$
(
this
).
attr
(
"pid"
);
var
fa
=
$
(
".fa"
);
for
(
var
i
=
0
;
i
<
fa
.
length
;
i
++)
{
if
(
fa
.
eq
(
i
).
val
()==
nid2
)
{
fa
.
eq
(
i
).
prop
(
"checked"
,
true
);
}
}
})
})
</
script
>
给角色分配完权限,入库到角色-权限表中
$d
[
'role_id'
]=I(
'post.role_id'
);
$quan_id
=I(
'post.quan_id'
);
$biao
=M(
'role_authority'
);
$arr
=
array
();
foreach
(
$quan_id
as
$value
)
{
$tmp
[
'role_id'
]=
$d
[
'role_id'
];
$tmp
[
'quan_id'
]=
$value
;
$arr
[]=
$tmp
;
//$arr是二维数组
}
$d
=
$biao
->addAll(
$arr
);
if
(
$d
)
{
$this
->success(
'ok'
,U(
'Authority/allocation_authority'
),
1
);
}
用户在登录时,就应该把他的角色,权限查出来,存到session中,这样可以减轻数据库的压力.所以我们在登录验证正确时,就应该顺便把他的权限查出来。
$aut
=
$this
->getall(
$uid
); //登录控制器里,调用getall方法。
session(
'aut'
,
$aut
);
/*
* 取出权限
* @[author]超
*/
public function
getall(
$uid
)
{
$biao
=M(
'user'
);
$role_id
=
$biao
->where(
"id='
$uid
'"
)->getField(
'role_id'
,
true
);
//取出用户的角色id
$r_id
=
implode
(
','
,
$role_id
);
$biao2
=M(
'role_authority'
);
$a
=
$biao2
->join(
"authority on role_authority.quan_id=authority.q_id"
)->where(
"role_id in (
$r_id
)"
)->select();
return
$a
;
//$a 是二维数组
}
在公共控制器进项验证(参考非法登录文件)