prophecy / permit
一个基于角色的权限包,适用于Laravel的模块。
这个包的官方仓库似乎已经不存在,因此该包已被冻结。
This package is auto-updated.
Last update: 2022-11-26 08:13:55 UTC
README
一个用于角色模块化权限的包。附带基本用法,如创建角色、模块、权限,以及在角色上分配模块化权限。
安装
您可以使用composer安装它。进入您的终端,从项目根目录运行此命令。
composer require prophecy/permit
请稍等片刻,它将下载所有依赖项。
现在使用以下命令进行迁移
php artisan migrate
要发布配置文件,请运行以下命令
php artisan vendor:publish --provider="Prophecy\Permit\PermitServiceProvider"
它将在您的config/
目录中生成一个名为permit.php
的配置文件。您可以按需修改这些文件。
return [
'session_role_key' => '_user_role',
'session_abilities_key' => '_user_abilities',
'redirect_to' => 'home'
];
您可以将认证用户的角色和能力存储在会话中。`session_role_key`和`session_abilities_key`的值将是认证用户角色和权限列表的`session_key`。
例如
session('_user_abilities') // returns you an array of abilities the user can perform
API
此包假定您的应用程序已经将角色与用户关联。此包支持用户有1个角色(1对1关系)。
迁移后,您将在数据库中看到4个额外的表。分别是以下这些:roles
、modules
、permissions
以及role_permissions
。`role_permissions`表是我们的ability
表。
用法
只需使用以下方式导入Permit类
use Prophecy\Permit\Permit;
创建角色
$permit = new Permit;
$role = [
'name' => 'admin'
];
$permit->createRole($role);
创建模块
$permit = new Permit;
$module = [
'name' => 'user'
];
$permit->createModule($module);
创建权限
$permit = new Permit;
$perm = [
'name' => 'create'
];
$permit->createPermission($perm);
创建多个
$permit = new Permit;
$perm = [
['name' => 'force_delete'],
['name' => 'download'],
['name' => 'export'],
['name' => 'test']
];
$permit->createMultiplePermission($perm);
像这样,您还有createMultipleRole
。
**创建多个模块目前还不支持,以及一些其他与模块相关的功能。将在下一个版本中添加。
查找角色
$role = $permit->findRole('user');
查找模块
$mod = $permit->findModule('articles');
查找权限
$perm = $permit->findPermission('create');
将能力附加到角色
$permit->attachAbilities($role->id,$mod->id,$permissionToGive);
attachAbilities
方法接受3个参数。`role_id`、`module_id`、`permission_ids`。`permission_ids`可以是单个id值或id数组(非关联)。
例如
//fetch role
$role = $permit->findRole('author');
//fetch module
$mod = $permit->findModule('articles');
//fetch permissions
$availablePermissions = $permit->allPermissions();
//map it down to an array.Because 'allPermissions' methods returns a collection.
$permissionToGive = $availablePermissions->map(function($perm){ return $perm->id; })->take(3)->toArray();
$permit->attachAbilities($role->id,$mod->id,$permissionToGive);
从角色中分离能力
$permissions = 1;
//or
$permissions = [1,2,3];
$permit->detachAbilities($role->id,$module->id,$permissions);
查找角色的能力
$permit->findAbilitiesOf($role->name);
findAbilitiesOf
函数也接受一个第二个字符串参数,即要在roles
表中查找的column_name
。默认设置为name
。您也可以使用id
,如下所示。
$permit->findAbilitiesOf($role->id,'id');
将返回一个数组(这是一个JSON响应。在PHP中,您将获得一个关联数组)。
[
{
"role": {
"id": 5,
"name": "admin"
},
"abilities": {
"articles": {
"create": false,
"read": true,
"edit": false,
"force_delete": true,
"download": true,
"export": true
},
"payments": {
"create": true,
"read": true,
"edit": true,
"force_delete": true,
"download": true,
"export": true
},
"users": {
"create": true,
"read": true,
"edit": true,
"force_delete": true,
"download": true,
"export": true
},
"hr": {
"create": true,
"read": true,
"edit": true,
"force_delete": true,
"download": true,
"export": true
}
}
}
]
注意:响应将根据角色 -> 模块 -> 权限附加的权限返回true或false值。如果您将创建和编辑权限附加到hr模块,响应也将返回剩余的权限,但值将为false
。
使用can
$permit->can($perm,$mod,$role->id);
//or
$permit->can('create','articles',$roleId);
方法签名是$permission
,$module
后跟$roleId
。将返回一个布尔值
。
can($permission,$module,$roleId)
$permission
和$module
分别是模型对象的实例Prophecy\Permit\Permission
和Prophecy\Permit\Module
。它们也可以是字符串。$roleId
为此版本是整数(将在下一个版本中更改)。
此方法有一个具有相同签名的辅助函数user_can
。
使用authUserCan
authUserCan将第一个参数作为权限名称
,第二个参数作为模块名称
。两者均为字符串,并返回布尔值
。
authUserCan($permissionName,$moduleName);
authUserCan('force_delete','articles');
注意:authUserCan
(辅助函数和类方法)都接受一个可选的第三个布尔参数。即$findInSession
,默认设置为true。这意味着Permit将在会话
中查找能力,这可以通过setAuthUserAbilities
(如下所述)设置。如果您将其设置为false,Permit将对该角色进行数据库查询。这是对can
方法的实现。在这种情况下,$roleId
将从会话中获取。将在下一个版本中更改。
与can
一样,authUserCan也有一个具有相同签名的辅助函数auth_user_can
。
在会话中设置已认证用户的权限
您只需使用$roleId
作为参数调用setAuthUserAbilities
即可。
$permit->setAuthUserAbilities(auth()->user()->role_id); // role_id is numeric.
中间件
在App\Http\Kernel
的route
中间件数组中添加以下行
'permit' => \Prophecy\Permit\Middlewares\Permit::class,
此路由中间件接受两个参数,$module
和$permission
。并使用auth_user_can
方法。
因此,您可以像这样使用它
Route::get('test',function(){
return 'you have permission';
})->middleware('permit:articles,force_delete');
如果认证用户没有权限,则将重定向到在config/permit.php
文件中定义的redirect_to
中的named
路由。
这是出于非常具体的目的。希望它将来会有更多的功能。