2016-09-01 4 views
0

Guten Morgen, Ich benutze CakePHP 3 zum ersten Mal, und ich frage mich, wie kann ich verhindern, dass zwei oder mehr Personen mit dem gleichen Benutzernamen zur gleichen Zeit einloggen?cakePHP 3 Wie kann man mehr als eine Anmeldung mit demselben Benutzernamen/Passwort gleichzeitig verhindern?

Ich benutze Auth-Komponente zum Anmelden und Abmelden und alles funktioniert wunderbar.

Recherchiert und verstanden, dass die Notwendigkeit, Sessions zu verwenden, haben Sie die folgenden Optionen als Kochbuch: in app.php:

'Session' => [ 
'defaults' => 'database' 
] 

und die Tabelle erstellt:

CREATE TABLE `sessions` (
`id` varchar(255) NOT NULL DEFAULT '', 
`data` BLOB, -- or BYTEA for PostgreSQL 
`expires` int(11) DEFAULT NULL, 
PRIMARY KEY (`id`) 
); 

Es speichert die Sitzung in der Datenbank. Trotzdem kann derselbe Benutzername mehrmals gleichzeitig mit dem System verbunden werden, zum Beispiel mit localhost, wenn zwei Browser mit demselben Benutzernamen angemeldet sind.

Ich schreibe die Frage, weil ich das Rad nicht neu erfinden will, und ich weiß, dass CakePHP ziemlich vollständig ist. Also frage ich mich, ob eine Komponente bereit ist, oder welche Konfiguration sollte sich ändern, damit dies funktioniert?

Vielen Dank

Antwort

0

dann erstellt die Datenbank, die ich dieses Feld:

id_logged varchar 15, 

die Login-Funktion sah wie folgt aus:

public function login() 
{ 
    if ($this->request->is('post')) { 
     $user = $this->Auth->identify(); 
     if ($user) { 
       $idsessao = uniqid(); 

       $query = $this->Users->query(); 
       $query->update() 
        ->set(['id_logged' => $idsessao]) 
        ->where(['id' => $user['id']]) 
        ->execute(); 

      $user['id_logged'] = $idsessao; 
      $this->Auth->setUser($user); 

       return $this->redirect([ 
        'controller' => 'x', 
        'action' => 'x' 
       ]); 

     } else{ 
      $this->Flash->error(__('x')); 
     } 

    } 
} 

und in jedem Controller Ich benutze diese:

public function isAuthorized($user) 
{ 
    if ($this->request->action != 'index') { 
     return true; 
    } 
    $usuario = $this->request->session()->read('Auth.User'); 
    $idbanco = (new UsersController())->id_logged_db(); 

    if ($idbanco != $usuario['id_logged']){ 

     $this->Flash->error(__('x')); 
     return $this->redirect($this->Auth->logout()); 
    } 
    return parent::isAuthorized($user); 
} 

Die id_logged_db Funktion ist dies:

public function id_logged_db(){ 

    $this->autoRender = false; 
    $usuario = $this->request->session()->read('Auth.User'); 

    $id = $this->Users->get($usuario['id'])->id_logged; 

    return $id; 
} 

Auf diese Weise testet das System jedes Mal, wenn der Benutzer auf die Indexaktionen zugreift, die ID-Speicherung zum Zeitpunkt der Anmeldung. Es funktioniert perfekt, wie ich es brauchte. Ich bin mit dem Posten der Antwort, damit Sie jemandem mit den gleichen Zweifeln helfen können.

-1

versuchen Sie dies in Ihrem Userscontroller meldet sich

public function login() 
    { 
     if ($this->request->is('post')) { 
      $user = $this->Auth->identify(); 
      if ($user) { 
       $userInfo = $this->request->session()->read('Auth.User'); 
       if(!$userInfo['is_logged']){ 

        //Update the row is_logged to true 

        $this->Auth->setUser($user); 
        return $this->redirect($this->Auth->redirectUrl()); 
       }else{ 
        $this->Flash->error(__('Your are already connected')); 
       } 
      $this->Flash->error(__('Invalid username or password, try again')); 
      } 
     } 
    } 

hinzufügen zusätzliche Zeile "is_logged" an die Benutzer-Tabelle

CREATE TABLE users (
    id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY, 
    username VARCHAR(50), 
    password VARCHAR(255), 
    role VARCHAR(20), 
    is_logged BOOL, 
    created DATETIME DEFAULT NULL, 
    modified DATETIME DEFAULT NULL 
); 

Führen Sie einen cron-Job oder Skript, das würde nach einigen Stunden die Zeile is_logged zurücksetzen Sie können die Daten aus der Tabellensitzung verwenden, um zu überprüfen, ob der Benutzer weiterhin verbunden ist

+2

Und was passiert beim Abmelden oder wenn die Sitzung abläuft? Der Wert in der Datenbank würde "wahr" bleiben, und der Benutzer konnte sich nicht mehr anmelden (da Sie den DB-Wert tatsächlich überprüfen würden). Außerdem lesen Sie die Benutzerdaten aus der Sitzung, was bedeutet, dass sie für neue Clients immer als falsch bewertet werden und somit mehrere Anmeldungen weiterhin möglich sind. – ndm

+0

Führen Sie einen Cron-Job oder ein Skript aus, das die Zeile zurücksetzt is_logged –

+0

Ich löste das Problem, indem ich eine eindeutige ID für jeden Zugriff speicherte. jede Anmeldung Ich speichere eine neue id_logged in Benutzerdaten in der Datenbank. Und ich benutze die Funktion isAuthorized und testet diese Anzahl von id_logged jede Hauptfunktion. Wenn sich zum Beispiel jemand an einem anderen Rechner mit dem gleichen Benutzernamen anmeldet, ändert sich die id_logged-Datenbank und der aktuell angemeldete Benutzer meldet sich automatisch ab. –

Verwandte Themen