Laravel 5 的基于角色的访问控制

dev-master / 1.3.x-dev 2015-04-13 17:45 UTC

This package is auto-updated.

Last update: 2024-09-19 09:00:14 UTC


README

Laravel 5 的基于角色的访问控制包。

此包的目的是将 RBAC 抽象级别应用于提高安全用户管理。访问决策基于个人用户作为组织一部分所拥有的角色和权限。基本概念是用户通过成为角色的成员来获得权限,其中权限分配给角色,角色分配给用户。用户-角色和权限-角色是多对多关系,允许单个角色有多个用户,单个用户有多个角色,同样也适用于权限。

此包包含前端界面,允许

  • 创建、编辑和删除权限
  • 创建、编辑和删除角色
  • 将权限分配给角色
  • 将角色分配给用户

默认情况下,前端选项设置为 true,如果您希望以自己的方式创建角色和分配权限,请将此选项在配置文件中关闭。

要求

前端依赖

安装

在终端中运行 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">&times;</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

Screenshot

查看权限:/permission

Screenshot

编辑权限:/permission/1/edit/

Screenshot

删除权限

Screenshot

角色

创建新角色并分配权限到该角色:/role/create

Screenshot

查看角色:/role

Screenshot

编辑角色:/role/1/edit/

Screenshot

用户

查看用户:/user

Screenshot

将角色分配给用户:/user/1/edit/

Screenshot

不使用前端

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