RBAC权限管理
RBAC(Role-Based Access Control)即基于角色的访问控制,是一种权限设计思想。在 RBAC 中,权限与角色相关联,用户通过成为适当角色的成员来获得这些角色的权限。相较传统的访问控制(自主访问、强制访问)来说,RBAC 能更好的支持最小权限、责任分离和数据抽象等原则,极大地简化了权限的管理。
在一个组织中,角色是为了完成各种工作而创造,而用户则根据他的责任和资格来被指派相应的角色,用户可以很容易地从一个角色被指派到另一个角色。每个角色都拥有与之相匹配的权限,角色可依据新的需求而赋予新的权限,而权限也可根据需要而从某角色中回收。这样的权限设计,结构清晰、管理方便,也能囊括更广泛的客观情况。
RBAC 的优点主要在于易用和高效。给用户授权时只需要对角色授权,然后将相应的角色分配给用户即可;从技术角度讲,思路清晰且易于实现,且后期维护时只需要维护关系模型,显得简单而高效。
RBAC 的缺点主要有两个:一个是在进行较为复杂的权限校验时需要不断地遍历和递归,会造成一定的性能影响。另一个是缺少数据权限模型,基于 RBAC 来实现数据权限校验比较复杂和低效。
经过 20 多年的发展,RBAC 已被广泛应用到很多领域的系统或软件,同时也产生了许多应用模型。本文的理论部分到此结束,有兴趣了解更多的朋友可参考:
1.1、角色与权限表的设计
创建迁移文件和模型
创建基础模型
php artisan make:model Models\Base
修改角色与权限模型的继承
修改用户迁移文件添加角色ID
角色表
Schema::create(‘roles’, function (Blueprint $table) {
$table->bigIncrements(‘id’)->comment(‘id’);
$table->string(‘name’,‘20’)->comment(‘角色名称’);
$table->timestamps();
//软删除
$table->softDeletes();
});
节点表(权限表)
Schema::create(‘node’, function (Blueprint $table) {
$table->bigIncrements(‘id’);
$table->string(‘name’,50)->comment(‘节点名称’);
$table->string(‘route_name’,100)->default(’’)->comment(‘路由别名,权限认证标识’);
$table->unsignedSmallInteger(‘pid’)->default(0)->comment(‘上级ID’);
$table->enum(‘is_menu’,[‘0’,‘1’])->default(‘0’)->comment(‘是否为菜单0否,1是’);
$table->timestamps();
$table->softDeletes();
});
角色权限表
Schema::create(‘role_node’,function(Blueprint $table){
//角色id
$table->unsignedSmallInteger(‘role_id’)->default(0)->comment(‘角色id’);
//节点id
$table->unsignedSmallInteger(‘node_id’)->default(0)->comment(‘节点id’);
});
迁移
php artisan migrate:refresh --seed
1.2、角色管理
创建一个资源控制器和资源路由
php artisan make:controller Admin/RoleController -r/–resource
定义资源路由
Route::resource(‘规则前缀’, ‘控制器名称不要方法’); 定义路由前缀
控制器取数据
模板
添加角色
显示添加界面
模板 ajax提交
$("#form-admin-add").validate({
rules:{
name:{
required:true,
// minlength:4,
// maxlength:16
}
},
onkeyup:false,
success:"valid",
submitHandler:function(form){
// form.submit();
//表单提交地址
let url =$(form).attr('action');
//表单序列化
let data = $(form).serialize();
//jquery post提交
$.post(url,data).then(({status,msg})=>{
if(status == 0){
layer.msg(msg,{icon:1,time:2000},()=>{
location.href = "{{route('admin.role.index')}}";
})
}else{
layer.msg(msg,{icon:2,time:2000});
}
})
}
});
权限(节点)管理
定义资源路由
创建资源控制器,并关联模型
php artisan make:controller Admin/NodeController -r -m Models/Node
-m 模型
控制器
添加节点
使用vue进行界面管理,实现添加功能
模型中定义修改器
模板
Vue
let _token = "{{ csrf_token() }}";
new Vue({
el:'.page-container',
data:{
info:{
'name':'',
'router_name':'',
'pid':0,
'is_menu':'',
"_token" : _token
}
},
methods:{
dosubmit(evt){
// console.log(evt.target);
let url = evt.target.action;
$.post(url,this.info).then(ret=>{
if(ret.status == 0){
location.href="{{route('admin.node.index')}}"
}else{
layer.msg(ret.msg,{'icon':1,"time":1000})
}
});
},
changePid(){
// this.info.pid = evt.target.value || 0;
}
}
})
定义一个递归层级显示方法
节点模型中获取数据
控制器中调用
模板
1.3、后台权限控制
给角色分配权限
定义路由
模板
给用户分配角色
用户和角色之间是关系: 属于关系 beLongsTo
模型
控制器
模板
到这里就结束了,喜欢记得一键三连!!!