Programmieren > Sprachen > PHP > Zend 2

Benutzermanagement im Zend2-Framework

Das Benutzermanagement im Zend2-Framework lässt sich in 2 Teile unterteilen

Ich werde hier in diesem Beispiel eine Authentifizierung über die Datenbank realisieren. Deswegen verwende ich als Grundlage die Zend-Skeleton-Applikation mit bereits implementierten Datenbankzugriff wie auf der Seite Datenbank-Anbindung mit dem Zend-Framework beschrieben.

Authentifizierung

Um die Authentifizierung testen zu können, habe ich der Datei module/Application/view/application/index/index.php folgendes ans Ende angefügt.

<h2>Login-Formular</h2>

<p><b><?php echo $this->loginMessage ?></b></p>
<p>Eingeloggt: <?php echo $this->loggedInUser ?></p>
<form action="/" method="post">
  <p>Benutzername:<br><input name="username" type="text"></p>
  <p>Passwort:<br><input name="password" type="password"></p>
  <p>
    <input type="submit" value="Login">
    <input type="submit" value="Logout" name="logout">
  </p>
</form>

Ein einfaches HTML-Formular um Benutzernamen und Passwort abzuschicken, ein Login- und ein Logout-Knopf, sowie die Möglichkeit Rückgaben des Authentifizierungsprozess und den Namen des eingeloggten Benutzers auszugeben.

AuthenticationService

Für das Ein- und Ausloggen stellt das Zend-Framework den AuthenticationService zur Verfügung. Dieser Service bietet.

Da der AuthenticationService verschiedene externe Dienste aufrufen kann, muss er beim Aufruf einen Adapter übergeben bekommen, der ihm sagt, wie der externe Dienst erreichbar ist. In diesem Beispiel nehmen wir an, dass Benutzername und Passwort in einer Datenbanktabelle zu finden sind. Um den AuthenticationService zu konfigurieren baue ich eine Factory, die ich dem Service-Manager übergebe. In der Datei module/Application/config/module.config.php schreibe ich folgende Ergänzungen.

...
use Zend\Authentication\Adapter\DbTable;
use Zend\Authentication\AuthenticationService;
...
   'service_manager' => array(
                                ...
            'AuthenticationService' => function($sm) {
               $authAdapter = new DbTable($sm->get('Zend\Db\Adapter\Adapter'));
               $authAdapter->setTableName('user');
               $authAdapter->setIdentityColumn('username');
               $authAdapter->setCredentialColumn('password');
               
               $authService = new AuthenticationService();
               $authService->setAdapter($authAdapter);
               return $authService;
            },
                                .....
      ),
   ),
   'controllers' => array(
       'factories' => array(
            'Application\Controller\Index' => function ($serviceLocator) {
               $ctr = new IndexController();
               $ctr->setUserTable($serviceLocator->getServiceLocator()->get('Application\Model\UserTable'));
               $ctr->setAuthenticationService($serviceLocator->getServiceLocator()->get('AuthenticationService'));
               return $ctr;
            }
       )
    ),

Zuerst wird der Authentication-Adapter konfiguriert. Dieser muss einen Datenbankadapter bekommen, damit er den Zugang zur Datenbank hat. Danach muss er noch Wissen, in welcher Datenbank-Tabelle und in welchen Spalten er nach Benutzername und Passwort suchen muss. So konfiguriert kann der Adapter dem AuthenticationService übergeben werden. Der Quellcode zeigt auch, wie im Abschnitt controllers dieser AuthenticationService dem IndexController übergeben wird. Der IndexController in der Datei module/Application/scr/Application/Controller/IndexController.php sieht folgendermaßen aus.

<?php

namespace Application\Controller;

use Zend\Mvc\Controller\AbstractActionController;

class IndexController extends AbstractActionController
{
   private $userTable;
   private $authenticationService;
   
   public function setUserTable($userTable) {
      $this->userTable = $userTable;
   }
   public function setAuthenticationService($authenticationService) {
      $this->authenticationService = $authenticationService;
   }
   public function indexAction() {
      $loginMessage = '';
      $loggedInUser = 'no one logged in';
      $username = $this->getRequest()->getPost('username');
      $password = $this->getRequest()->getPost('password');

      if($username && $password) {
         $authAdapter = $this->authenticationService->getAdapter();
         $authAdapter->setCredential($password);
         $authAdapter->setIdentity($username);
                  
         $result = $this->authenticationService->authenticate();
         if($result->isValid()) {
            $loginMessage = "Login successful";
         } else {
            $loginMessage = "Login failed";
         }
      } else {
         $loginMessage = 'Benutzername und/oder Passwort nicht angegeben';
      }

      // Wenn Logout-Button gedrückt wurde -> Ausloggen
      if($this->getRequest()->getPost('logout') == 'Logout') {
         $this->authenticationService->clearIdentity();
      }
      
      // Wenn jemand eingeloggt -> Identität auslesen
      if($this->authenticationService->hasIdentity()) {
         $loggedInUser = $this->authenticationService->getIdentity();
      }
      
      return array(
            'title' => 'Zend2 Skeleton Application',
            'message' => 'This is a very minimalistic Zend2 Application',
            'userTable' => $this->userTable->getContent(),
            'loginMessage' => $loginMessage,
            'loggedInUser' => $loggedInUser
      );
   }
}

Einloggen

Überprüfen des Status

Ausloggen

Authorisierung