使用Entrust扩展包可以在Laravel中很容易地实现RBAC功能。下面是实现该功能的完整攻略:
1. 安装Entrust扩展包
在Laravel项目中使用Composer安装Entrust扩展包。在命令行运行以下命令:
composer require zgldh/entrust
2. 配置Entrust扩展包
接着,你需要在laravel项目中进行配置。在 config/app.php
文件中加入以下两行:
'providers' => [
/*
* Laravel Framework Service Providers...
*/
Zizaco\Entrust\EntrustServiceProvider::class,
],
'aliases' => [
/*
* Laravel Framework Aliases...
*/
'Entrust' => Zizaco\Entrust\EntrustFacade::class,
],
运行以下命令发布迁移,生成相关数据表:
php artisan vendor:publish --tag=entrust-migrations
php artisan migrate
3. 创建模型类和迁移文件
Entrust包中定义了四个模型: EntrustUser
表示用户、 EntrustRole
表示角色、 EntrustPermission
表示权限、 EntrustAbility
表示角色拥有的权限。你需要在项目中创建这些模型和相关的迁移文件来映射到相应的数据表。运行以下命令生成四个模型和四个对应的迁移文件:
php artisan entrust:setup
运行迁移命令生成数据表:
php artisan migrate
4. 配置关联关系
接下来,你需要在模型中定义关联关系,以建立用户、角色和权限之间的关系。一个用户可以拥有多个角色,一个角色可以有多个用户,一个角色可以拥有多个权限,一个权限也可赋予多个角色。在关联关系上, EntrustUser
模型中可以定义 roles()
方法;EntrustRole
模型中可以定义 users()
和 perms()
方法; EntrustPermission
模型中可以定义 roles()
方法;EntrustAbility
模型中可以定义 roles()
和 perms()
方法。这里以 EntrustRole
模型为例子,定义其关联用户和权限的方法:
class EntrustRole extends Model
{
use EntrustRoleTrait;
public function users()
{
return $this->belongsToMany('App\User');
}
public function perms()
{
return $this->belongsToMany('Zizaco\Entrust\EntrustPermission');
}
}
5. 配置中间件
你需要使用Entrust提供的中间件来实现 RBAC 功能,这些中间件提供了一些方便的方法来验证用户是否具有足够的权限。在 app/Http/Kernel.php
文件中,加入以下两行:
protected $routeMiddleware = [
'role' => \Zizaco\Entrust\Middleware\EntrustRole::class,
'permission' => \Zizaco\Entrust\Middleware\EntrustPermission::class,
];
6. 生成管理后台
在管理后台中需要展示可授权的权限,你需要生成一个视图展示所有的权限。你可以通过以下命令生成权限管理控制器和视图:
php artisan entrust:controller PermissionController
这个命令会生成一个控制器 app/Http/Controllers/PermissionController.php
和一个视图文件夹 resources/views/permission
。
7. 设置权限和角色
你可以通过以下代码在授权过程中设置用户的权限和角色:
$user = User::find(1);
$user_role = Role::find(1);
$user->roles()->attach($user_role);
$user_perm = Permission::find(1);
$user_role->perms()->attach($user_perm);
这行代码将用户1赋予角色1的权限和权限1的权限。
现在您就可以使用Entrust扩展包在Laravel中实现RBAC功能了。通过以上方法,你已经成功地安装和配置了Entrust扩展包,设置了用户、角色、权限等关系,并生成了管理后台和视图层。
示例说明
这里给出两条示例说明
示例一:通过中间件实现路由权限控制
Route::get('/index', function () {
return view('index');
})->middleware('permission:manage-content');
Route::get('/edit', function () {
return view('edit');
})->middleware('permission:edit-content');
这两个路由访问需要读取或者修改内容的权限,使用中间件 middleware('permission:manage-content')
和 middleware('permission:edit-content')
实现在路由访问控制时进行权限判断。当用户有访问权限时才能访问,否则将会跳转到没有权限的提示页面。
示例二:在管理后台操作权限资源
在管理后台页面中,你需要展示当前的权限列表和创建新的权限。你可以使用以下代码从数据库中读取所有权限并在视图中展示:
public function index()
{
$perms = Permission::all();
return view('permission.index', ['perms'=>$perms]);
}
这里使用 Permission::all()
从数据库中读取所有权限,再通过 view()
将权限展示在页面中。如果你需要在管理后台中创建新的权限并存储到数据库中,可以使用以下代码:
public function create()
{
return view('permission.create');
}
public function store(Request $request)
{
$perm = new Permission();
$perm->name = $request->input('name');
$perm->display_name = $request->input('display_name');
$perm->save();
}
这里使用 Request
对象读取从创建权限表单提交的数据,并使用 save()
方法将新的权限存储到数据库中。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用Entrust扩展包在laravel 中实现RBAC的功能 - Python技术站