我目前正在构建自己的 ACL,我想知道如何获取当前资源的名称。
2 回答
您负责设置系统中资源的资源 ID/名称。
一种方法是实现ResourceInterface。
这只有一种方法,getResourceId(),它将返回相关资源的唯一标识符。
一个简单的例子是有一个控制器,它将根据控制器/动作名称创建它的资源名称/ID。显然这是一个简单的例子,它可能在模块之间发生冲突,但它是一个简单的例子。
class AclController extends AbstractActionController implements ResourceInterface
{
/**
* Returns the string identifier of the Resource.
* By default we'll just use controller/action
*
* e.g. mvc:index/index
*
* @return string
*/
public function getResourceId()
{
//$request = $this->getRequest();
/* @var $request \Zend\Http\PhpEnvironment\Request */
$routeMatch = $this->getEvent()->getRouteMatch();
/* @var $routeMatch \Zend\Mvc\Router\Http\RouteMatch */
$controller = $routeMatch->getParam('controller', 'noaccess');
$action = $routeMatch->getParam('action', 'noaccess');
return 'mcv:' . $controller . '/' . $action;
}
}
然后,您可以使用任何直接通过 ACL 实现 ResourceInterface 的对象
// resource can be any object implementing the interface
$acl->addResource($resource);
正如 Andrew 已经说过的,负责构建ACL 资源标识符的人就是您。MVC 层本身没有“Acl 资源 ID”的概念。
正如@Sam 所说,您可能想了解 BjyAuthorize 是如何做到的。
Zend 框架 2 中与“资源 ID”最接近的概念是:
- 路线名称
- 控制器名称(在控制器管理器服务定位器中定义)
这些都是在您的配置中定义的东西,也可以从配置中读取。
BjyAuthorize不会自动读取资源名称,但它无论如何都会在所谓的“控制器保护”和“路由保护”中抽象它们(当请求访问时),它们是保护您的应用程序免受不必要访问的“防火墙”。
在控制器守卫中,每个控制器资源 ID 如下所示:
controller/%controller_name%:%action_name
controller/%controller_name%:%http_method
controller/%controller_name%
虽然路由具有以下语法:
route/%route_name%
BjyAuthorize 仅在缺少资源时静默失败(通过捕获Zend\Permissions\Acl\Exception\InvalidArgumentException
,但是当资源存在时,它已通过配置手动输入,如 Andrew 所说。