Symfony2: Passwort setzen und verschlüsseln

| 2 Kommentare

Wenn man eine Anwendung mit einer Benutzerverwaltung baut, dann kommt man irgendwann mal an den Punkt, dass Passwörter geändert werden sollen. Nur wo das neue Passwort setzen und verschlüsseln?

Symfony2 bietet eine Menge Möglichkeiten für eine lose Kopplung verschiedener Komponenten. Ich wollte die Verschlüsselung daher auch nicht in die Entity verbauen und habe einen anderen Weg gewählt, den ich euch gerne beschreiben will.

Die Art der Verschlüsselung wird in der security.yml konfiguriert und es gibt fertige Encoder, die das Passwort für uns verschlüsseln.

security:
  encoders:
    E7\UserBundle\Entity\User:
      algorithm: sha1
      encode_as_base64: false
      iterations: 1

Zunächst habe ich die User-Entity um “plainPassword” erweitert, das das unverschlüsselte Passwort bis zum Persistieren zwischenspeichern soll. Die Getter und Setter habe ich hier im Beispielcode weggelassen.

class User {
  private $plainPassword;
}

Nun müssen beide Komponenten beim Speichern noch zusammenarbeiten. Dazu müssen wir noch einen einfachen Listener schreiben und anmelden. Zunächst die einfache Listenerklasse.

class UpdatePasswortListener extends ContainerAware {
  public function __construct(Container $container) {
    $this->setContainer($container);
  }

  public function prePersist(LifecycleEventArgs $event) {
    $user = $event->getEntity();
    if(!$user instanceof User) {
      return;
    }

    if(null !== $user->getPlainPassword()) {
      $encoder = $this->container
                      ->get('security.encoder_factory)
                      ->getEncoder($user);

      $password = $encoder->encodePassword(
        $user->getPlainPassword(),
        $user->getSalt());

      $user->setPasswort($password)
           ->setPlainPassword(null);
    }
  }
}

Der Listener wird vor dem Persistieren der UserEntity aufgerufen. Dieser überprüft, ob ein neues Password gesetzt wurde, verschlüsselt es mit dem Encoder und setzt die neuen Werte. Damit alles wie gewünscht funktioniert, muss der Listener noch in der service.yml bekannt gemacht werden.

services:
  updatepassword.listener:
    class: E7\UserBundle\EventListener\UpdatePasswordListener
    arguments: [ @service_container ]
    tags:
        - { name: doctrine.event_listener, event: prePersist }

Wenn nun das plainPassword gesetzt und die Entity gespeichert wird, dann sollte das neue Passwort verschlüsselt gespeichert werden. Zur Sicherheit sollte noch der Cache gelöscht werden. Wie man das ganze dann im Formular und Controller verarbeitet kann ich gerne in einem weiteren Artikel beschreiben.

2 Kommentare

  1. Jetzt muss nur noch das gruselige SHA1-Hashen durch was Ordentliches ersetzt werden… – ich gehe leichtsinnigerweise davon aus, dass die YML genau das bewirkt.

  2. Hehe, hätte mich schon gewundert, wenn sich daran keine störte. Das ist der Beispielcode aus der Doku und kann beliebig verändert werden. Sollte allerdings wirklich jemand die Hashs aus der Datenbank lesen können, dann wäre das das kleinere Problem. ;-)

Hinterlasse eine Antwort

Pflichtfelder sind mit * markiert.


Schlagwörter: A/B-Test, AbstractType, Adapter, AddOn, Administration, Ajax, Alühn, Alühn2, Amazon, Animation, Annotations, Anonyme Klasse, Ant, Apache, API, Array, ArrayAccess, Attachment, Auftrag, Ausbildung, Auswertung, Authentifizierung, AutoLoader, AWS, Backup, Bedienung, Bedingung, Benchmark, Berechtigung, Berlin, Bildbearbeitung, Bildschirmfoto, Blog, Blogroll, BOM, Bootstrap, Bot, Browser, Bugtracker, Byte Order Mark, Bücher, Cache, CakePHP, Call-Center, Callback, CamelCase, Canvas, Captcha, CDN, Cheatsheet, CLI, Clickout, Closure, Cloud, CodeSniffer, Collection, Community, Comparator, Config, Contest, Controller, Converter, CouchDB, Countable, Cronjob, CRUD, CSS, CSV, CustomLibrary, Custom_Model, Daemon, Data Mapper, Datei, Datenbank, Datensicherung, Datenstruktur, Datentypen, Dating, Datum, Debug, Decorator, Dekorierer, Design, Design Patterns, Doctrine, Dokumentation, Dump, Duplikat, each, EC2, Eclipse, Email, Entwicklung, Entwurfsmuster, Enum, Erweiterung, Event, Eventhandling, Exception-Handling, Extension, Facebook, Factory, Fallback, Fehler, Fehlermeldung, Filter, Firefox, Flash, flexigrid, Foreach, Formatierung, Formular, Framework, FTP, Funktion, Futon, ga:pi(), Getter, Gnome, Google Analytics, Hash, Hash-Bang, Header, htaccess, HTML5, htpasswd, HTTP, HTTPS, IDE, If, Implementierung, InnoDB, Interceptor, Interface, Internet Explorer, isset, Iterator, Java, JavaScript, Job, jQuery, Kommentar, Konfiguration, Konsole, Kontrollstruktur, kopieren, kostenlos, Kundenbetreuung, Late Static Binding, Layout, Links, Linux, Listeners, Lizenz, Logging, Löschen, Magento, Magic Methods, Manual, ManyToMany, Marketing, Methode, Model, Monolog, MVC, MySQL, NetBeans, Network, Nirvanix, Objekt, Observable, Observer, OneToMany, Online Tool, OOP, Open Source, Operator, OR-Mapper, Order, ORM, O’Reilly, Parameter, Partnersuche, Passwort, Performance, PHP, php.ini, PHP hates me, phpMyAdmin, PHPUnit, Plugin, Point and Click, Popup, Praktikum, Proxy, Prüfsumme, Prüfung, QR-Code, Qualitätssicherung, Query, Queue, Redesign, Refactoring, Reflection, Repository, Request, Response, Responsive Design, Rest-API, Rockstar, Rollback, Routing, S3, Samba, Scheifen, Schleife, Schutz, Screenshot, Secure Shell, Selbstreferenz, Server, Setter, setTimeout, Shop, Sicherheit, Sicherung, Sichtbarkeit, Singleton Pattern, Skin, SOAP, Social Network, Software, Sortierung, Sourcecode, Spam, Speicherproblem, Spickzettel, SPL, Splittest, SSH, SSL, Stammtisch, Statement, static, Statistik, Status, Stellvertreter, Strategy Pattern, Stream, String, Stuttgart, Stylesheet, Subversion, Sun VirtualBox, Support, SVN, Switch, Symfony, Symfony2, Symfony Live, Tag, Template, Template Method, Ternär Operator, Testing, Theme, Thumbnail, Tool, Tour, Tracking, Twig, Twitter, Type-Cast, Ubuntu, Umwandlung, Underscore, unset, Update, Upload, Url, User Story, Validierung, Vererbung, Versionskontrolle, Versionsnummer, Verzweigung, Video, Videospiel, Virtualisierung, Visitor Pattern, Vorschaubild, walk, Warteschlange, Webserver, Webservice, Weiterleitung, Werkzeug, Windows, WindowsAzure, WordPress, Wrapper, Writer, XML, Youtube, Zeitschleife, Zeitsteuerung, Zend Framework, Zend_Application, Zend_Cloud, Zend_CodeGenerator, Zend_Http_Client, Zend_Reflection, Zend_Service, ZPress, Zugangskontrolle, Zugriffsmethode