(in Arbeit: Dokumente für 2.0)
Bibliothek zur Handhabung der Benutzeridentifikation.
Der Zweck dieser Bibliothek besteht darin, das Benutzerkonto (genauer gesagt seine eindeutige ID) für einen bestimmten Identitätsnachweis zu finden und verschiedene Arten von Identitäten zu verwalten. Es besteht aus 4 verschiedenen Diensten: Identifizierung, Registrierung, Suche und Wiederherstellung.
Sie können die Bibliothek mit Composer mit dem folgenden Befehl zu Ihrem Projekt hinzufügen:
composer require teresko/ palladium
Um dieses Paket verwenden zu können, sind PHP Version 7.0+ und PDO erforderlich.
Sie müssen außerdem eine Tabelle erstellen, in der die Identitäten gespeichert werden. Das Beispielschema finden Sie hier. Sie enthält derzeit nur Tabellendefinitionen für MySQL/MariaDB, aber die Bibliothek kann mit jedem RDBMS verwendet werden, das über einen PDO-Treiber verfügt.
palladium umfasst 4 Dienste: Registration
, Identification
, Search
und Recovery
. Jeder dieser Dienste hat zwei obligatorische Abhängigkeiten:
palladium ContractCanPersistIdenity
implementiert)PsrLogLoggerInterface
implementiert)Dies gibt Ihnen die Möglichkeit, das Standard-Repository zu ersetzen, wenn Sie Teile der Persistenzabstraktionsschicht ändern oder ersetzen möchten. Was den Logger betrifft, wird die Verwendung von Monolog empfohlen, aber es würde mit jedem kompatiblen Protokollierungssystem funktionieren.
Das Standard-Repository verfügt außerdem über Funktionen zum Hinzufügen benutzerdefinierter Identitätstypen und Datenzuordnungen, die entweder für Ihre oder die integrierten Identitätstypen verwendet werden. Einzelheiten zur Verwendung finden Sie im Abschnitt %TODO%.
Im Konstruktor des Identification
gibt es einen optionalen dritten und vierten Parameter:
Im Konstruktor des Registration
gibt es einen optionalen dritten Parameter:
Wie oben erwähnt, erwarten alle vier Dienste ein Repository als Konstruktorabhängigkeit. Wenn Sie das gebündelte Repository nicht durch Ihre benutzerdefinierte Version ersetzen, müssen Sie palladium RepositoryIdentity
initialisieren und an die Dienste übergeben.
Das gebündelte Repository selbst verfügt über eine einzige Abhängigkeit: Instanz, die palladium ContractCanCreateMapper
implementiert. Dieser Vertrag (Schnittstelle) wird durch palladium ComponentMapperFactory
implementiert. Und diese Fabrik hat zwei Abhängigkeiten: PDO
-Instanz und den Namen der Tabelle, in der die Identitäten gespeichert werden.
<?php
$ factory = new palladium Component MapperFactory ( new PDO (... $ config ), $ tableName );
$ repository = new palladium Repository Identity ( $ factory );
In jedem anderen Codebeispiel, in dem die Variable $repository
verwendet wird, können Sie davon ausgehen, dass sie mit diesem Codebeispiel initialisiert wurde.
Für Benutzer der DependencyInjection-Komponente von Symfony (Version: 3.4+) gibt es eine Beispielkonfigurationsdatei: %TODO%
<?php
$ registration = new palladium Service Registration ( $ repository , $ logger );
$ identity = $ registration -> createStandardIdentity ( ' [email protected] ' , ' password ' );
$ registration -> bindAccountToIdentity ( $ accountId , $ identity );
Wenn der Vorgang erfolgreich abgeschlossen wurde, enthält die Variable $identity
eine Instanz der nicht verifizierten StandardIdentity
. Um die Verifizierung abzuschließen, müssen Sie den Token verwenden, der in der Identität enthalten ist. Im gegebenen Beispiel kann dieses Token mit $instance->getToken()
ausgewertet werden.
Die Methode createStandardIdentity()
kann IdentityConflict
-Ausnahme auslösen, wenn die E-Mail bereits für eine andere Identität verwendet wurde.
Die Methode createStandardIdentity()
verfügt über einen optionalen dritten Parameter, der die Lebensdauer des E-Mail-Verifizierungstokens in Sekunden definiert. Bei der Anwendung sieht das vorherige Beispiel wie folgt aus:
<?php
$ registration = new palladium Service Registration ( $ repository , $ logger );
$ identity = $ registration -> createStandardIdentity ( ' [email protected] ' , ' password ' , 3600 );
$ registration -> bindAccountToIdentity ( $ accountId , $ identity );
Dadurch wird das Verifizierungstoken nach der Registrierung der Identität dieses Benutzers eine Stunde lang verwendbar. Nach Ablauf dieser bestimmten Zeit können Sie diese Identität nicht mehr mit findStandardIdentityByToken()
im Search
finden.
WICHTIG : Die
createStandardIdentity()
Methode validiert weder die E-Mail-Adresse des Benutzers noch andere Arten von Identifikatoren. Es prüft lediglich seine Einzigartigkeit. Die Validierung von E-Mails, Telefonnummern, Spitznamen und anderen Identifikatoren geht über den Rahmen dieser Bibliothek hinaus.
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ registration = new palladium Service Registration ( $ repository , $ logger );
$ identity = $ search -> findStandardIdentityByToken ( $ token , palladium Entity Identity:: ACTION_VERIFY );
$ registration -> verifyStandardIdentity ( $ identity );
Der $token
Wert wird verwendet, um die passende EmailIdentity
zu finden, die dann überprüft wird. Wenn die Identität nicht gefunden wird, löst findStandardIdentityByToken()
die Ausnahme IdentityNotFound
aus.
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ identification = new palladium Service Identification ( $ repository , $ logger );
$ identity = $ search -> findStandardIdentityByIdentifier ( $ identifier );
$ cookie = $ identification -> loginWithPassword ( $ identity , $ password );
Wenn keine passende Identität mit der angegebenen Kennung (z. B. E-Mail-Adresse) gefunden wird, löst die Methode findStandardIdentityByIdentifier()
IdentityNotFound
Ausnahme aus.
Falls das Passwort nicht übereinstimmt, löst die Methode loginWithPassword()
PasswordMismatch
Ausnahme aus.
<?php
$ identity = $ this -> registration -> createNonceIdentity ( $ accountId );
Dadurch wird eine neue Instanz von NonceIdentity
erstellt. Um es für die Anmeldung zu verwenden, benötigen Sie Werte in NonceIdentity::getIdentifier()
und NonceIdentity::getKey()
, wobei der Bezeichner zum Auffinden der Nonce-Identität und der Schlüssel zur Überprüfung verwendet werden.
Die Methode createNonceIdentity()
war ein optionaler zweiter Parameter, der die Lebensdauer dieser Einmalidentität in Sekunden definiert. Bei der Anwendung sieht das vorherige Beispiel wie folgt aus:
<?php
$ identity = $ this -> registration -> createNonceIdentity ( $ accountId , 600 );
Dadurch wird die Einmalidentität nach ihrer Erstellung 10 Minuten lang nutzbar. Nach Ablauf der zulässigen Zeit führt die Übergabe dieser Identität in der Methode useNonceIdentity()
der Identification
dazu, dass die Ausnahme IdentityExpired
ausgelöst wird.
<?php
$ identity = $ this -> search -> findNonceIdentityByIdentifier ( $ identifier );
$ cookie = $ this -> identification -> useNonceIdentity ( $ identity , $ key );
Wenn keine passende Identität mit der angegebenen Kennung (E-Mail-Adresse, Spitzname usw.) gefunden wird, löst die Methode findNonceIdentityByIdentifier()
IdentityNotFound
Ausnahme aus.
Falls das Passwort nicht übereinstimmt, löst die Methode useNonceIdentity()
KeyMismatch
Ausnahme aus.
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ identification = new palladium Service Identification ( $ repository , $ logger );
$ identity = $ search -> findCookieIdentity ( $ accountId , $ series );
$ cookie = $ identification -> loginWithCookie ( $ identity , $ key );
Wenn mit findCookieIdentity()
kein Cookie gefunden wird, wird eine standardmäßige IdentityNotFound
Ausnahme ausgelöst. Die mögliche Ursache dafür wäre entweder, dass das Cookie nicht mehr aktiv ist (z. B. wenn der Benutzer abgemeldet ist) oder dass das Cookie überhaupt nicht vorhanden ist.
Falls das Cookie zu alt ist, erzeugt loginWithCookie()
IdentityExpired
Ausnahme.
Die Methode loginWithCookie()
kann aber auch CompromisedCookie
-Ausnahme erzeugen. Wenn hierfür eine Ausnahme angezeigt wird, könnte dies ein Hinweis darauf sein, dass das Cookie gestohlen wurde oder dass der Benutzer nie einen neuen Cookie-Wert erhalten hat.
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ identification = new palladium Service Identification ( $ repository , $ logger );
$ identity = $ search -> findCookieIdentity ( $ accountId , $ series );
$ identification -> blockIdentity ( $ identity );
Dies ist die empfohlene Methode für den Umgang mit verdächtigen Cookies, die möglicherweise gestohlen wurden oder nicht. Dies ist nicht für die Abmeldung von Benutzern gedacht .
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ identification = new palladium Service Identification ( $ repository , $ logger );
$ identity = $ search -> findCookieIdentity ( $ accountId , $ series );
$ identification -> logout ( $ identity , $ key );
Dieser Vorgang markiert das Cookie als „verworfen“. Die Liste der Ausnahmen, die erstellt werden können, entspricht den im Abschnitt „Anmeldung über Cookies“ beschriebenen Ausnahmen.
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ recovery = new palladium Service Recovery ( $ repository , $ logger );
$ identity = $ search -> findStandardIdentityByIdentifier ( $ identifier );
$ token = $ recovery -> markForReset ( $ identity );
Wenn keine passende Identität mit der angegebenen E-Mail-Adresse gefunden wird, löst die Methode findStandardIdentityByIdentifier()
IdentityNotFound
Ausnahme aus.
Wenn markForReset()
aufgerufen wird, muss ihm eine Instanz von StandardIdentity
bereitgestellt werden, die bereits überprüft wurde (andernfalls besteht die Gefahr, dass private Benutzerinformationen aus Ihrer Anwendung verloren gehen). Ist dies nicht der Fall, löst die Methode die Ausnahme IdentityNotVerified
aus.
Die Methode markForReset()
war ein optionaler zweiter Parameter, der die Lebensdauer des Passwort-Reset-Tokens in Sekunden definiert. Bei der Anwendung sieht das vorherige Beispiel wie folgt aus:
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ recovery = new palladium Service Recovery ( $ repository , $ logger );
$ identity = $ search -> findStandardIdentityByIdentifier ( $ identifier );
$ token = $ recovery -> markForReset ( $ identity , 7200 );
Dadurch wird das Passwort-Reset-Token zwei Stunden lang verwendbar, nachdem die Identität dieses Benutzers zum Zurücksetzen markiert wurde. Wenn die zulässige Zeit abgelaufen ist, können Sie diese Identität nicht mehr mit findEmailIdentityByToken()
im Search
finden.
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ recovery = new palladium Service Recovery ( $ repository , $ logger );
$ identity = $ search -> findEmailIdentityByToken ( $ token , palladium Entity Identity:: ACTION_RESET );
$ recovery -> resetIdentityPassword ( $ identity , ' foobar ' );
Wenn keine passende Identität mit dem angegebenen Token gefunden wird, löst die Methode findEmailIdentityByToken()
IdentityNotFound
Ausnahme aus.
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ identification = new palladium Service Identification ( $ repository , $ logger );
$ identity = $ search -> findStandardIdentityByIdentifier ( $ identifier );
$ identification -> changePassword ( $ identity , $ oldPassword , $ newPassword );
Wenn keine passende Identität mit der angegebenen E-Mail-Adresse (oder einer anderen Art von Kennung) gefunden wird, löst die Methode findStandardIdentityByIdentifier()
IdentityNotFound
Ausnahme aus.
Falls das Passwort nicht übereinstimmt, löst die Methode changePassword()
PasswordMismatch
Ausnahme aus.
<?php
$ search = new palladium Service Search ( $ repository , $ logger );
$ identification = new palladium Service Identification ( $ factory , $ logger );
$ list = $ search -> findIdentitiesByParentId ( $ identity -> getId ());
$ identification -> discardIdentityCollection ( $ list );
Der Rückgabewert von findIdentitiesByParentId()
gibt IdentityCollection
zurück, die leer sein kann.
Wie bereits erwähnt, erwarten die Dienste in dieser Bibliothek einen PSR-3-kompatiblen Logger als Abhängigkeit. Es wird zur Protokollierung von Ereignissen auf drei Ebenen verwendet:
LogLevel::INFO
Diese Protokollebene wird zum Verfolgen gewöhnlicher Vorgänge verwendet, die dieser Benutzer ausführen würde, wenn er Ihre Anwendung in der beabsichtigten Weise verwendet:
LogLevel::NOTICE
Protokolle mit dieser Ebene werden aufgezeichnet, wenn der Benutzer einen erfolglosen Vorgang versucht hat, was bei korrekten Verwendungsszenarien nicht passieren sollte:
LogLevel::WARNING
Wird nur zum Protokollieren von Fällen verwendet, bei denen der Benutzer versucht hat, ein kompromittiertes Cookie zu verwenden.
Diese Bibliothek konzentriert sich auf eine bestimmte Aufgabe. Es umfasst keine der folgenden Funktionen:
Wenn Sie der Meinung sind, dass diese Authentifizierungsbibliothek einen der oben aufgeführten Teile erfordert, dann ist dies nicht die Bibliothek, nach der Sie suchen.