laravel框架RBAC增删改查

本文介绍了在Laravel框架下实现RBAC(Role-Based Access Control)的详细步骤,包括编写表字段,创建模型层,定义角色和节点的中间表,创建控制器以处理角色和节点的增删改查操作,并配置相关路由。此外,还提到了视图层的设计,适用于测试和实际应用。
摘要由CSDN通过智能技术生成

编写表字段

node表

Schema::create('nodes', function (Blueprint $table) {
   
       $table->bigIncrements('id');

       $table->string('name',50)->comment('节点名称');
       $table->string('route_name',100)->nullable()->default('')->comment('路由别名,权限认证标识');
       $table->unsignedInteger('pid')->default(0)->comment('上级ID');
       $table->enum('is_menu',['0','1'])->default('0')->comment('是否为菜单0否,1是');

       $table->timestamps();
       $table->softDeletes();
   });

roles角色表

Schema::create('roles', function (Blueprint $table) {
   
            $table->bigIncrements('id');
            $table->string('name','20')->comment('角色名称');
            $table->timestamps();
            // 软删除
            $table->softDeletes();
        });

role_node中间表

 Schema::create('role_node', function (Blueprint $table) {
   
     // 角色ID
     $table->unsignedInteger('role_id')->default(0)->comment('角色ID');
     // 节点ID
     $table->unsignedInteger('node_id')->default(0)->comment('节点ID');
 });

创建模型层

php artisan make:model Admin\Role
php artisan make:model Admin\Node

编写Node模型层方法

    // 修改器 route_name   RouteName  set字段名Attribute 字段名首字母大写,遇下划线后字母大写
    public function setRouteNameAttribute($value) {
   
        // 如果字段值为null,则设置为空字符串  修改和添加时生效  create 或 update
        $this->attributes['route_name'] = empty($value) ? '' : $value;
    }

访问器menu

    // 访问器  menu Menu
    public function getMenuAttribute() {
   
        return $this->is_menu == '1' ? '<span class="label label-success radius">是</span>' : '<span class="label label-danger radius">否</span>';
    }

获取全部数据

    // 获取全部的数据
    public function getAllList() {
   
        $data = self::get()->toArray();
        return $this->treeLevel($data);
    }

获取层级关系


    /**
     * 获取层级的数据
     * @param $allow_node 用户有的权限
     * @return array
     */
    public function treeData($allow_node) {
   
        $query = Node::where('is_menu', '1');
        if (is_array($allow_node)) {
   
            $query->whereIn('id', array_keys($allow_node));
        }
        $menuData = $query->get()->toArray();

        return $this->subTree($menuData);
    }

编写Role模型层方法

    // 角色与权限  多对多
    public function nodes() {
   
        // 参1 关联模型
        // 参2 中间表的表名,没有前缀
        // 参3 本模型对应的外键ID
        // 参4 关联模型对应的外键ID
        return $this->belongsToMany(Node::class,'role_node','role_id','node_id');
    }

创建控制器

php artisan make:controller RoleController  --resource
php artisan make:controller NodeController  --resource

编写RoleController 方法

节点列表

    /**
     * 节点列表
     */
    public function index() {
   
        // 获取所有的节点 返回是数组
        $data =(new Node)->getAllList();
        return view('admin.node.index', compact('data'));
    }

添加

    public function create() {
   
        // 获取所有的顶部
        $data = Node::where('pid', 0)->get();
        return view('admin.node.create', compact('data'));
    }

添加处理

    public function store(Request $request) {
   
        // 表单验证
        // try() catch()
        // 入库
        /*$data = $request->except('_token');
        $data['route_name'] = empty()*/
        Node::create($request->except('_token'));
        return ['status' => 0, 'msg' => '添加权限成功'];
    }

编写RoleController方法

列表

    /**
     * 列表
     */
    public function index(Request $request) {
   
        // 获取搜索框
        $name = $request->get('name', '');

        // 分页 搜索
        // 参数1, 变量值存在。则执行 参数2--->匿名函数
        $data = Role::when($name, function ($query) use ($name) {
   
            $query->where('name', 'like', "%{
     $name}%");
        })->paginate($this->pagesize);
        return view('admin.role.index', compact('data', 'name'));
    }

添加显示

    /**
     * 添加显示
     */
    public function create() {
   

        return view('admin.role.create');
    }

添加处理

    /**
     * 添加处理
     */
    public function store(Request $request) {
   
        // 异常处理
        try {
   
            $this->validate($request, [
                'name' => 'required|unique:roles,name'
            ]);
        } catch (\Exception $e) {
   
            return ['status' => 1000, 'msg' => '验证不通过'];
        }
        // 接受 all 接受所有的数据
        Role::create($request->only('name'));

        return ['status' => 0, 'msg' => '添加角色成功'];
    }

修改显示

    /**
     * 修改显示
     */
    public function edit(int $id) {
   
        $model = Role::find($id);
        return view('admin.role.edit', compact('model'));
    }

修改处理

/**
     * 修改处理
     */
    public function update(Request $request, int $id) {
   
        // 异常处理
        try {
   
            $this->validate($request, [
                // unique:表名,唯一字段,[排除行的值,以那个字段来排除]
                // 排除id=3的哪行名为name的字段值
                'name' => 'required|unique:roles,name,' . $id . ',id'
            ]);
        } catch (\Exception $e) {
   
            return ['status' => 1000, 'msg' => '验证不通过'];
        }
        // 修改角色入库
        //Role::where('id', $id)->update($request->only(['name']));
        Role::where([['id', '=', $id]])->update($request->only(['name']));
        return ['status' => 0, 'msg' => '修改用户成功'];
    }

给角色分配权限

   public function node(Role $role) {
   
        //dump($role->nodes->toArray());
        //dump($role->nodes()->pluck('name','id')->toArray());
        // 读取出所有的权限
        $nodeAll = (new Node())->getAllList();
        // 读取当前角色所拥有的权限
        $nodes = $role->nodes()->pluck('id')->toArray();

        return view('admin.role.node',compact('role','nodeAll','nodes'));
    }

分配处理

    public function nodeSave(Request $request,Role $role) {
   
        // 关联模型的数据同步
        $role->nodes()->sync($request->get('node'));
        return redirect(route('admin.role.node',$role));
    }

编写路由

        // 角色管理
        // 分配权限
        Route::get('role/node/{role}', 'RoleController@node')->name('role.node');
        Route::post('role/node/{role}', 'RoleController@nodeSave')->name('role.node');
        // 资源路由 /admin/role/xxx
        Route::resource('role', 'RoleController');

        // 节点管理
        Route::resource('node', 'NodeController');

其中用到的视图层,可以自己写,我这里用的H-ui里的视图,可以供大家测试一下!
role中的视图
index

@extends
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值