dtkahl/php-access-control

2.0.1 2017-05-26 09:20 UTC

This package is auto-updated.

Last update: 2024-08-29 04:14:35 UTC


README

Latest Stable Version License Build Status

PHP 访问控制

此包提供了一个基于用户、角色、权限和对象访问控制(权限管理)系统。

用户

此包的主要目的是证明用户是否拥有特定的权限。

用户可以通过不同的方式拥有权限

  • 通过全局角色
  • 通过对象角色

角色

角色是一组定义好的权限,可以扩展另一个现有角色。角色可以在全局范围内或特定对象上分配。

对象

用户可以为特定对象拥有特定角色。例如:用户 "John" 在对象 "BlogPost" 上拥有 "author" 角色。

对象可以是实现 ObjectInterface 的任何类。例如,它可以是一个 Eloquent 模型类 BlogPost

安装

使用 Composer 安装

composer require dtkahl/php-array-tools

使用方法

创建用户

这并不是什么大问题。您只需要一个实现 UserAccessInterface 的类即可。

这需要您实现一个方法

  • getGlobalRoles - 返回用户希望拥有的角色名称(字符串)数组。您存储这些信息的方式完全取决于您。

创建对象

如果您只想实现全局权限,则可以跳过此步骤。如果您想拥有对象角色和权限,则必须在您的对象类中实现 ObjectInterface

这需要三个方法

  • getObjectIdentifier - 返回一个字符串标识符。这用于在稍后定义的角色中找到正确的权限
  • getUserRoles - 返回一个数组,其中包含给定用户(此方法参数)与该对象实例相关的角色名称(字符串)。您存储这些信息的方式完全取决于您。
  • getRelatedObjects - 返回一个相关对象数组(这些对象也必须实现接口)。这用于继承。例如:用户可以删除 BlogComment,因为 BlogComment 与用户拥有 "author" 角色的 BlogPost 相关

定义角色和权限

这可以在您的应用程序中的任何位置进行,但必须在检查权限之前完成。最佳位置可能是依赖注入容器内部。

定义角色

$role_member = new AccessRole(
    "member", // role name
    [
        "access",                           // rights as string
        "blog_post.edit"                    // you can namespace rights with a dot, this is often used for object identifier
        "blog_post" => ["view", "create"]   // instead of a dot you can also use an array to create namespaces
    ],
);

命名空间是自问题 #10 和新版本 2.0.0 以来引入的

扩展角色

$role_admin = new AccessRole(
    "admin", // role name
    ["do_admin_stuff"],  // global rights as array
    [],
    $role_member // extend the member role so you dont have to specify all rights a second time
);

定义对象

$object_blog = new AccessObject(
    "blog", // identifier of an object
    [$role_author, $role_subscriber] // array of object related roles
);

创建法官实例

$judge = new Judge(
    [$role_member], // array of all defined global roles
    [$object_blog, $object_comment], // array of all defined objects
    $user // optional, default user to check rights for
);

法官类

这是检查权限或角色的主要类。您通常希望让您的依赖注入容器返回此类的实例。

它具有以下公共方法

registerRole($role)

为法官实例注册一个新全局角色。

registerObject($object)

为法官实例注册一个新对象。

setUser($user)

设置法官实例的默认用户。

getUser()

返回法官实例的默认用户。

checkRight($rights, $object = null, $user = null)

如果用户没有给定的权限,则抛出 NotAllowedException

如果给定对象为 null,则仅检查全局权限。如果给定用户为 null,则使用默认用户。

示例

$comment = BlogComment::find('1');
$judge->checkRight('edit', $comment); // check if the default user is allowed to edit a specific comment

hasRight($rights, $object = null, $user = null)

这是对checkRights()的代理,但它不会抛出异常,仅返回true或false。

checkRole

如果用户没有给定的角色,则抛出NotAllowedException异常。

如果给定对象为null,则仅检查全局角色。如果给定用户为null,则使用默认用户。如果参数check_extend_roles为true(默认:false),则还会检查用户所具有角色的扩展角色。 (见问题#9)

示例

$comment = BlogComment::find('1');
$judge->checkRole('creator', $comment); // check if the default user is the creator of this comment

hasRight

这是对checkRole()的代理,但它不会抛出异常,仅返回true或false。