Symfony Workflow Компонент и Безопасность избирателей?

TL; DR: как вы можете добавить пользовательские ограничения (то есть, избиратели безопасности) к переходам?

Моему приложению нужна система управления рабочим процессом, поэтому я бы хотел попробовать новую версию Symfony. Компонент рабочего процесса. Давайте возьмем Запрос на тягу рабочий процесс в качестве примера.

В этом примере описаны только состояния и их переходы. Но что, если я хочу добавить другие ограничения в этот рабочий процесс? Я могу изобразить некоторые ограничения:

  • Только администраторы могут принять запрос на извлечение
  • Пользователи могут только повторно открыть свой собственный запрос на извлечение
  • Пользователи не могут повторно открыть PR старше 1 года

Пока вы можете использовать События в этом случае, я не думаю, что это лучший способ справиться с этим, потому что событие запускается после $workflow->apply(), Я хочу знать заранее, разрешено ли пользователю изменять состояние, чтобы я мог скрыть или отключить кнопку. (не как это).

LexikWorkflowBundle частично решил эту проблему, добавив роли к шагам (переходам). Переключение на этот пакет может быть хорошей идеей, но я хотел бы выяснить, как я могу решить эту проблему без.

Каков наилучший способ добавить пользовательские ограничения сущности (‘PR старше 1 года не может быть вновь открыт‘) и ограничения безопасности (‘только админы могут принимать пиар‘, может быть, с помощью Symfony’s Security Voters) для переходов?

Обновить:
Для пояснения: я хочу добавить контроль разрешений в свой рабочий процесс, но это не обязательно означает, что я хочу тесно связать его с компонентом рабочего процесса. Я хотел бы придерживаться передового опыта, поэтому данное решение должно соответствовать принципу единой ответственности.

0

Решение

Лучший способ, который я нашел, это реализовать AuthorizationChecker в рабочем процессе GuardListener.

демонстрационное приложение дает хороший пример:

namespace Acme\DemoBundle\Entity\Listener;

use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\Security\Core\Authorization\AuthorizationChecker;
use Symfony\Component\Workflow\Event\GuardEvent;

class GuardListener implements EventSubscriberInterface
{
public function __construct(AuthorizationCheckerInterface $checker)
{
$this->checker = $checker;
}
public function onTransition(GuardEvent $event)
{
// For all action, user should be logger
if (!$this->checker->isGranted('IS_AUTHENTICATED_FULLY')) {
$event->setBlocked(true);
}
}
public function onTransitionJournalist(GuardEvent $event)
{
if (!$this->checker->isGranted('ROLE_JOURNALIST')) {
$event->setBlocked(true);
}
}
public function onTransitionSpellChecker(GuardEvent $event)
{
if (!$this->checker->isGranted('ROLE_SPELLCHECKER')) {
$event->setBlocked(true);
}
}
public static function getSubscribedEvents()
{
return [
'workflow.article.guard' => 'onTransition',
'workflow.article.guard.journalist_approval' => 'onTransitionJournalist',
'workflow.article.guard.spellchecker_approval' => 'onTransitionSpellChecker',
];
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]