2017-10-24 15 views
0

オーセンティケータを追加しようとしましたが、これはpath/Abcへのアクセスのみに責任があります。Symfony 3 - パターンは、ガードオーセンティケータでログインの問題を引き起こします。

パターンラインpattern: ^/Abcを私のsecurity.ymlに追加する限り、すべて正常に動作します。私はログインしてログアウトすることができます。ユーザーは トークンクラスPostAuthenticationGuardTokenとファイアウォールabcで認証されます。

私が行を追加すると、pattern: ^/Abc私はもう/ Abcエリアにログインできなくなります。私は私のログインフォームアプリケーションは、パスにリロード提出後login_abc

のsecurity.yml

security: 
    firewalls: 
     # disables authentication for assets and the profiler, adapt it according to your needs 
     dev: 
      pattern: ^/(_(profiler|wdt)|css|images|js)/ 
      security: false 

     abc: 
      anonymous: ~ 
      pattern: ^/Abc 
      guard: 
       authenticators: 
        - abc_authenticator 
      form_login: 
       login_path:  login_abc 
       check_path:  login_abc 
       remember_me: false 

      logout: 
       path: logout_abc 
       target: main_index 

     default: 
      anonymous: ~ 
      pattern: ^/(?!Abc) 
      form_login: 
       always_use_default_target_path: false 
       login_path:  login 
       check_path:  login 
       remember_me: false 

       logout: 
        path: logout 
        target: main_index 




    access_control: 
      - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
      - { path: ^/login_abc, roles: IS_AUTHENTICATED_ANONYMOUSLY } 
      - { path: ^/Abc, roles: [ROLE_ABC] } 
      - { path: ^/Work, roles: [ROLE_WORK, ROLE_WORK2] } 
      - { path: ^/Home, roles: [ROLE_HOME] } 

abcAuthenticator.php

namespace AppBundle\Security; 

use AppBundle\Entity\User; 
use Symfony\Component\HttpFoundation\RedirectResponse; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\Response; 
use Symfony\Component\Routing\RouterInterface; 
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; 
use Symfony\Component\Security\Core\Exception\AuthenticationException; 
use Symfony\Component\Security\Core\Exception\CustomUserMessageAuthenticationException; 
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException; 
use Symfony\Component\Security\Core\User\UserInterface; 
use Symfony\Component\Security\Core\User\UserProviderInterface; 
use Symfony\Component\Security\Guard\AbstractGuardAuthenticator; 
use Doctrine\Bundle\DoctrineBundle\Registry as Doctrine; 


class abcAuthenticator extends AbstractGuardAuthenticator { 

    const ACCESS_DENNIED = "Access dennied"; 

    /** 
    * @var \Symfony\Component\Routing\RouterInterface 
    */ 
    private $router; 

    /** 
    * @var Doctrine 
    */ 
    private $doctrine; 


    /** 
    * abcAuthenticator constructor. 
    */ 
    public function __construct(RouterInterface $router, Doctrine $doctrine) { 
     $this->router = $router; 
     $this->doctrine = $doctrine; 
    } 

    public function start(Request $request, AuthenticationException $authException = null) { 
     $url = $this->router->generate('login_abc'); 
     return new RedirectResponse($url); 
    } 

    public function getCredentials(Request $request) { 
     if ($request->getPathInfo() != '/login_abc' || !$request->isMethod('POST')) { 
      return; 
     } 

     return array(
      'cardToken' => $request->request->get('_cardToken'), 
     ); 

    } 

    public function getUser($credentials, UserProviderInterface $userProvider) { 
     try { 
      try { 
       $user = $this->doctrine->getRepository(User::class)->findOneByCardToken($credentials['cardToken']); 
       if (is_null($user)) { 
        throw new UsernameNotFoundException(); 
       } 
       return $userProvider->loadUserByUsername($user->getUsername()); 
      } catch (UsernameNotFoundException $e) { 
       throw new CustomUserMessageAuthenticationException(self::ACCESS_DENNIED); 
      } 

     } 
     catch (UsernameNotFoundException $e) { 
      throw new CustomUserMessageAuthenticationException(self::ACCESS_DENNIED); 
     } 
    } 

    public function checkCredentials($credentials, UserInterface $user) { 
     return true; 
    } 

    public function onAuthenticationFailure(Request $request, AuthenticationException $exception) { 
     $url = $this->router->generate('login_abc'); 
     return new RedirectResponse($url); 
    } 

    public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey) { 
     $url = $this->router->generate('abc_panel'); 
     return new RedirectResponse($url); 
    } 

    public function supportsRememberMe() { 
     return false; 
    } 

} 

認証はもちろん、サービスとして登録されています。

私は何が間違っているのか分かりません。 Plsヘルプ。あなたのgetCredentials()方法で

+0

解決策が見つかりました。 abcのパターンはpattern:^ /(Abc | login_abc)でなければなりません。デフォルトではパターンは存在しません。 – sowi

答えて

0

、あなたはURL /login_abc(URLではなく、ルート名)に行く場合にのみログインを許可するように見える - しかし、唯一のガードはURL /Abc上で実行されることを可能にします。

複数のファイアウォールを使用することは複雑です.1つのファイアウォールを持つことが容易になり、複数の認証を実行できるようになります(URL、ユーザー名、パスワード/トークンなど)残りはスキップされます。

+0

ありがとうございます@あなたの助けのためのアリスター。問題は、私のsecurity.yml関数にパターンを追加すると、getCredentials()にも到達していないということです – sowi

関連する問題