2017-11-07 14 views
0

私がやっていることは、ddbbによって設定されたGuard認証システムに内部ユーザ用のLDAPを含めることです。 私はすでにGuardの認証システムを構築しており、https://knpuniversity.com/screencast/symfony-securityに感謝しています。Symfony 3のGuard認証システムを使用したLDAP

しかし、LDAPモードで以前にログインしようとする必要があります。より正確には、この機能は以下の様にする必要があります

ユーザーは、MySQLからデータベースとで構成されたガードシステム認証でログインしよう:MySQLのテーブルからユーザーにユーザーが存在する場合

の1-チェック。存在する場合は、手順2に進みます。存在しない場合は、エラーメッセージで認証にfalseを返します。

2 - ユーザーがLDAPモードで存在するかどうかを確認します。存在する場合は手順3に進みます。存在しない場合は手順4に進みます。

3 - ユーザー名とパスワードでLDAPを使用してログインします。認証がOKの場合はログインしています.LDAPを介してパスワードを照合できない場合は、エラーメッセージで認証にfalseを返します。

4 - LDAPオプションを確認した後、Guard Authentication Systemを使用してログインしようとします。認証が成功したら、ユーザはログインしています.Guard経由でMySQLユーザテーブルにパスワードを照合できない場合は、エラーメッセージで認証にfalseを返します。

答えて

0

LoginFormAuthenticatorファイルで、私は最終的に次のコードを示すようにこの動作を管理することができました。

<?php 

namespace AppBundle\Security; 

use ... 
use Zend\Ldap\Ldap; 
use Zend\Ldap\Exception\LdapException; 

class LoginFormAuthenticator extends AbstractFormLoginAuthenticator 
{ 
    use TargetPathTrait; 

    private $em; 
    private $router; 
    private $passwordEncoder; 
    private $csrfTokenManager; 

    public function __construct(... 
    } 

    public function getCredentials(Request $request) 
    { 
    ... 
    } 

    public function getUser($credentials, UserProviderInterface $userProvider) 
    { 
     $username = $credentials['username']; 
     $ldapPassword = $credentials['password']; 
     $ldaphost = 'ldap.example.com'; // your ldap servers 
     $baseDn = 'dc=example,dc=es'; 

     $options = [ 
      'host'    => $ldaphost, 
      'username'   => $username, 
      'password'   => $ldapPassword, 
      'bindRequiresDn' => false, 
      'accountDomainName' => 'example.es', 
      'baseDn'   => $baseDn, 
     ]; 


     $userInterface = $this->em->getRepository('AppBundle:User') 
      ->findOneBy(['email' => $username]); 
     $ldap = new Ldap($options); 

     try { 
      $ldap->bind(); 
      $userInterface->setIsAuthenticationLDAP(true); 
     } catch (LdapException $zle){ 
      $userInterface->setIsAuthenticationLDAP(false); 
     } 

     return $userInterface; 
    } 

    public function checkCredentials($credentials, UserInterface $user) 
    { 
     $password = $credentials['password']; 

     if($user->isAuthenticationLDAP()){ 
      $user->setLoginAttempts(0); 
      $this->em->persist($user); 
      $this->em->flush(); 
      return true; 
     } else { 
      if($this->passwordEncoder->isPasswordValid($user, $password)) { 
       $user->setLoginAttempts(0); 
       $this->em->persist($user); 
       $this->em->flush(); 
       return true; 
      } else { 
       if($user->getLoginAttempts() == '0') $user->setFirstLoginAttempt(new \DateTime('now')); 
       $user->setLoginAttempts($user->getLoginAttempts() + 1); 
       if($user->getLoginAttempts() >= 5) { 
        $user->setLockedDateTime(new \DateTime('now')); 
        $user->setLoginAttempts(0); 
       } 
       $this->em->persist($user); 
       $this->em->flush(); 
      } 
     } 

     return false; 
    } 

    public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey) 
    { 
     .... 
    } 

    protected function getLoginUrl() 
    { 
     return $this->router->generate('fos_user_security_login'); 
    } 
} 

この回答をお寄せいただければ幸いです。

関連する問題