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 文件。








