alexpechkarev / larbac
Laravel 5 的基于角色的访问控制
Requires
- illuminate/html: ~5.0
- laravel/framework: 5.*
This package is auto-updated.
Last update: 2024-09-19 09:00:14 UTC
README
Laravel 5 的基于角色的访问控制包。
此包的目的是将 RBAC 抽象级别应用于提高安全用户管理。访问决策基于个人用户作为组织一部分所拥有的角色和权限。基本概念是用户通过成为角色的成员来获得权限,其中权限分配给角色,角色分配给用户。用户-角色和权限-角色是多对多关系,允许单个角色有多个用户,单个用户有多个角色,同样也适用于权限。
此包包含前端界面,允许
- 创建、编辑和删除权限
- 创建、编辑和删除角色
- 将权限分配给角色
- 将角色分配给用户
默认情况下,前端选项设置为 true
,如果您希望以自己的方式创建角色和分配权限,请将此选项在配置文件中关闭。
要求
- [Laravel 5] (https://laravel.net.cn/)
- [illuminate/html] (https://github.com/illuminate/html)
前端依赖
安装
在终端中运行 Composer 命令安装包
$ composer require alexpechkarev/larbac:dev-master
使用以下内容更新 config/app.php 中的提供者和别名数组
'providers' => [
...
'Illuminate\Html\HtmlServiceProvider',
'Larbac\Provider\LarbacServiceProvider',
'aliases' =>[
...
'Form' => 'Illuminate\Html\FormFacade',
'HTML' => 'Illuminate\Html\HtmlFacade'
发布包资产
php artisan vendor:publish
包通过定义额外的关系和验证方法扩展了默认的 Laravel 用户模型。在 config/auth.php
中告诉 Laravel 使用包的用户模型而不是默认的 Eloquent 用户模型
#'model' => 'App\User',
'model' => 'Larbac\Models\User',
使用 HTTP 内核路由数组注册包中间件
protected $routeMiddleware = [
...
'larbac' => 'Larbac\Middleware\LarbacMiddleware',
];
创建数据库表
在运行迁移之前,请查看迁移文件夹中的表名 vendor/alexpechkarev/larbac/src/Migration
如果您计划使用前端界面,请打开 config/larbac.php
- 指定将授予您访问前端界面的角色名称
- 指定要分配上述角色的用户 ID
/*
|--------------------------------------------------------------------------
| User
|--------------------------------------------------------------------------
|
| Specify a user id from users table to which you would like assigning Admin role
| This is required in order to obtain access to frontend interface
| Can be changed to any other user
|
*/
'user' => 1,
/*
|--------------------------------------------------------------------------
| Admin role
|--------------------------------------------------------------------------
|
| Role that required in order to obtain access to frontend interface
|
*/
'role' => 'Admin',
需要四个额外的表来存储角色和权限数据以及它们的关系数据。默认情况下,以下表将被创建 [ tbl_permissions, tbl_roles, tbl_role_user, tbl_permission_role ]
可以在配置文件 config/larbac.php
中指定表名和表前缀
php artisan migrate
配置
发布包资产后,可以在 config/larbac.php
中找到配置文件
默认情况下前端界面开启,要关闭此选项,请参阅配置文件。以下前端界面 URL 显示在配置文件中,可随时修改。对这些路由的访问受角色保护,该角色分配给用户,请参阅 config/larbac.php
/*
|--------------------------------------------------------------------------
| Routes
|--------------------------------------------------------------------------
|
| Setting default routes
|
| User interface can be accessed via - http://yourdomain.net/user
| Permission interface can be accessed via - http://yourdomain.net/permission
| Roles interface can be accessed via - http://yourdomain.net/role
|
*/
'routes' => [
'routeUser' => 'user',
'routePermission' => 'permission',
'routeRoles' => 'role'
],
前端界面
前端模板依赖于额外的资源,如 Bootstrap、jQuery 和双列表框。要将这些资源添加到模板中,请确保默认布局模板 [在此情况下 - resources/views/app.blade.php] 包含以下部分:@section('footer-js') ... @show
。
@section('footer-js')
<!-- Scripts -->
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.1/js/bootstrap.min.js"></script>
@show
包模板将使用 @section('footer-js')
添加所需的 JavaScript 文件。
@section('footer-js')
@parent
// template required resources
@stop
错误信息
在用户没有足够的权限访问请求的资源时,LaRBAC 中间件将使用 withErrors()
方法显示错误。要显示错误消息,请创建一个新的视图 larbac-error.blade.php
并包含以下代码。然后,在模板中包含此视图 @include('larbac-error')
。错误消息可以在配置文件中指定。
@if($errors->has("error"))
<div class="alert alert-warning alert-dismissible" role="alert">
<button type="button" class="close" data-dismiss="alert">
<span aria-hidden="true">×</span><span class="sr-only">Close</span>
</button>
{{$errors->first("error")}}
</div>
@endif
使用方法
创建您的权限/角色,建立它们之间的关系,并将角色分配给用户后,您可以在控制器中设置访问限制。
use Illuminate\Support\Facades\Request;
...
public function __construct()
{
// Setting role based access
$permissions = ['role'=>['Admin'] ];
if( is_object(Request::route()) ) {
Request::route()->setParameter('larbac', $permissions);
$this->middleware('larbac');
}
}
可以通过指定角色数组、权限数组或两者来设置不同的限制规则。
验证多个角色
- 用户必须被分配给给定的角色之一
$permissions = ['role'=>['Admin', 'Staff'] ];
....
同时验证多个角色和权限
- 用户必须被分配给给定的角色之一
- 至少有一个角色必须具有给定的权限
$permissions = ['role'=>['Admin', 'Staff'], 'permissions' => ['view'] ];
....
同时验证多个角色和权限
- 用户必须被分配给给定的角色之一
- 至少有一个角色必须具有所有给定的权限
$permissions = ['role'=>['Admin', 'Staff'], 'permissions' => ['view', 'edit'] ];
....
仅基于权限的验证
- 用户必须具有给定的权限
$permissions = ['permissions' => ['edit'] ];
....
在路由文件中分配访问控制
Route::get('/post',
[
'middleware' => 'larbac',
'larbac' => [
'role'=>['Admin'],
'permissions' => ['can_save']
],
function(){
return view('welcome');
}]);
前端截图
权限
创建新权限:/permission/create
查看权限:/permission
编辑权限:/permission/1/edit/
删除权限
角色
创建新角色并分配权限到该角色:/role/create
查看角色:/role
编辑角色:/role/1/edit/
用户
查看用户:/user
将角色分配给用户:/user/1/edit/
不使用前端
Laravel 默认提供了处理用户注册和认证过程的模型和控制器。这里我们将创建可以应用于用户的角色和权限。首先创建角色和权限
/**
* Creating role
*/
$role = Larbac\Models\Role::create(['name' => 'Admin']); // assuming role id will be 5
// with optional role description
$role = Larbac\Models\Role::create(['name' => 'Admin', 'description' => 'App administrator']);
/**
* Creating permission
*/
$permission = Larbac\Models\Permission::create(['name' => 'can_save']); // assuming permission id will be 12
// with optional permission description
$permission = Larbac\Models\Role::create(['name' => 'can_save', 'description' => 'Allow save changes']);
然后为角色分配权限
/*
* Assigning permission(s) to a role
* 'Admin' role id = 5
* 'can_save' permission id = 12
*/
$role = Larbac\Models\Role::find(5); // find Admin role by id - 5
$role->permissions()->sync([12]); // Assign 'can_save',using permission id - 12
也可以通过提供权限 ID 数组将多个权限分配给角色。请注意,sync([12,13,14])
将删除之前授予但未在给定数组中指定的任何其他权限。
/**
* Assigning multiply permissions to a Role
*
* 'Admin' role id = 5
*
* 'can_save' id = 12
* 'can_view' id = 13
* 'can_edit' id = 14
*/
$role = Larbac\Models\Role::find(1);
$role->permissions()->sync([12,13,14]);
...
/**
* Will revoke 'can_view' id = 13 and only grant given permissions
*
* 'Admin' role id = 5
*
* 'can_save' id = 12
* 'can_edit' id = 14
*/
$role->permissions()->sync( [12,14] );
然后为用户分配角色
/*
* Assigning role to an user
*/
$user = Larbac\Models\User::find(20); // assuming user id is 20
$user->roles()->sync([5]); // Assigning user [id = 20] an Admin role [id = 5]
##支持
发现错误或希望提出改进建议?请通过电子邮件联系我或打开 GitHub 上的 问题
##许可
LaRBAC for Laravel 5 在 MIT 许可下发布。有关详细信息,请参阅捆绑的 LICENSE 文件。