tmaiaroto/li3_access

一个简单的用户访问控制库。

dev-master 2013-12-19 16:09 UTC

This package is not auto-updated.

Last update: 2024-09-14 14:50:18 UTC


README

安装

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

cd libraries
git clone https://github.com/tmaiaroto/li3_access.git

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

Libraries::add('li3_access');

用法

您必须首先配置您希望使用的适配器,一旦配置完毕,使用起来就相当简单。

$access = Access::check('access_config_name', $this->request, Auth::check('auth_config_name'));
if(!empty($access)) {
	$this->redirect($access['redirect']);
}

如果请求根据您的配置正确验证,则 Access::check() 将返回一个空 array(),否则它将返回一个包含两个键的数组;messageredirect。这些值是内置在 Access 类中的,但您可以通过将它们作为 $options 传递给此存储库中的所有三个适配器来覆盖它们。

配置

在此存储库中,有三个适配器。所有三个都以稍微不同的方式工作。

简单适配器

简单适配器正是其名称所表示的那样。检查方法仅检查传递给它的数据是否不为空,因此配置非常简单。

Access::config(
	'simple' => array('adapter' => 'Simple')
);

就是这样!

规则适配器

此适配器有效地允许您告诉它应该如何工作。它默认包含一些预配置的规则,但添加您自己的规则非常简单。如果只想使用内置方法,其配置与 Simple 适配器相同。

Access::config(
	'rules' => array('adapter' => 'Rules')
);

然后拒绝所有来自已验证用户的请求。

$access = Access::check('rules', Auth::check('auth_config_name'), $this->request, array('rule' => 'denyAll'));
if(!empty($access)) {
	$this->redirect($access['redirect']);
}

有四个内置规则;允许所有、拒绝所有、允许任何用户和允许IP,更多详细信息请参阅适配器本身。然而,此适配器在您添加自己的规则时最为有用。

Access::adapter('custom_rule')->add(function($user, $request, $options) {
	// Your logic here. Just make sure it returns an array.
});

然后使用您的新规则

$access = Access::check('rules', Auth::check('auth_config_name'), $this->request, array('rule' => 'custom_rule'));

再来一个!

AuthRbac适配器

这是目前存储库中最复杂的适配器。它用于基于角色的访问控制。您定义一组角色(或条件)以匹配请求,如果请求与您的条件匹配,适配器将检查用户是否已通过适当的 \lithium\security\Auth 配置进行验证,以授予访问权限。

很难解释(希望这足够清楚),让我们看看一个示例配置来尝试获得一些清晰度

$accountsEmpty = Accounts::count();

Access::config(array(
	'auth_rbac' => array(
		'adapter' => 'AuthRbac',
		'roles' => array(
			array(
				'resources' => '*',
				'match' => '*::*'
			),
			array(
				'message' => 'No panel for you!',
				'redirect' => array('library' => 'admin', 'Users::login'),
				'resources' => 'admin',
				'match' => array('library' => 'admin', '*::*')
			),
			array(
				'resources' => '*',
				'match' => array(
					'library' => 'admin', 'Users::login',
					function($request, &$options) {
						return !empty($request->data);
					}
				),
				'allow' => function($request, &$options) use ($accountsEmpty) {
					if ($accountsEmpty) {
						$options['message'] = 'No accounts exist yet!';
					}
					return $accountsEmpty;
				}
			),
			array(
				'resources' => '*',
				'match' => array('library' => 'admin', 'Users::logout')
			)
		)
	)
));

首先我们告诉它使用哪个适配器

'adapter' => 'AuthRbac',

然后我们设置角色数组。如果您想使用此适配器,则需要此数组。角色从上到下进行评估。因此,如果位于底部的角色与位于顶部的角色相矛盾,则底部将优先。

对于单个角色,您可以指定五个可能选项。

'message'

覆盖默认消息,如果规则与请求匹配并且被拒绝。

'redirect'

覆盖默认重定向,如果规则与请求匹配并且被拒绝。

'match'

用于将此角色与 check() 方法传递的请求对象匹配的规则。您可以使用参数数组,其中明确设置参数/值对,一个与生成URL时使用的简写语法非常相似的语法,甚至是一个闭包。如果没有设置匹配,则角色将始终拒绝访问。

在闭包示例配置中

'match' => array(
	'library' => 'admin', 'Users::login',
	function($request, &$roleOptions) {
		return !empty($request->data);
	}
)

不仅库、控制器和操作必须匹配,而且闭包必须返回 true。因此,只有当所有请求参数匹配并且请求数据已设置时,此角色才会应用于此请求。

'resources'

应用于此规则的字符串或认证配置键的数组。字符串 * 表示所有人,包括未认证的用户。字符串 admin 将验证可以与用户定义的 admin 认证配置进行认证的任何人。配置键的数组执行相同的操作,但您可以一次性应用于多个认证配置。

假设我们有一个这样的认证配置

Auth::config(array(
	'user' => array(
		'adapter' => 'Form',
		'model' => 'User',
		'fields' => array('email' => 'email', 'password' => 'password'),
		'scope' => array('active' => true)
	),
	'editor' => array(
		'adapter' => 'Form',
		'model' => 'Editor',
		'fields' => array('email' => 'email', 'password' => 'password'),
		'scope' => array('active' => true, 'group' => 1)
	),
	'customer' => array(
		'adapter' => 'Form',
		'model' => 'Customer',
		'fields' => array('email' => 'email', 'password' => 'password'),
		'scope' => array('active' => true, 'group' => 2)
	)
));

设置 'resources' => array('user', 'customer') 将仅将规则应用于可以认证为用户或客户的任何人。设置 'resource' => '*' 意味着所有这些认证配置和未认证的人都将应用此角色。

'allow'

一个布尔值,如果设置为 false,将强制一个原本会授予访问权限的角色拒绝访问。与 'match' 选项类似,您也可以向此选项传递一个闭包。这样,您可以先黑名单所有资源,然后手动白名单资源。此外,通过传递闭包,您可以根据请求拒绝访问。

最后,如果您传递了 $request 或 $options,您可以在运行时修改它们的值。

过滤器

Access::check() 方法是可过滤的。您可以在配置中应用过滤器,如下所示

Access::config(array(
	'rule_based' => array(
		'adapter' => 'Rules',
		'filters' => array(
			function($self, $params, $chain) {
				// Filter logic goes here
				return $chain->next($self, $params, $chain);
			}
		)
	)
));

致谢

Tom Maiaroto

此库的原始作者。

Github: tmaiaroto

网站: Shift8 Creative

Weluse

编写了原始的 Rbac 适配器。

Github: Marc Schwering weluse

网站: Weluse

rich97

修改了原始的 Rbac 适配器,添加了一些测试并编写了此版本的文档。

Github: rich97

网站: Enrich.it