Laravel 通過Gate實現使用者-角色-許可權控制
阿新 • • 發佈:2018-11-01
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