我有一个琐碎的任务,但我不知道该如何处理它。我有一个控制器,它有:
public function getObjectAction($object) {}我要确保,只有在$object->getOwner() === $loggedInUser的情况下才能执行该操作
现在的问题是:这张支票应该是怎样的?
->checkAccess(),但对我来说,它仍然很脏。源表单TYPO3列表
发布于 2015-09-16 19:58:58
解决方案1非常简单,您可以使它少一点脏。
假设您希望对控制器中的每个操作执行检查,则只需使用initializeAction
public function initializeAction() {
if (!$this->myObjectService->isAuthenticatedUserOwnerOfObject($this->arguments['myObject'])) {
$code = 401;
$message = 'Authorization Required';
$this->response->setStatus($code, $message);
$this->response->shutdown();
}
}如果控制器中的操作不需要此检查,则可能需要将其拆分为两个控制器,一个用于受保护的方法,另一个用于非受保护的方法。
您还可以对每个操作使用神奇的初始化*操作,例如,在您的情况下:
public function initializeGetObjectAction()发布于 2015-09-17 08:26:38
最后,我决定选择第3项。当前的应用程序逻辑是这样的,任何在参数中包含MyObject的控制器都应该执行访问检查。
我的ext_localconf.php
$signalSlotDispatcher->connect(
\TYPO3\CMS\Extbase\Mvc\Controller\ActionController::class,
'beforeCallActionMethod',
\MyVendor\MyExt\Slot\MyObjectAccessor::class,
'actionAuthorized'
);\MyVendor\MyExt\Slot\MyObjectAccessor
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访问规则的详细信息。
https://stackoverflow.com/questions/32436387
复制相似问题