1. 程式人生 > >Laravel 通過Gate實現使用者-角色-許可權控制

Laravel 通過Gate實現使用者-角色-許可權控制

1.建立相應的資料庫:

建立許可權表:

 Schema::create('permissions',function(Blueprint $table){
            $table->increments('id');
            $table->string('name');
            $table->string('desc');
            $table->timestamps();
        });

建立角色表:

 Schema::create('roles',function(Blueprint $table){
            $table->increments('id');
            $table->string('name');
            $table->string('desc');
            $table->timestamps();
        });

建立角色與許可權的關係表:

Schema::create('role_permissions',function(Blueprint $table){
            $table->increments('id');
            $table->integer('role_id');
            $table->integer('permission_id');
            $table->timestamps();
        });

建立使用者與角色的關係表:

Schema::create('admin_user_role',function(Blueprint $table){
            $table->increments('id');
            $table->integer('user_id');
            $table->integer('rold_id');
            $table->timestamps();
        });

2.建立相應的模型,其中 使用者與角色 角色與許可權存在多對多的關係,建立相應的方法對映相應的關係

使用者模型:

//使用者的角色 ,如 系統管理員,商品管理員

    public function roles()
    {
       return $this->belongsToMany('App\Role','admin_user_role','user_id','role_id');
    }
    //判斷某個使用者是否擁有某種角色 intersect 將兩個集合交集處理
    public function isInRoles($roles)
    {
        if ($this->roles->intersect($roles)->count() > 0){
            return true;
        }else{
            return false;
        }
    }
    //為使用者賦予角色
    public function assignRole($role)
    {
        return $this->roles()->save($role);
    }
    //為使用者取消角色
    public function deleteRole($role)
    {
        return $this->roles()->detach($role);
    }
    //判斷使用者是否有某種許可權
    public function hasPermission($permission)
    {
        return $this->isInRoles($permission->roles);
    }

角色模型:

 //當前使用者所擁有的許可權
    public function permissions()
    {
        return $this->belongsToMany('App\Permission','role_permissions','role_id','permission_id');
    }
    //給角色賦予許可權
    public function assignPermission($permission)
    {
        return $this->permissions()->save($permission);
    }
    //取消角色的許可權
    public function deletePermission($permission)
    {
        return $this->permissions()->detach($permission);
    }
    //判斷角色是否擁有許可權
    public function hasPermission($permission)
    {
        return $this->permissions()->contains($permission);
    }

許可權模型:

 //許可權屬於那些角色
    public function roles()
    {
        return $this->belongsToMany('App\Role','role_permissions','permission_id','role_id')->withPivot('permission_id','role_id');
    }

3.在AuthServiceProvider.php 中的boot方法中使用Gate來賦予當前使用者許可權:

$permissions = Permission::all();
        foreach ($permissions as $permission){
            Gate::define($permission->name,function ($user) use($permission){
               return $user->hasPermission($permission);
            });
        }

4.在前端介面中使用@can來控制相應的模組是否顯示:

 @can('product')
            <li id="product-manager" class="treeview">
                <a href="#"> <span>商品管理</span>
                    <span class="pull-right-container">
                        <i class="fa fa-angle-right pull-right"></i>
                    </span>
                </a>
                <ul class="treeview-menu">
                    <li id="product_category"><a href="/product/category"><i class="fa fa-circle-o"></i>分類管理</a> </li>
                    <li id="product"><a href="/product/index"><i class="fa fa-circle-o"></i>商品管理</a> </li>
                    <li id="product_attribute"><a href="/product/attribute"><i class="fa fa-circle-o"></i>屬性管理</a> </li>
                </ul>
            </li>
            @endcan

            @can('system')
            <li class="treeview"id="system-manager">
                <a href="#"> <span>系統管理</span>
                    <span class="pull-right-container">
                        <i class="fa fa-angle-right pull-right"></i>
                    </span>
                </a>
                <ul class="treeview-menu">
                    <li id="system_permission"><a href="/system/permission/index"><i class="fa fa-circle-o"></i>許可權管理</a></li>
                    <li id="system_role"><a href="/system/role/index"><i class="fa fa-circle-o"></i>角色管理</a></li>
                    <li id="system_admin"><a href="/system/system_admin"><i class="fa fa-circle-o"></i>系統管理員管理</a></li>
                    <li id="system_info"><a href="/system/system_info"><i class="fa fa-circle-o"></i>系統資訊</a></li>
                </ul>
            </li>
            @endcan