2017-04-19 8 views
0

Ich versuche herauszufinden, wie ich einen Benutzer automatisch anmelden kann, indem ich auf eine E-Mail-URL klicke, an die die Benutzer-ID angehängt ist.CakePHP 3.x Mehrere Login-Methoden

Die einzige Möglichkeit zur Anmeldung besteht darin, den Benutzernamen und das Passwort im Anmeldebildschirm einzugeben.

Im Grunde muss ich nur wissen, ob es eine Möglichkeit für mich gibt, $ this-> Auth-> identify() mit der Benutzer-ID anstelle von Benutzername und Passwort zu verwenden.

Unten ist der Code, den ich den Benutzer zu identifizieren verwenden:

if($this->request->is('post')){ 
     $user = $this->Auth->identify(); 
     if($user){ 
      $this->Auth->setUser($user); 
      return $this->redirect(['controller' => 'dashboards']); 
     }else{ 
      $this->Flash->error(__('Incorrect login!')); 
      $this->redirect(['controller' => 'Users', 'action' => 'login']); 
     } 

    } 
+0

Sie möchten Benutzer mit nur Benutzer-ID validieren? –

+0

Ich möchte den Benutzer sowohl durch die herkömmliche Anmeldung (Benutzername, Passwort), als auch über den in der E-Mail angehängten Link (Benutzerkennung) validieren. –

Antwort

0

Okay, also was ich getan habe, war eine völlig neue Funktion in der Controller und hatte ein Formular in der E-Mail verwendet, so dass die Benutzer-ID über POST gesendet wird. Dadurch wird verhindert, dass andere Benutzer die URL manuell eingeben und eine Zufallszahl anhängen, um Zugriff auf andere Konten zu erhalten.

Zuerst musste ich der Funktion erlauben, fortzufahren, ohne die Authentifizierung zu durchlaufen.

public function beforeFilter(Event $event){ 
    $this->Auth->allow('emailLogin'); 
} 

public function emailLogin(){ 
    $this->autoRender = false; 
    $user_id = $_POST['user_id']; 

    if($this->Auth->user()){ 
     $this->Flash->error(__('You are already logged in!')); 
     return $this->redirect(['controller' => 'dashboards']); 
    } 

Und hier ist die Funktion, die ich verwendet:

if($user_id == null){ 
     $this->Flash->error(__('Access has been denied!')); 
     $this->redirect(['controller' => 'Users', 'action' => 'login']); 
    }else{ 
     $user = $this->Users->get($user_id); 
     if($user){ 
      $this->Auth->setUser($user->toArray()); 
      $this->Flash->success('E-mail log in successful.'); 
      $this->redirect(['controller' => 'dashboards']); 
     }else{ 
      $this->Flash->error(__('Access has been denied!')); 
      $this->redirect(['controller' => 'Users', 'action' => 'login']); 
     } 
    } 
} 
+0

Ich sehe nicht, wie Sie hier Sicherheit haben. Scheint, dass jeder Benutzer-ID am Ende einer manuell erstellten URL und als diese Person angemeldet sein kann. –

+0

Das Anfügen einer Benutzer-ID am Ende der URL lehnt den Benutzerzugriff ab, da ich die Benutzer-ID stattdessen über ein Formular gesendet habe. –

+1

Ah, das habe ich vermisst. Was verhindert jedoch, dass jemand sein eigenes Formular erstellt, das eine willkürliche Benutzer-ID übermittelt? Oder bearbeiten Sie die E-Mail, die Sie senden, um dies zu tun? –

0

Ich fand Lösung,

ersten Login-Methode ermöglicht mit out Login für den Zugriff auf

class UsersController extends AppController 
    { 
     public function initialize(){ 
       parent::initialize(); 
       $this->Auth->allow('login'); 
      } 



public function login($id = null) // here login method can accept parameter you pass with URL from email 
    { 
     if($id){ // If it is link with User Id 
      $this->loadModel('Users'); 
      $user = $this->Users->get($id); // get user data 
      if($user){ 
       $this->Auth->setUser($user); // set user 
       $this->Flash->success(__('Welcome')); 
       return $this->redirect($this->Auth->redirectUrl()); 
      }else{ 
       $this->Flash->error(__('Invalid username or password, try again')); 
      } 
     } 
     if ($this->request->is('post')) { // if use login page with username &password 
      $user = $this->Auth->identify(); // use Auth method to identify 
      if ($user) { 
       $this->Auth->setUser($user); 
       $this->Flash->success(__('Welcome')); 
       return $this->redirect($this->Auth->redirectUrl()); 
      }else{ 
       $this->Flash->error(__('Invalid username or password, try again')); 
      } 
     } 
    } 

    } 

Diese Arbeit wird für Sie

+0

Leider hat das bei mir nicht funktioniert. Als ich dem Link folge, erwarte ich automatisch, dass er mich automatisch anmeldet und mich nach einem Benutzernamen und Passwort fragt. –

+0

hast du $ this-> Auth-> allow ('login') gesetzt; initialisieren()? –

+0

tat ich. Ich habe auch versucht, $ this-> Auth-> allow ('login') vor filter() einzufügen, aber immer noch nichts. –

Verwandte Themen