divdax / roles
处理 Laravel 5 中角色和权限的强大软件包。
Requires
- php: >=7.1.3
- illuminate/database: 5.8|^6.0
- illuminate/support: 5.8|^6.0
Requires (Dev)
- mockery/mockery: ^1.0
- orchestra/database: dev-master
- orchestra/testbench: dev-master
- phpunit/phpunit: ~7.0
- satooshi/php-coveralls: ^2.0
- sebastian/environment: ^3.1
- dev-master
- 5.8.x-dev
- 5.8.0
- 5.7.x-dev
- 5.7.1
- 5.7.0
- 5.6.x-dev
- 5.6.2
- 5.6.1
- 5.6.0
- 5.5.x-dev
- 5.5.0
- 5.4.x-dev
- 5.4.0
- 5.3.x-dev
- 5.3.1
- 5.3.0
- 5.2.x-dev
- 5.2.0
- 5.1.x-dev
- 5.1.0
- 2.1.7
- 2.1.6
- 2.1.5
- 2.1.4
- 2.1.3
- 2.1.2
- 2.1.1
- 2.1.0
- 2.0.2
- 2.0.1
- 2.0.0
- 1.7.1
- 1.7.0
- 1.6.0
- 1.5.4
- 1.5.3
- 1.5.2
- 1.5.1
- 1.5.0
- 1.4.1
- 1.4.0
- 1.3.0
- 1.2.4
- 1.2.3
- 1.2.2
- 1.2.1
- 1.2.0
- 1.1
- 1.0
- 0.9
This package is auto-updated.
Last update: 2020-02-09 23:51:43 UTC
README
#废弃 The Roles and permissions for laraval 5 package is abandoned and will no longer be maintained by Ultraware. Feel free to fork the project and submit it to packagist. We can share the url to your package on this page if you send us a message.
Laravel 5 的角色和权限
处理 Laravel 5 中角色和权限的强大软件包。
安装
此软件包非常易于设置。只需几个步骤。
Composer
通过 Composer 拉取此软件包
composer require ultraware/roles
如果您仍在使用 Laravel 5.0,则必须拉取
1.7.*
版本。
服务提供者
将软件包添加到您的应用程序服务提供者在 config/app.php
文件中。
'providers' => [ ... /** * Third Party Service Providers... */ Ultraware\Roles\RolesServiceProvider::class, ],
配置文件和迁移
将软件包配置文件和迁移发布到您的应用程序。在您的终端中运行以下命令。
php artisan vendor:publish --provider="Ultraware\Roles\RolesServiceProvider" --tag=config
php artisan vendor:publish --provider="Ultraware\Roles\RolesServiceProvider" --tag=migrations
并运行迁移。
php artisan migrate
这使用 Laravel 中的默认用户表。您应该已经有了用户表的迁移文件,并且已经迁移。
HasRoleAndPermission 特性和合约
包含 HasRoleAndPermission
特性,并在您的 User
模型中实现 HasRoleAndPermission
合约。
从 bican roles 迁移
如果您从 bican/roles 迁移到 ultraware/roles,则需要更新一些内容。
- 将所有对
can
、canOne
和canAll
的调用更改为hasPermission
、hasOnePermission
、hasAllPermissions
。 - 将所有对
is
、isOne
和isAll
的调用更改为hasRole
、hasOneRole
、hasAllRoles
。
用法
创建角色
use Ultraware\Roles\Models\Role; $adminRole = Role::create([ 'name' => 'Admin', 'slug' => 'admin', 'description' => '', // optional 'level' => 1, // optional, set to 1 by default ]); $moderatorRole = Role::create([ 'name' => 'Forum Moderator', 'slug' => 'forum.moderator', ]);
由于
Slugable
特性,如果发生错误,例如在 slug 参数中留下空格,它将被自动替换为点,因为使用了str_slug
函数。
附加、分离和同步角色
这很简单。您从数据库中获取一个用户并调用attachRole
方法。在User
和Role
模型之间存在BelongsToMany
关系。
use App\User; $user = User::find($id); $user->attachRole($adminRole); // you can pass whole object, or just an id $user->detachRole($adminRole); // in case you want to detach role $user->detachAllRoles(); // in case you want to detach all roles $user->syncRoles($roles); // you can pass Eloquent collection, or just an array of ids
检查角色
现在您可以检查用户是否有所需的角色。
if ($user->hasRole('admin')) { // you can pass an id or slug // }
您也可以这样做
if ($user->isAdmin()) { // }
当然,检查多个角色的方法也存在
if ($user->hasRole(['admin', 'moderator'])) { /* | Or alternatively: | $user->hasRole('admin, moderator'), $user->hasRole('admin|moderator'), | $user->hasOneRole('admin, moderator'), $user->hasOneRole(['admin', 'moderator']), $user->hasOneRole('admin|moderator') */ // The user has at least one of the roles } if ($user->hasRole(['admin', 'moderator'], true)) { /* | Or alternatively: | $user->hasRole('admin, moderator', true), $user->hasRole('admin|moderator', true), | $user->hasAllRoles('admin, moderator'), $user->hasAllRoles(['admin', 'moderator']), $user->hasAllRoles('admin|moderator') */ // The user has all roles }
等级
当您创建角色时,有一个可选参数level
。它默认设置为1
,但您可以覆盖它,然后您可以这样做
if ($user->level() > 4) { // }
如果用户有多个角色,方法
level
返回最高等级。
Level
对继承权限也有很大影响。关于这一点,稍后再说。
创建权限
由于Permission
模型的存在,这非常简单。
use Ultraware\Roles\Models\Permission; $createUsersPermission = Permission::create([ 'name' => 'Create users', 'slug' => 'create.users', 'description' => '', // optional ]); $deleteUsersPermission = Permission::create([ 'name' => 'Delete users', 'slug' => 'delete.users', ]);
附加、分离和同步权限
您可以将权限附加到角色或直接附加到特定用户(当然,也可以分离它们)。
use App\User; use Ultraware\Roles\Models\Role; $role = Role::find($roleId); $role->attachPermission($createUsersPermission); // permission attached to a role $user = User::find($userId); $user->attachPermission($deleteUsersPermission); // permission attached to a user
$role->detachPermission($createUsersPermission); // in case you want to detach permission $role->detachAllPermissions(); // in case you want to detach all permissions $role->syncPermissions($permissions); // you can pass Eloquent collection, or just an array of ids $user->detachPermission($deleteUsersPermission); $user->detachAllPermissions(); $user->syncPermissions($permissions); // you can pass Eloquent collection, or just an array of ids
检查权限
if ($user->hasPermission('create.users')) { // you can pass an id or slug // } if ($user->canDeleteUsers()) { // }
您可以像检查角色一样检查多个权限。您可以利用像hasOnePermission
或hasAllPermissions
这样的额外方法。
权限继承
等级较高的角色会从等级较低的角色继承权限。
以下是一个魔法
示例
您有三个角色:user
、moderator
和admin
。用户有权阅读文章,版主可以管理评论,管理员可以创建文章。用户等级为1,版主等级为2,管理员等级为3。这意味着,版主和管理员也有权阅读文章,但管理员还可以管理评论。
如果您不希望在您的应用程序中启用权限继承功能,则在创建角色时简单地忽略
level
参数。
实体检查
假设您有一篇文章并想编辑它。这篇文章属于一个用户(文章表中有一个user_id
列)。
use App\Article; use Ultraware\Roles\Models\Permission; $editArticlesPermission = Permission::create([ 'name' => 'Edit articles', 'slug' => 'edit.articles', 'model' => 'App\Article', ]); $user->attachPermission($editArticlesPermission); $article = Article::find(1); if ($user->allowed('edit.articles', $article)) { // $user->allowedEditArticles($article) // }
此条件检查当前用户是否是文章的所有者。如果不是,它将查找之前创建的行在用户权限中。
if ($user->allowed('edit.articles', $article, false)) { // now owner check is disabled // }
Blade 扩展
有四个Blade扩展。基本上,它是经典if语句的替代品。
@role('admin') // @if(Auth::check() && Auth::user()->hasRole('admin')) // user has admin role @endrole @permission('edit.articles') // @if(Auth::check() && Auth::user()->hasPermission('edit.articles')) // user has edit articles permissison @endpermission @level(2) // @if(Auth::check() && Auth::user()->level() >= 2) // user has level 2 or higher @endlevel @allowed('edit', $article) // @if(Auth::check() && Auth::user()->allowed('edit', $article)) // show edit button @endallowed @role('admin|moderator', true) // @if(Auth::check() && Auth::user()->hasRole('admin|moderator', true)) // user has admin and moderator role @else // something else @endrole
中间件
此包附带VerifyRole
、VerifyPermission
和VerifyLevel
中间件。您必须将它们添加到您的app/Http/Kernel.php
文件中。
/** * The application's route middleware. * * @var array */ protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'role' => \Ultraware\Roles\Middleware\VerifyRole::class, 'permission' => \Ultraware\Roles\Middleware\VerifyPermission::class, 'level' => \Ultraware\Roles\Middleware\VerifyLevel::class, ];
现在您可以轻松保护您的路由。
$router->get('/example', [ 'as' => 'example', 'middleware' => 'role:admin', 'uses' => 'ExampleController@index', ]); $router->post('/example', [ 'as' => 'example', 'middleware' => 'permission:edit.articles', 'uses' => 'ExampleController@index', ]); $router->get('/example', [ 'as' => 'example', 'middleware' => 'level:2', // level >= 2 'uses' => 'ExampleController@index', ]);
如果出错,它会抛出\Ultraware\Roles\Exceptions\RoleDeniedException
、\Ultraware\Roles\Exceptions\PermissionDeniedException
或\Ultraware\Roles\Exceptions\LevelDeniedException
异常。
您可以在app/Exceptions/Handler.php
文件中捕获这些异常并执行您想要的任何操作。
/** * Render an exception into an HTTP response. * * @param \Illuminate\Http\Request $request * @param \Exception $e * @return \Illuminate\Http\Response */ public function render($request, Exception $e) { if ($e instanceof \Ultraware\Roles\Exceptions\RoleDeniedException) { // you can for example flash message, redirect... return redirect()->back(); } return parent::render($request, $e); }
配置文件
您可以更改模型的连接、slug分隔符、模型路径,还有一个方便的模拟功能。查看配置文件以获取更多信息。
更多信息
有关更多信息,请参阅HasRoleAndPermission合约。
许可
此软件包是免费软件,根据MIT许可协议进行分发。