0

我目前正在构建自己的 ACL,我想知道如何获取当前资源的名称。

4

2 回答 2

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);
于 2013-03-18T10:11:01.850 回答
0

正如 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 所说。

于 2013-03-18T18:26:17.603 回答