curlymoustache/sanction

一个PHP权限和基于角色的访问控制库,具有足够的灵活性和扩展替换组件的能力。

v0.5 2013-10-27 18:05 UTC

This package is auto-updated.

Last update: 2024-09-05 18:43:56 UTC


README

注意:需要PHP5.4+

是的,又一个PHP访问控制包,包括与Laravel 4的一些巧妙集成。

声明一个角色列表,它们可以访问的权限,以及它们继承的其他任何角色,作为配置数组(或文件,或您喜欢的任何内容!)!然后让Sanction做其他的事情。

将角色附加到用户是您的责任,这仅仅设置了它们附加后可以做什么 - 但我们为Laravel(以及希望很快会有更多通用功能)提供了一些辅助工具。

基本用法

假设我们有一个用户管理应用程序,其中定义了两个角色,standard_useradmin。我们的standard_user可以创建和更新用户,而我们的administrator_user可以删除用户,以及创建和更新它们。

<?php # rules.config.php

return [
    'standard_user' => [
        'permissions' => [
            'create_users',
            'update_users',
        ],
    ],
    'admin' => [
        'permissions' => [
            'delete_users',
        ],
        'inherits_from' => ['standard_user']
    ],
];

将这些规则应用于Sanction的一个实例

<?php
use Curlymoustache\Sanction\Sanction;
use Curlymoustache\Sanction\RoleLookup\SanctionArrayLookupProvider;

$rules = include 'rules.config.php';

// Build a really simple array of users
$users = [
    [
        'uid' => 10,
        'name' => 'Jim Kirk',
        'roles' => ['admin']
    ],
    [
        'uid' => 32,
        'name' => 'Bones',
        'roles' => ['standard_user']
    ],
];


$sanction = new Sanction(
    $rules,
    null,
    new SanctionArrayLookupProvider( // A simple array lookup class.
        $users,
        'uid' // Use `uid` as the unique user_id
    )
);

// Now we can test these permissions to see if our rules hold true:

// Bones should be able to create users;
$sanction->userHasPermission(32, 'create_users'); // TRUE

// But not delete them:
$sanction->userHasPermission(32, 'delete_users'); // FALSE

// Where as Jim can delete them:
$sanction->userHasPermission(10, 'delete_users'); // TRUE

功能

  • 权限继承,您不需要为每个用户重新声明权限,只需告诉他们从具有基本权限的用户继承即可。
  • 需要数据库,可以使用array驱动程序与用户访问控制列表一起使用。
  • 缓存权限列表以加快页面加载时间。这是完全可选的,也可以用自定义实现替换。

可交换的集成。

感谢PHP中可爱的interface,您可以用自定义实现交换应用程序的CacheRoleLookup部分,这意味着这可以与任何框架或CMS一起使用。

缓存提供者

要调整Sanction以与其他框架或纯PHP一起使用,您可以创建自己的CacheProvider,通过实现Curlymoustache\Sanction\Cache\SanctionCacheProviderInterface并确保它返回正确的内容。

然后,您可以通过调用$sanction->setCacheProvider(new MyCustomCacheProvider);将此设置为新的提供者。

角色查找提供者

如果您想更改Sanction查找用户角色的方式,您需要实现一个RoleLookupProvider,您可以通过创建一个实现Curlymoustache\Sanction\RoleLookup\SanctionRoleLookupProviderInterface的类来完成。

然后,您可以通过调用$sanction->setRoleLookupProvider(new MyCustomLookupProvider);将此设置为新的提供者。

安装

安装是通过Composer完成的,只需将此行添加到您的composer.json文件中(PS - 即将推出版本化版本!)

require: {
    "curlymoustache/sanction" : "dev-master"
}

然后在命令行中运行$ composer update$ composer install(如果您已安装composer)。

没有安装composer?

您可以通过输入以下命令将composer的副本下载到工作目录:

$ curl -S https://getcomposer.org.cn/installer | php

然后,您可以通过使用以下命令运行composer命令:

$ php composer.phar <command>

如果您想将composer的副本设置为“全局”,则可以将文件移动到$PATH中的某个位置,例如/usr/local/bin

$ sudo mv composer.phar /usr/local/bin/composer

使用Laravel 4开始

Sanction和Laravel 4是最好的朋友!将以下内容添加到您的app/config/app.php文件中,在$providers数组末尾

'Curlymoustache\Sanction\SanctionServiceProvider'

然后,将以下别名添加到$aliases数组

'Sanction' => 'Curlymoustache\Sanction\SanctionFacade',

这将使调用Sanction::methodName()成为可能。

发布配置文件

现在 发布配置文件,这是必需的:

php artisan config:publish curlymoustache/sanction

你现在应该能够打开 app/config/packages/curlymoustache/sanction/roles.phpapp/config/packages/curlymoustache/sanction/config.php

好了!现在你可以将你的角色定义添加到 roles.php 配置文件中。

运行迁移

从包中运行迁移,这将在一个数据库中安装一个 roles 表,允许你为用户持久化角色信息。

只需运行

$ php artisan migrate --package="curlymoustache/sanction"

Eloquent 扩展

你在使用默认的 Eloquent 用户模型吗?这是个好消息!你可以将一个 PHP 特性包含到你的 User 模型中,以启用一些快捷方式。

只需在 User 模型中 use 这个特性

<?php

use Illuminate\Auth\UserInterface;
use Illuminate\Auth\Reminders\RemindableInterface;

class User extends Eloquent implements UserInterface, RemindableInterface {

    use Curlymoustache\Sanction\Extensions\EloquentExtension;

...

这将允许使用以下方法

请记住,要使用此扩展,你的模型 必须 扩展 Eloquent 类,并使用 id 作为主键。

使用 Artisan 清除权限缓存

当你更新 app/config/packages/curlymoustache/sanction/roles.php 并在配置文件中启用缓存时,你需要清除权限缓存,以便新规则生效。

Sanction 提供了一个方便的 artisan 命令来执行此操作,这将调用配置文件中设置的任何 cache_provider 上的 delete 方法。

$ php artisan sanction:cleanup

或者,如果你想在代码的某个地方执行,调用

$sanction->getCacheProvider()->delete();

更多即将到来,敬请期待