atelierdisko/li3_access

该软件包已被 废弃 并不再维护。未建议替代包。

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

安装次数: 2,094

依赖者: 5

建议者: 0

安全性: 0

星级: 2

关注者: 2

分支: 20

公开问题: 0

类型:lithium-library

v2.1.2 2019-09-16 08:18 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';
	}
));

匹配资源

规则按从上到下的顺序进行评估,直到当前请求可以与资源条件匹配。如果当前请求无法匹配,则访问检查失败。没有资源的规则永远不会匹配。

资源定义可以是以下之一

  1. 一组参数键
  2. 一个路由简写字符串(带或不带通配符)
  3. 一个正则表达式,它将匹配 URL
  4. 一个字符串,它将严格与 URL 比较
  5. 接收当前参数数组的闭包。
  6. 一个包含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文件中找到。