2016-04-06 13 views
2

Ich verwende Schebs two factor bundle in einem Symfony3-Projekt und ich würde gerne den exclude_pattern Parameter anders behandeln als es tut, aber ich weiß nicht wie.scheb/two_factor_bundle: wie exclude_pattern für authentifizierte Route zu verwenden?

Normalerweise wird exclude_pattern verwendet, um eine unauthenticated Route von der Zwei-Faktor-Authentisierung, wie Debug-Seiten oder statischen Inhalt auszuschließen:

# config/config.yml 

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

sein Verhalten wie folgt umgesetzt:

/* 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; 
    } 

    ... 

} 

Ich würde gerne exclude_pattern auch für authentifizierte Routen behandeln, so dass ich Zwei-Faktor-Authentifizierung überspringen kann, wenn ich t anrufe Saum. Für authentifiziert ich meine innerhalb access_control Abschnitt unter security.yml, wie folgt aus:

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

Gerade jetzt, wenn ich eine authentifizierte Route unter exclude_pattern hinzufügen, alles, was ich bekommen, ist eine AccessDeniedException, wahrscheinlich, weil das Bündel erfordert, dass die access_decision_manager Parameter als strategy: unanimous eingestellt werden.

Der Zweck ist lang zu erzählen und Englisch ist nicht meine Muttersprache, aber wenn Sie es wirklich wissen müssen, kann ich versuchen, es zu erklären.

Ich habe die Frage mit symfony3 und symfony2 markiert, weil ich Symfony 3.0 benutze, aber ich bin mir ziemlich sicher, dass es in Symfony 2.8 identisch ist.

Antwort

1

fand ich eine Lösung, die durch die Voter-Klasse aus dem Bündel überschreiben:

// 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%' 

Auf diese Weise, wenn die GetResponseEvent ausgelöst wird, die rechte Voter aufgerufen wird, die Stimmen true wenn der exclude_pattern dem Pfad entspricht.