(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/ palladiumUm 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::INFODiese 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::NOTICEProtokolle mit dieser Ebene werden aufgezeichnet, wenn der Benutzer einen erfolglosen Vorgang versucht hat, was bei korrekten Verwendungsszenarien nicht passieren sollte:
LogLevel::WARNINGWird 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.