prophecy/permit

一个基于角色的权限包,适用于Laravel的模块。

这个包的官方仓库似乎已经不存在,因此该包已被冻结。

安装: 285

依赖项: 0

建议者: 0

安全: 0

星标: 0

关注者: 1

分支: 0

开放问题: 2

类型:package

v1.0.1 2019-12-05 12:35 UTC

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个额外的表。分别是以下这些:rolesmodulespermissions以及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\PermissionProphecy\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\Kernelroute中间件数组中添加以下行

'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路由。

这是出于非常具体的目的。希望它将来会有更多的功能。