atelierdisko / li3_access
一个简单的用户访问控制库。
Requires
- php: ^5.4 || ^7
- composer/installers: ^1
- unionofrad/lithium: ^1.1
This package is auto-updated.
Last update: 2020-11-22 20:42:53 UTC
README
安装
首选的安装方法是通过 composer。您可以通过以下方式将库作为依赖项添加:
composer require atelierdisko/li3_access
li₃ 插件必须在您的应用程序引导阶段注册,因为它们使用不同的(更快的)自动加载器。
Libraries::add('li3_access')
官方手册提供了有关如何注册插件或使用替代安装方法(例如通过 GIT)的更多信息。
检查
您必须首先配置您要使用的适配器,但一旦配置完成,它就相当简单易用。
if (Access::check('default', Auth::check('default'), $this->request)) {
// Access granted :)
} else {
// Access denied :(
}
如果检查失败,则可以在检查过程中检索生成的任何错误信息如下
Access::errors('default')
配置
在此存储库中有 3 个适配器。所有 3 个适配器的工作方式略有不同。
规则适配器
此适配器实际上允许您告诉它应该如何工作。它默认包含一些预配置的规则,但添加自己的规则非常简单。
所有规则都必须返回 true
才能使访问检查成功。
使用内置规则简单使用
使用 li3_access 和规则适配器的最简单方法是授予任何已认证用户访问权限,并拒绝未认证用户的访问。
为此,我们仅从内置规则中选择 'allowAnyUser'
规则。
Access::config(
'default' => array(
'adapter' => 'Rules',
'rules' => array(
Rules::builtin()['allowAnyUser']
)
)
);
就是这样!
所有内置规则都可以以类似的方式使用。有四个内置规则:allowAll、denyAll、allowAnyUser 和 allowIp,有关更多信息,请参阅适配器本身。然而,当您添加自己的规则时,此适配器最有用。
Access::config(
'default' => array(
'adapter' => 'Rules',
'rules' => Rules::builtin()
)
);
使用自定义规则的高级使用
我们从一张白纸开始,没有配置任何规则。
Access::config(
'default' => array(
'adapter' => 'Rules'
)
);
可以通过 add
方法添加自定义规则。
Access::add('default', 'myCustomRule', function($user, $request, $options) {
// Your logic here. Just make sure it strictly returns `true` if the
// rule succeeded and `false` otherwise.
});
以下类似,但还定义了一个消息和重定向,可以通过 errors()
后期检索
Access::add('default', 'myCustomRule', array(
'message' => 'This did not go well.',
'redirect' => '/',
'rule' => function($user, $params, $options) {
// ...
}
));
还有两个要添加!
资源适配器
此适配器基于 Rules
适配器,但在执行规则检查之前使用 'resource'
作为先决条件。这允许通过自定义规则限制对某些资源的访问。
Access::add('default', 'panel', array(
'resource' => array('admin' => true),
'rule' => function($user, $params, $options) {
return $user->role === 'admin';
}
));
匹配资源
规则按从上到下的顺序进行评估,直到当前请求可以与资源条件匹配。如果当前请求无法匹配,则访问检查失败。没有资源的规则永远不会匹配。
资源定义可以是以下之一
- 一组参数键
- 一个路由简写字符串(带或不带通配符)
- 一个正则表达式,它将匹配 URL
- 一个字符串,它将严格与 URL 比较
- 接收当前参数数组的闭包。
- 一个包含2、3、4或5个条件(条件通过或操作符合并)的数组。
'resource' => array('controller' => 'Users')
// ... or ...
'resource' => 'Users::*'
// ... or ...
'resource' => '*'
// ... or ...
'resource' => '#^/users/.*#'
// ... or ...
'resource' => function($params) {
return $params['controller'] === 'Users';
}
// ... or ...
'resource' => array(
'Users::*',
'Pages::*'
)
认证资源适配器
该适配器基于Resources
适配器,但它不是依赖于自定义规则检查,而是将规则与认证进行比较。它用于通过检查用户是否通过某些(一组)认证配置进行了认证来控制对资源的访问。
因此,让我们看看一个示例配置,以尝试达到一些清晰度。
Auth::config(array(
'admin' => array(
'adapter' => 'Form',
'model' => 'User',
'fields' => array('email' => 'email', 'password' => 'password'),
'scope' => array('active' => true, 'role' => 'admin')
),
'api' => array(
'adapter' => 'Token'
'scope' => array('active' => true)
)
));
Access::config(array(
'default' => array(
'adapter' => 'AuthedResources',
'rules' => array(
array(
'resource' => array('admin' => true),
'auth' => 'admin',
'message' => 'You must login before using the admin panel!11!1!',
'redirect' => array(
'library' => 'admin',
'controller' => 'Users', 'action' => 'login'
)
),
array(
'resource' => array(
'admin' => true,
'controller' => 'Users', 'action' => 'logout'
),
'auth' => '*'
),
array(
'resource' => array(
'api' => true,
'controller' => 'Events', 'action' => 'index'
),
'auth' => array('admin', 'api')
),
array(
'resource' => '*',
'auth' => '*'
)
)
)
));
需要认证
'auth'
可以是字符串或一个认证配置键的数组,该规则要求这些键。字符串*
表示所有人,甚至包括未认证的人。一个admin
字符串将验证任何可以与用户定义的admin
认证配置进行认证的人。一个配置键的数组执行相同的操作,但您可以一次性将其应用于多个认证配置。
假设我们有一个如下的认证配置
Auth::config(array(
'user' => array(
'adapter' => 'Form',
'model' => 'Customer',
'fields' => array('email' => 'email', 'password' => 'password'),
'scope' => array('active' => true)
),
'editor' => array(
// ...
'scope' => array('active' => true, 'role' => 'editor')
),
'customer' => array(
// ...
'scope' => array('active' => true, 'role' => 'customer')
)
));
设置'auth' => array('user', 'customer')
将只将规则应用于可以认证为用户或客户的任何人。设置'auth' => '*'
表示所有这些认证配置以及未认证的人都将应用此规则。
过滤器
Access::check()方法是可以过滤的。您可以这样应用过滤器
Access::applyFilter('check', function($self, $params, $chain) {
// Filter logic goes here
return $chain->next($self, $params, $chain);
});
历史
Tom Maiaroto最初编写了这个插件。Marc Schwering编写了原始的认证资源适配器。rich97修改了原始的认证资源适配器和文档。
版权 & 许可
版权所有 2010 RAD 联盟。保留所有权利。此库根据BSD 3-Clause 许可证分发。完整的许可证文本可以在LICENSE.txt文件中找到。