larapacks / authorization
原生Laravel授权。
Requires
- php: >=7.0
- illuminate/database: ^5.5|^6.20|^7.0|^8.0
Requires (Dev)
- orchestra/testbench: ^3.7|^4.0|^5.0
- phpunit/phpunit: ^7.0|^8.0|^9.0
README
一个简单易用的Laravel角色/权限管理系统。
🚨 仓库已迁移 🚨
此仓库已迁移至: DirectoryTree/Authorization。
索引
安装
注意:需要Laravel 5.5或更高版本。
要开始使用,请通过Composer包管理器安装Authorization
composer require larapacks/authorization
Authorization服务提供程序将自身的数据库迁移目录注册到框架中,因此您应该在安装包后迁移数据库。Authorization迁移将创建应用程序存储角色和权限所需的表
php artisan migrate
现在将 Larapacks\Authorization\Traits\Authorizable
插入到您的 App\Models\User
模型中
<?php namespace App\Models; use Larapacks\Authorization\Traits\Authorizable; use Illuminate\Foundation\Auth\User as Authenticatable; class User extends Authenticatable { use Authorizable; // ... }
您现在可以进行用户授权。
迁移自定义
如果您不想使用Authorization的默认迁移,您应该在您的 AppServiceProvider
的 register
方法中调用 Authorization::ignoreMigrations
方法。您可以使用 php artisan vendor:publish --tag=authorization-migrations
导出默认迁移。
use Larapacks\Authorization\Authorization; /** * Register any application services. * * @return void */ public function register() { Authorization::ignoreMigrations(); }
模型自定义
默认情况下,App\Models\User
类被注册为可授权的用户模型。
您可以根据需要扩展Authorization内部使用的模型,或创建自己的模型。
通过您的 AuthServiceProvider
中的 Authorization
类指示Authorization使用您自己的模型
use App\Models\User; use App\Models\Role; use App\Models\Permission; use Larapacks\Authorization\Authorization; /** * Register any authentication / authorization services. * * @return void */ public function boot() { $this->registerPolicies(); Authorization::useUserModel(User::class); Authorization::useRoleModel(Role::class); Authorization::usePermissionModel(Permission::class); }
请确保为每个自定义模型添加相关的特性
角色模型:
namespace App\Models; use Illuminate\Database\Eloquent\Model; use Larapacks\Authorization\Traits\ManagesPermissions; class Role extends Model { use ManagesPermissions; }
权限模型:
namespace App\Models; use Illuminate\Database\Eloquent\Model; use Larapacks\Authorization\Traits\HasUsers; use Larapacks\Authorization\Traits\HasRoles; use Larapacks\Authorization\Traits\ClearsCachedPermissions; class Permission extends Model { use HasUsers, HasRoles, ClearsCachedPermissions; }
使用方法
Authorization利用原生的Laravel关系,因此无需学习新的API。
创建一个权限
$createUsers = new Permission(); $createUsers->name = 'users.create'; $createUsers->label = 'Create Users'; $createUsers->save();
将权限授予一个角色
$administrator = new Role(); $administrator->name = 'administrator'; $administrator->label = 'Admin'; $administrator->save(); $administrator->permissions()->save($createUsers);
现在将角色分配给用户
$user->roles()->save($administrator);
您还可以创建特定于用户的权限
$createUsers = new Permission(); $createUsers->name = 'users.create'; $createUsers->label = 'Create Users'; $createUsers->save(); $user->permissions()->save($createUsers);
检查权限 & 角色
使用Laravel原生的 $user->can()
方法
if ($user->can('users.create')) { // This user can create other users. }
在您的控制器中使用Laravel原生的 authorize()
方法
public function create() { $this->authorize('users.create'); User::create(['...']); }
使用Laravel原生的 Gate
门面
if (Gate::allows('users.create')) { // }
在您的视图中使用Laravel原生的 @can
指令
@can('users.create') <!-- This user can create other users. --> @endcan
检查权限 & 角色(使用Authorization包方法)
检查权限
// Using the permissions name. if ($user->hasPermission('users.create')) { // } // Using the permissions model. if ($user->hasPermission($createUsers)) { // }
检查多个权限
if (auth()->user()->hasPermissions(['users.create', 'users.edit'])) { // This user has both creation and edit rights. } else { // It looks like the user doesn't have one of the specified permissions. }
检查用户是否有任何权限
if (auth()->user()->hasAnyPermissions(['users.create', 'users.edit', 'users.destroy'])) { // This user either has create, edit or destroy permissions. } else { // It looks like the user doesn't have any of the specified permissions. }
检查用户是否有角色
if (auth()->user()->hasRole('administrator')) { // This user is an administrator. } else { // It looks like the user isn't an administrator. }
检查用户是否有指定的角色
if (auth()->user()->hasRoles(['administrator', 'member'])) { // This user is an administrator and a member. } else { // It looks like the user isn't an administrator or member. }
检查用户是否有任何指定的角色
if (auth()->user()->hasAnyRoles(['administrator', 'member', 'guest'])) { // This user is either an administrator, member or guest. } else { // It looks like the user doesn't have any of these roles. }
缓存
默认情况下,所有权限都会被缓存以防止在每次请求时检索。
当权限被创建、更新或删除时,此缓存会自动刷新。
如果您想禁用缓存,请在您的 AuthServiceProvider
中调用 Authorization::disablePermissionCache
。
use Larapacks\Authorization\Authorization; /** * Register any authentication / authorization services. * * @return void */ public function boot() { $this->registerPolicies(); Authorization::disablePermissionCache(); }
缓存键
默认情况下,权限缓存键是 authorization.permissions
。
要更改缓存键,请在您的 AuthServiceProvider
中调用 Authorization::cacheKey
。
use Larapacks\Authorization\Authorization; /** * Register any authentication / authorization services. * * @return void */ public function boot() { $this->registerPolicies(); Authorization::cacheKey('my-key'); }
缓存过期时间
默认情况下,权限缓存每天过期。
要更改此过期日期,请在您的 AuthServiceProvider
中调用 Authorization::cacheExpiresIn
。
use Larapacks\Authorization\Authorization; /** * Register any authentication / authorization services. * * @return void */ public function boot() { $this->registerPolicies(); Authorization::cacheExpiresIn(now()->addWeek()); }
门面注册
默认情况下,所有您创建的权限都会注册到Laravel的Gate中。
如果您想禁用此功能,请在您的 AuthServiceProvider
中调用 Authorization::disableGateRegistration
。
use Larapacks\Authorization\Authorization; /** * Register any authentication / authorization services. * * @return void */ public function boot() { $this->registerPolicies(); Authorization::disableGateRegistration(); }
中间件
Authorization包括两个有用的中间件类,您可以为您的路由使用它们。
将它们插入到您的 app/Http/Kernel.php
中
/** * The application's route middleware. * * These middleware may be assigned to groups or used individually. * * @var array */ protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, // The role middleware: 'role' => \Larapacks\Authorization\Middleware\RoleMiddleware::class, // The permission middleware: 'permission' => \Larapacks\Authorization\Middleware\PermissionMiddleware::class, ];
一旦添加,就可以开始使用它们。
注意:当用户使用中间件不符合要求时,会抛出403 HTTP异常。
保护路由以仅允许特定权限
Route::get('users', [ 'uses' => 'UsersController@index', 'middleware' => 'permission:users.index', ]); // Multiple permissions: Route::get('users', [ 'uses' => 'UsersController@index', // Users must have index **and** create rights to access this route. 'middleware' => 'permission:users.index,users.create', ]);
保护路由以允许特定角色
Route::get('users', [ 'uses' => 'UsersController@index', 'middleware' => 'role:administrator', ]); // Multiple roles: Route::get('users', [ 'uses' => 'UsersController@index', // Users must be an administrator **and** a member to access this route. 'middleware' => 'role:administrator,member', ]);
运行测试
要运行应用程序的测试,必须在运行测试权限之前,在TestCase::setUp()
方法中实例化PermissionRegistrar
,以确保权限能够正确注册。
use Larapacks\Authorization\PermissionRegistrar;
protected function setUp() : void { parent::setUp(); app(PermissionResistrar::class)->register(); }
将v1升级到v2
配置
现在通过Authorization
类的静态方法来完成配置。
您可以删除已发布的config/authorization.php
文件。
特质
UserRolesTrait
已重命名为Authorizable
。
PermissionRolesTrait
已拆分为多个特质。您必须应用HasRoles
、HasUsers
和ClearsCachedPermissions
特质。
RolePermissionsTrait
已重命名为ManagesPermissions
。
闭包权限
已删除权限闭包。如果您仍然需要此功能,请继续使用v1。