scheb/two_factor_bundle:如何使用exclude_pattern进行认证路由?
scheb/two_factor_bundle: how to use exclude_pattern for authenticated route?
我在 Symfony3 项目中使用 Scheb 的 two factor bundle,我想以不同于它的方式处理 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
,这样我就可以在调用它们时跳过双因素身份验证。对于 authenticated 我的意思是在 security.yml
下的 access_control
部分中,像这样:
# 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 中是相同的。
我通过覆盖捆绑包中的选民 class 找到了解决方案:
// 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 时,都会调用右 Voter,如果 exclude_pattern
匹配路径。
我在 Symfony3 项目中使用 Scheb 的 two factor bundle,我想以不同于它的方式处理 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
,这样我就可以在调用它们时跳过双因素身份验证。对于 authenticated 我的意思是在 security.yml
下的 access_control
部分中,像这样:
# 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 中是相同的。
我通过覆盖捆绑包中的选民 class 找到了解决方案:
// 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 时,都会调用右 Voter,如果 exclude_pattern
匹配路径。