tmaiaroto / li3_access
一个简单的用户访问控制库。
Requires
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(),否则它将返回一个包含两个键的数组;message 和 redirect。这些值是内置在 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