2016-12-11 19 views
2

この「古い」記事Is there any sort of "pre login" event or similar?によれば、UsernamePasswordFormAuthenticationListenerを拡張して、事前ログインするコードを追加することができます。ユーザーにログインする前にセキュリティチェックを行う方法(ログイン前)

symfony3にはsecurity.authentication.listener.form.classというパラメータがないようですが、symfony security_listener.xml設定ファイルを変更せずにどのように同じ結果に到達できますか?

+0

これを読んでください:http://symfony.com/doc/current/bundles/override.html#services-configuration – Federkun

答えて

2

symfonyフレームワークが提供する最もシンプルで柔軟な解決策の1つとして、ログイン前/ログイン後のチェック(ユーザー認証の前/後を意味する)を行うには、How to Create and Enable Custom User Checkersを学ぶことです。

さらに柔軟性と柔軟性が必要な場合は、How to Create a Custom Authentication System with Guardを学ぶのが最適です。 以下の簡単な実装例を見てみましょう:

のsecurity.yml

firewall_name: 
     guard: 
      authenticators: 
       - service_name_for_guard_authenticator 
      entry_point: service_name_for_guard_authenticator <-- important to add a default one (as described in the docs) if you have many custom authenticators (facebook...) 

service.xmlに

<service id="service_name_for_guard_authenticator" 
     class="AppBundle\ExampleFolderName\YourGuardAuthClassName"> 
    <argument type="service" id="router"/>   
    <argument type="service" id="security.password_encoder"/> 
</service> 

YourGuardAuthClassName.php

use Symfony\Component\Security\Guard\AbstractGuardAuthenticator; 
use use Symfony\Bundle\FrameworkBundle\Routing\Router; 
use Symfony\Component\HttpFoundation\Request; 
use Symfony\Component\HttpFoundation\Response; 
use Symfony\Component\HttpFoundation\RedirectResponse; 
use Symfony\Component\Security\Core\Exception\AuthenticationException; 
use Symfony\Component\Security\Core\Exception\BadCredentialsException; 
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; 
use Symfony\Component\Security\Core\User\UserProviderInterface; 
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoder; 

class YourGuardAuthClassName extends AbstractGuardAuthenticator 
{ 
    private $router; 
    private $passwordEncoder; 

    public function __construct(
     Router    $router, 
     UserPasswordEncoder $passwordEncoder) 
    { 
     $this->router   = $router; 
     $this->passwordEncoder = $passwordEncoder; 
    } 

    public function start(Request $request, AuthenticationException $authException = null) 
    { 
     $response = new RedirectResponse($this->router->generate('your_user_login_route_name')); 

     return $response; 
    } 

    public function getCredentials(Request $request) 
    { 
     # CHECK IF IT'S THE CHECK LOGIN ROUTE 
     if ($request->attributes->get('_route') !== 'your_user_login_route_name' 
      || !$request->isMethod('POST')) { 
      return null; 
     } 
     # GRAB ALL REQUEST PARAMETERS 
     $params = $request->request->all(); 
     # SET LOGIN CREDENTIALS 
     return array(
      'email' => $params['email'], 
      'password' => $params['password'], 
     ); 
    } 

    public function getUser($credentials, UserProviderInterface $userProvider) 
    { 
     $email = $credentials['email']; 
     $user = $userProvider->loadUserByUsername($email); 
     if (! $user){ 
      throw new UsernameNotFoundException(); 
     } 

     return $user; 
    } 

    public function checkCredentials($credentials, UserInterface $user) 
    { 
     # YOU CAN ADD YOUR CHECKS HERE! 
     if (! $this->passwordEncoder->isPasswordValid($user, $credentials['password'])) { 
      throw new BadCredentialsException(); 
     } 
     return true; 
    } 

    public function onAuthenticationFailure(Request $request, AuthenticationException $exception) 
    { 
     # OYU CAN ALSO USE THE EXCEPTIONS TO ADD A FLASH MESSAGE (YOU HAVE TO INJECT YOUR OWN FLASH MESSAGE SERVICE!) 
     if ($exception instanceof UsernameNotFoundException){ 
      $this->flashMessage->error('user.login.exception.credentials_invalid'); 
     } 
     if ($exception instanceof BadCredentialsException){ 
      $this->flashMessage->error('user.login.exception.credentials_invalid'); 
     } 

     return new RedirectResponse($this->router->generate('your_user_login_route_name')); 
    } 

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

    public function supportsRememberMe() 
    { 
     return false; 
    } 
} 
+0

ありがとうございます、しかし、私はユーザーの資格情報がチェックされる前にコントロールが必要です。 –

+0

@JackSkeletron次に、checkPreAuthメソッドでチェックを実行できます。あなたは "ガード"システムを使用しています(特定のカスタマイズが必要な場合は非常に便利です)か、デフォルトのシステムですか? –

+0

デフォルトのもの。ガードを使うべきですか? http://symfony.com/doc/current/security/guard_authentication.html –

関連する問題