权限管理RBAC
基于角色的访问控制(Role-Based Access Control)
项目的框架用的是优雅的Laravel,这里打算基于Laravel写一个权限管理系统
建表:
Table Users( 用户表 )
id | name | phone | password | |
---|---|---|---|---|
1 | foo | 8888 | 8888@qq.com | md5(123456) |
Table Roles( 角色表 )
id | role | level | permission |
---|---|---|---|
1 | admin | 0 | 1,2,3 |
2 | user | 1 | 4,5 |
3 | user | 2 | 4,5,6 |
Table UserRole( 用户-角色关系表 )
id | user_id | role_id | permission |
---|---|---|---|
1 | 1 | 2 | 4,6 |
Table Permissions( 权限表 )
id | parent_id | name | url |
---|---|---|---|
1 | 0 | 后台首页 | backend |
2 | 0 | 权限管理 | permissionManagement |
3 | 0 | 员工信息 | stuffManagement |
4 | 0 | 个人信息 | myInfo |
5 | 4 | 个人相册 | photograph |
6 | 0 | 其他模块 | module |
思路:
在项目登录的使用者分用户( user )和管理员( admin ),其中用户又分等级。这样可以适用于按用户的等级分配权限。
用户表( Users )只存放用户的相关信息,有用户名( name )、手机号( phone )、电子邮箱( email )字段。
角色表( Roles )只存放角色的信息,有角色名( role )、角色对应的权限( permission )。
而用户角色关系表( UserRole )用来连接两个表,字段有user_id对应用户、role_id对应角色,这里我又加了一个权限字段( permission )。这个字段是实际分配给用户的权限,在获取用户权限的时候也是获取关系表中的权限字段。这是为了更自由的分配给用户权限,如果需要减少或增加某个用户的权限时修改的是这个字段的值。
上面表的示例中,permission字段值为“4,6”,这表示user_id为1,角色为user等级为1的用户只有访问个人信息和其他模块的权限,个人信息的二级菜单个人相册( photograph )的权限并不拥有。
其中,权限字段( permission )的值是权限表( Permissions )的id,用“,”分隔开,组成字符串存到一个字段。
权限表( Permissions )只是存放权限得列表,字段有parent_id、权限名( name )、路由( url )。若有多级的权限,就可以自关联,parent_id存放父权限的id值。
上面表中示例的数据,id为1、2、3的数据是后台admin的路由权限,剩下的都是用户的权限。在这个表中,只是list的作用。
实现:
这里用到Eloquent的模型关联,将几个表联系起来。具体使用见Laravel文档Eloquent: 关联。
route.php文件中,用户user的登录后的路由放在路由组user中,用到user的中间件。
Route:
Route::group([ ['middleware' => 'user'] ], function(){
});
Middleware:
public function (){
$user = Session::get( 'user' );
if(empty( $user )){
//重定向到错误提示页面,或返回登录页
}
//先获取当前路由
//再获取当前用户的角色的所有权限路由$array
//判断是否in_array(),是则进行跳转,否则返回上页。
}
public function getPermission(){
//获取当前用户的角色的所有权限
}
UserController:
public function login(Request $request){
$phone = $request->input( 'phone' );
$password = $request->input( 'password' );
$res = User::where( ['phone' => $phone, 'password'=> $password] )->first();
if(empty($res)){
return false;
}
$arr = User::getUserPermission($res);
return $arr;
}
Model/User:
public function getUserPermission($object){
if(empty($res)){
return false;
}else{
//获取UserRole表中permission的权限,和用户其他信息组成数组$array存于Session中
Session::set( 'user', $array );
return $array;//并返回数组
}
}
后台权限管理
两个模块,用户管理、权限管理
用户管理
这个模块管理用户的所有信息,并且可以添加或去掉某项权限。也可以为不同的用户级别,定制添加个别权限,以达到人性化。当然这个权限存储于UserRole关系表中,
权限管理
这个模块管理所有的权限,可以增删改现有的基本的权限名称和路由,可以增加二级的权限。
以上是我在做项目的场景中应用的权限管理,当然也希望能适用更多场景。
这里也是抛砖引玉,大家有更好的建议请务必告诉我,我也会持续优化本文。