jails/li3_access

Lithium PHP 框架的访问控制(DbAcl、规则、简单)

安装: 80

依赖项: 2

建议者: 0

安全性: 0

星星: 2

关注者: 3

分支: 1

开放问题: 0

类型:lithium-library

dev-master 2013-12-11 03:13 UTC

This package is auto-updated.

Last update: 2024-08-29 03:47:33 UTC


README

不要在生产环境中使用。这是一个早期 alpha 版本。

需求

  • PHP 5.4
  • 此插件需要 li3_behaviors(仅当您打算使用 DbAcl 适配器时)。
  • 此插件需要 li3_tree(仅当您打算使用 DbAcl 适配器时)。
  • 此插件需要 li3_fixtures(仅当您打算运行 DbAcl 适配器测试时)。

安装

将代码检出至您的库目录之一

cd libraries
git clone git@github.com:jails/li3_access.git

将库包含在您的 /app/config/bootstrap/libraries.php

Libraries::add('li3_access');

展示

此插件提供了一些适配器,用于管理您的应用程序中的访问控制。它可以管理基于规则的简单系统以及访问控制列表系统。访问控制列表是一种以细粒度管理应用程序权限的方式。它不如基于规则的系统快,但允许对应用程序/模型进行更细粒度的控制。

API

简单适配器

简单适配器仅检查传递的数据是否为空。

Access::config('simple' => ['adapter' => 'Simple']);
Access::check('rules', ['username' => 'Max']); //return `true`
Access::check('rules', true); //return `true`
Access::check('rules', []); //return `false`

规则适配器

规则适配器检查来自预定义/自定义闭包的访问。要使用此适配器,请按以下方式配置 Access

Access::config('rules', ['adapter' => 'Rules']);

规则适配器已包含以下规则: 'allowAll''denyAll''allowAnyUser''allowIp'

使用示例

$user = Auth::check('auth_config_name');
Access::check('rules', $user, $request, ['rules' => ['allowAnyUser']]);

$user = User::find('first', ['username' => 'psychic']);
Access::check('rules', $user, $request, ['rules' => ['allowAnyUser']]);

带参数的规则

Access::check('rules', null, $request,  [
	'rules' => [
		'allowIp' => [
			'ip' => '/10\.0\.1\.\d+/' //parameter to pass to the `'allowIp'` closure.
		]
	]
]);

您可以在 ::config() 上添加自定义规则

Access::config('rules' => [
	'adapter' => 'Rules',
	'rules' => [
		'testDeny' => [
			'message' => 'Access denied.',
			'rule' => function($requester) {
				return false;
			}
		]
	]
]);

或动态添加

Access::rules('rules', 'testDeny', function($requester) { return false; }, [
	'message' => 'Access denied.'
]);

DbAcl 适配器

此适配器目前仅适用于 SQL 数据库(即 MySQL、PostgreSQL 和 Sqlite3)。

Access::config('acl' => ['adapter' => 'DbAcl']);

访问控制列表(ACL)处理两个主要方面:想要东西的人和想要的东西。这通常表示为

  • 访问控制对象(Aco),即想要的东西
  • 访问请求对象(Aro),即想要某物的人

在 Acos 和 Aros 之间,有权限定义 Aros 和 Acos 之间的访问权限。

上面是使 MySQL 数据库能够开箱即用的所需架构

DROP TABLE IF EXISTS `acos`;
CREATE TABLE `acos` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `parent_id` int(10) DEFAULT NULL,
  `class` varchar(255) DEFAULT NULL,
  `fk_id` int(10) DEFAULT NULL,
  `alias` varchar(255) DEFAULT NULL,
  `lft` int(10) DEFAULT NULL,
  `rght` int(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
);


DROP TABLE IF EXISTS `aros`;
CREATE TABLE `aros` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `parent_id` int(10) DEFAULT NULL,
  `class` varchar(255) DEFAULT NULL,
  `fk_id` int(10) DEFAULT NULL,
  `alias` varchar(255) DEFAULT NULL,
  `lft` int(10) DEFAULT NULL,
  `rght` int(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
);


DROP TABLE IF EXISTS `permissions`;
CREATE TABLE `permissions` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `aro_id` int(10) NOT NULL,
  `aco_id` int(10) NOT NULL,
  `privileges` text,
  PRIMARY KEY (`id`)
);

当然,您需要根据您自己的 SQL 数据库调整此架构。

一旦 Acos 和 Aros 正确定义(请参阅测试的 fixtures 以更好地理解 Acos 和 Aros 的样子)。

您可以添加权限

Access::allow('acl', 'admin/max', 'controller/backend', ['read', 'create', 'update', 'delete']);
//or:
Access::allow('acl', 'admin/max', 'controller/backend', 'publish');
//or:
$user = User::find('first', ['username' => 'max']);
Access::allow('acl', $user, 'controller/backend', ['read', 'create', 'update', 'publish']);

您可以删除权限

Access::deny('acl', 'user/joe', 'controller/backend', ['delete']);

使用 Access::check() 检查一些权限

Access::check('acl', 'user/joe', 'controller/backend', ['delete']);

或使用 Access::get() 恢复 Aro/Aco 的所有权限

Access::get('acl', 'user/joe', 'controller/backend');

问候

li3 团队,Tom Maiaroto,Weluse,rich97,CakePHP 的 ACL,Pamela Anderson 以及所有使这一切成为可能的人。

构建状态

Build Status