首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问签入Extbase

访问签入Extbase
EN

Stack Overflow用户
提问于 2015-09-07 10:23:49
回答 2查看 465关注 0票数 0

我有一个琐碎的任务,但我不知道该如何处理它。我有一个控制器,它有:

代码语言:javascript
复制
public function getObjectAction($object) {}

我要确保,只有在$object->getOwner() === $loggedInUser的情况下才能执行该操作

现在的问题是:这张支票应该是怎样的?

  1. 简单的if()条件在操作中,在访问冲突的情况下抛出一个异常。我不喜欢这个解决方案,因为它将迫使我在每个操作中添加这样的if(),这需要这样的检查。当然,我可以创建一些特性,执行此检查,并从每个这样的控制器操作调用->checkAccess(),但对我来说,它仍然很脏。
  2. 控制器参数Validator。看起来更可靠的解决方案,因为我有单独的类,它只执行它应该执行的操作(验证访问权限)。但这真的是一种验证还是误用呢?
  3. 一些重型系统,基于信号,在动作发出之前发送。
  4. 您的变体(可能,已经有一些ObjectAccessCheck类了,我还不知道)。

源表单TYPO3列表

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-16 19:58:58

解决方案1非常简单,您可以使它少一点脏。

假设您希望对控制器中的每个操作执行检查,则只需使用initializeAction

代码语言:javascript
复制
public function initializeAction() {
    if (!$this->myObjectService->isAuthenticatedUserOwnerOfObject($this->arguments['myObject'])) {
        $code = 401;
        $message = 'Authorization Required';
        $this->response->setStatus($code, $message);
        $this->response->shutdown();
    }
}

如果控制器中的操作不需要此检查,则可能需要将其拆分为两个控制器,一个用于受保护的方法,另一个用于非受保护的方法。

您还可以对每个操作使用神奇的初始化*操作,例如,在您的情况下:

代码语言:javascript
复制
public function initializeGetObjectAction()
票数 1
EN

Stack Overflow用户

发布于 2015-09-17 08:26:38

最后,我决定选择第3项。当前的应用程序逻辑是这样的,任何在参数中包含MyObject的控制器都应该执行访问检查。

我的ext_localconf.php

代码语言:javascript
复制
$signalSlotDispatcher->connect(
    \TYPO3\CMS\Extbase\Mvc\Controller\ActionController::class,
    'beforeCallActionMethod',
    \MyVendor\MyExt\Slot\MyObjectAccessor::class,
    'actionAuthorized'
);

\MyVendor\MyExt\Slot\MyObjectAccessor

代码语言:javascript
复制
class MyObjectAccessor{

    use LoggedInUserAccessor;

    /**
     * @var \TYPO3\CMS\Extbase\Object\ObjectManagerInterface
     * @inject
     */
    protected $objectManager;

    /**
     * Checks whether current user is allowed to access MyObject, from provided arguments
     * @param string $controller
     * @param string $action
     * @param array $arguments
     * @throws AccessViolationException
     */
    public function actionAuthorized($controller, $action, array $arguments) {
        foreach($arguments as $argument) {
            // if MyObject is accessed and it was persisted before
            if(($argument instanceof MyObject) && $argument->getUid()) {
                $loggedInUser = $this->getLoggedInUser();
                if($argument->getUser() !== $loggedInUser) {
                    throw new AccessViolationException(
                        'Access violation by "' . $loggedInUser->getUsername() . '" with MyObject "' . $argument->getTitle() . '"',
                        1441808407
                    );
                }
            }
        }
    }
}

此解决方案的缺点:为任何操作运行槽,这可能会占用一些资源。

Benefit:没有控制器应该知道MyObject访问规则的详细信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32436387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档