dtkahl / php-access-control
Requires
- php: >=5.6
- dtkahl/php-array-tools: ^3.0
Requires (Dev)
- phpunit/phpunit: 5.2.*
README
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。