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