scheb / two_factor_bundle: как использовать exclude_pattern для аутентифицированного маршрута?

Я пользуюсь шебами двухфакторный пакет в проекте Symfony3, и я хотел бы справиться с exclude_pattern Параметр отличается от этого, но я не знаю как.

Обычно, exclude_pattern используется для исключения неаутентифицированное маршрут от двухфакторной аутентификации, такой как страницы отладки или статический контент:

# config/config.yml

scheb_two_factor:
...
exclude_pattern: ^/(_(profiler|wdt)|css|images|js)/

его поведение реализуется так:

/* vendor/scheb/two-factor-bundle/Security/TwoFactor/EventListener/RequestListener.php */

public function onCoreRequest(GetResponseEvent $event)
{
$request = $event->getRequest();

// Exclude path
if ($this->excludePattern !== null && preg_match('#'.$this->excludePattern.'#', $request->getPathInfo())) {
return;
}

...

}

Я хотел бы справиться exclude_pattern также для подлинности маршруты, чтобы я мог пропустить двухфакторную аутентификацию при вызове их. За подлинности Я имею в виду в access_control раздел под security.yml, как это:

# app/config/security.yml
security:
...
access_control:
- { path: ^/test, role: ROLE_USER }

Прямо сейчас, если я добавлю аутентифицированный маршрут в exclude_pattern, я получу только AccessDeniedException, вероятно, потому что пакет требует, чтобы access_decision_manager параметр, который будет установлен как strategy: unanimous,

Цель состоит в том, чтобы долго говорить, и английский не мой родной язык, но если вам действительно нужно это знать, я могу попытаться объяснить.

Я пометил вопрос как с symfony3, так и с symfony2, потому что я использую Symfony 3.0, но я уверен, что он идентичен в Symfony 2.8.

2

Решение

Я нашел решение, переопределив класс Voter из пакета:

// AppBundle/Security/TwoFactor/Voter.php

namespace AppBundle\Security\TwoFactor;
use Scheb\TwoFactorBundle\Security\TwoFactor\Session\SessionFlagManager;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;

class Voter extends \Scheb\TwoFactorBundle\Security\TwoFactor\Voter
{/**
* @var string
*/
protected $excludePattern;

/**
* Voter constructor.
* @param SessionFlagManager $sessionFlagManager
* @param array $providers
* @param $excludePattern
*/
public function __construct(SessionFlagManager $sessionFlagManager, array $providers, $excludePattern)
{

parent::__construct($sessionFlagManager, $providers);
$this->excludePattern = $excludePattern;
}

/**
* @param TokenInterface $token
* @param mixed          $object
* @param array          $attributes
*
* @return mixed result
*/
public function vote(TokenInterface $token, $object, array $attributes)
{

if ($this->excludePattern !== null && preg_match('#'.$this->excludePattern.'#', $object->getPathInfo()))
{
return true;
}

parent::vote($token, $object, $attributes);
}

}

# app/config/services.yml

services:
...
scheb_two_factor.security_voter:
class: 'AppBundle\Security\TwoFactor\Voter'
arguments:
- '@scheb_two_factor.session_flag_manager'
- ~
- '%scheb_two_factor.exclude_pattern%'

Таким образом, всякий раз, когда GetResponseEvent срабатывает, право избиратель вызывается, какие голоса true если exclude_pattern соответствует пути.

1

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

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

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