2017-10-12 95 views
5

Chcę się zalogować, korzystając z wielu sprawdzeń pól.CakePHP 3 - Wiele pól Auth logowanie

Obecna sytuacja: Używanie (Email) i (Password) pola do logowania

<div> 
    <input placeholder="Email"> 
    <input placeholder="Password"> 
    <input type="submit" value="Login"> 
</div> 

Oto moje konfiguracje AuthComponent:

$this->loadComponent('Auth', [ 
    #Some other configuration 
    'authenticate' => [ 
     'Form' => [ 
      'fields' => ['username' => 'email'] 
     ] 
    ], 
    'storage' => 'Session' 
]); 

moje oczekiwania: z użyciem (Email Lub Phone) Oraz (Password) pola do logowania

<div> 
    <input placeholder="Email or Phone"> 
    <input placeholder="Password"> 
    <input type="submit" value="Login"> 
</div> 

Jak mogę skonfigurować AuthComponent aby sprostać tej sytuacji?

+1

Twoje wejścia nie mają nawet 'name' atrybuty, czyli przeglądarka nie przedstawił żadnych danych.Powinieneś zacząć od używania pomocnika formularzy do tworzenia formularzy. – ndm

+0

Tak! Wiem. Dziękuję Ci. To tylko dla przykładu. Użyłem "Form Helper", ale wiele pól nie działa dla mnie. :(@ndm –

+0

Rozumiem, że powinieneś zaktualizować przykłady swoim rzeczywistym kodem, ponieważ to tylko myli ludzi i odciągnie ich od rzeczywistego problemu – ndm

Odpowiedz

2

Jeśli chcesz uwierzytelniania oparty na zasadzie „albo albo” zasadach, to trzeba użyć niestandardowego Finder, jak wbudowany znalazcę uwierzytelnienie jest zaprojektowane tak, aby pasowało tylko do pojedynczej kolumny.

W formularzu określić wejście:

<?= $this->Form->input('email_or_phone'); ?> 

W konfiguracji auth skonfigurować pola i Finder:

$this->loadComponent('Auth', [ 
    'authenticate' => [ 
     'Form' => [ 
      'fields' => [ 
       'username' => 'email_or_phone' 
      ], 
      'finder' => 'auth' 
     ] 
    ] 
]); 

w twojej (prawdopodobnie UsersTable) Klasa tabeli określają Finder, gdzie może użyć opcji username do zbudowania wymaganych warunków:

public function findAuth(\Cake\ORM\Query $query, array $options) 
{ 
    return $query->where(
     [ 
      'OR' => [ 
       $this->aliasField('email') => $options['username'], 
       $this->aliasField('phone') => $options['username'], 
      ] 
     ], 
     [], 
     true 
    ); 
} 

Należy pamiętać, że wartość, którą osoba uwierzytelniająca pobiera z żądania za pośrednictwem skonfigurowanego pola email_or_phone, będzie zawsze przekazywana do Findera w opcjiza pomocą opcji username!

Należy również pamiętać, że należy albo usunąć możliwe istniejące warunki wygenerowane przez wystawcę uwierzytelnienia, albo zastąpić je, jak pokazano w tym przykładzie, używając trzeciego argumentu z Query::where().

Zobacz także

+0

Dziękuję bardzo za odpowiedź. <3 <3 –

2

Spróbuj wykonać następujące czynności:

$this->loadComponent('Auth', [ 
    #Some other configuration 
    'authenticate' => [ 
     'Form' => [ 
      'fields' => ['username' => ['email','phone']] 
     ] 
    ], 
    'storage' => 'Session' 
]); 

Wystarczy przekazać wartości jako tablicę do username.

I w funkcji logowania zrobić coś takiego:

$username = $this->data['User']['username']; 
$user = $this->User->findByEmail($username); 
if (empty($user)) 
{ 
    $user = $this->User->findByPhone($username); 
} 
+0

Dziękuję za twoją odpowiedź.Mogę też zrobić to za pomocą Magicznej Metody jak ' $ this -> {MODEL} -> findByEmailOrPhone ("{E-MAIL}", "{PHONE}") Ale tak naprawdę nie chcę tego robić w ten sposób. Chcę, aby to zadanie było obsługiwane z 'AuthComponent'. –

+0

@ SumonSarker OK, jak już powiedziałem, możesz przekazywać wartości jako tablicę na authComponent, możesz uzyskać do niego dostęp w dowolnym momencie w funkcji logowania – mega6382

+0

Dziękuję :) (y) –