Authentifizierung für PHP. Einfach, leicht und sicher.
Einmal geschrieben, überall einsetzbar.
Völlig Framework- und Datenbank-unabhängig.
pdo
)mysqlnd
) oder PostgreSQL-Treiber ( pgsql
) oder SQLite-Treiber ( sqlite
)openssl
)Binden Sie die Bibliothek über Composer [?] ein:
$ composer require delight-im/auth
Binden Sie den Composer-Autoloader ein:
require __DIR__ . ' /vendor/autoload.php ' ;
Richten Sie eine Datenbank ein und erstellen Sie die erforderlichen Tabellen:
Migrieren Sie von einer früheren Version dieses Projekts? Weitere Informationen finden Sie in unserem Upgrade-Leitfaden.
// $ db = new PDO ( ' mysql:dbname=my-database ; host = localhost ; charset = utf8mb4' , ' my-username' , ' my-password' ) ;
// or
// $ db = new PDO ( ' pgsql:dbname=my-database ; host = localhost ; port = 5432 ' , ' my-username' , ' my-password' ) ;
// or
// $ db = new PDO ( ' sqlite:../Databases/my-database.sqlite' ) ;
// or
// $ db = Delight D b P doDatabase::fromDsn ( new Delight D b P doDsn ( ' mysql:dbname=my-database ; host = localhost ; charset = utf8mb4' , ' my-username' , ' my-password' ) ) ;
// or
// $ db = Delight D b P doDatabase::fromDsn ( new Delight D b P doDsn ( ' pgsql:dbname=my-database ; host = localhost ; port = 5432 ' , ' my-username' , ' my-password' ) ) ;
// or
// $ db = Delight D b P doDatabase::fromDsn ( new Delight D b P doDsn ( ' sqlite:../Databases/my-database.sqlite' ) ) ;
$ auth = new Delight Auth Auth ( $ db );
Wenn Sie bereits eine offene PDO
-Verbindung haben, verwenden Sie diese einfach erneut. Der Datenbankbenutzer (z. B. my-username
) benötigt mindestens die Berechtigungen SELECT
, INSERT
, UPDATE
und DELETE
für die von dieser Bibliothek (oder ihrer übergeordneten Datenbank) verwendeten Tabellen.
Wenn sich Ihr Webserver hinter einem Proxyserver befindet und $_SERVER['REMOTE_ADDR']
nur die IP-Adresse des Proxys enthält, müssen Sie im zweiten Argument mit dem Namen $ipAddress
die tatsächliche IP-Adresse des Benutzers an den Konstruktor übergeben. Der Standardwert ist die übliche Remote-IP-Adresse, die PHP empfängt.
Sollten Ihre Datenbanktabellen für diese Bibliothek ein gemeinsames Präfix benötigen, z. B. my_users
anstelle von users
(und ebenso für die anderen Tabellen), übergeben Sie das Präfix (z. B. my_
) als dritten Parameter an den Konstruktor mit dem Namen $dbTablePrefix
. Dies ist optional und das Präfix ist standardmäßig leer.
Während der Entwicklung möchten Sie möglicherweise die von dieser Bibliothek durchgeführte Anforderungsbeschränkung oder -drosselung deaktivieren. Übergeben Sie dazu false
als viertes Argument mit dem Namen $throttling
an den Konstruktor. Die Funktion ist standardmäßig aktiviert.
Während der Lebensdauer einer Sitzung können einige Benutzerdaten aus der Ferne geändert werden, entweder von einem Client in einer anderen Sitzung oder von einem Administrator. Das bedeutet, dass diese Informationen regelmäßig mit ihrer maßgeblichen Quelle in der Datenbank neu synchronisiert werden müssen, was diese Bibliothek automatisch tut. Standardmäßig geschieht dies alle fünf Minuten. Wenn Sie dieses Intervall ändern möchten, übergeben Sie dem Konstruktor als fünftes Argument ein benutzerdefiniertes Intervall in Sekunden mit dem Namen $sessionResyncInterval
.
Wenn alle Ihre Datenbanktabellen einen gemeinsamen Datenbanknamen, Schemanamen oder ein anderes Qualifikationsmerkmal benötigen, das explizit angegeben werden muss, können Sie dieses Qualifikationsmerkmal optional als sechsten Parameter mit dem Namen $dbSchema
an den Konstruktor übergeben.
Wenn Sie eine PdoDatabase
Instanz (z. B. $db
) auch unabhängig verwenden möchten, lesen Sie bitte die Dokumentation der Datenbankbibliothek.
try {
$ userId = $ auth -> register ( $ _POST [ ' email ' ], $ _POST [ ' password ' ], $ _POST [ ' username ' ], function ( $ selector , $ token ) {
echo ' Send ' . $ selector . ' and ' . $ token . ' to the user (e.g. via email) ' ;
echo ' For emails, consider using the mail(...) function, Symfony Mailer, Swiftmailer, PHPMailer, etc. ' ;
echo ' For SMS, consider using a third-party service and a compatible SDK ' ;
});
echo ' We have signed up a new user with the ID ' . $ userId ;
}
catch ( Delight Auth InvalidEmailException $ e ) {
die ( ' Invalid email address ' );
}
catch ( Delight Auth InvalidPasswordException $ e ) {
die ( ' Invalid password ' );
}
catch ( Delight Auth UserAlreadyExistsException $ e ) {
die ( ' User already exists ' );
}
catch ( Delight Auth TooManyRequestsException $ e ) {
die ( ' Too many requests ' );
}
Hinweis: Die anonyme Rückruffunktion ist ein Abschluss. Daher sind darin neben den eigenen Parametern nur Superglobals wie $_GET
, $_POST
, $_COOKIE
und $_SERVER
verfügbar. Für jede andere Variable aus dem übergeordneten Bereich müssen Sie explizit eine Kopie darin verfügbar machen, indem Sie nach der Parameterliste eine use
Klausel hinzufügen.
Der Benutzername im dritten Parameter ist optional. Sie können dort null
übergeben, wenn Sie Benutzernamen nicht verwalten möchten.
Wenn Sie andererseits eindeutige Benutzernamen erzwingen möchten, rufen Sie einfach registerWithUniqueUsername
anstelle von register
auf und seien Sie darauf vorbereitet, die DuplicateUsernameException
abzufangen.
Hinweis: Beim Akzeptieren und Verwalten von Benutzernamen möchten Sie möglicherweise nicht druckbare Steuerzeichen und bestimmte druckbare Sonderzeichen wie in der Zeichenklasse [x00-x1fx7f/:\]
ausschließen. Zu diesem Zweck könnten Sie den Aufruf von Auth#register
oder Auth#registerWithUniqueUsername
in einen bedingten Zweig einschließen, indem Sie beispielsweise Benutzernamen nur dann akzeptieren, wenn die folgende Bedingung erfüllt ist:
if ( preg_match ( ' /[x00-x1fx7f/: \\ ]/ ' , $ username ) === 0 ) {
// ...
}
Für die E-Mail-Verifizierung sollten Sie eine URL mit dem Selektor und dem Token erstellen und diese an den Benutzer senden, z. B.:
$ url = ' https://www.example.com/verify_email?selector= ' . urlencode ( $ selector ) . ' &token= ' . urlencode ( $ token );
Wenn Sie keine E-Mail-Verifizierung durchführen möchten, lassen Sie einfach den letzten Parameter von Auth#register
weg, also die anonyme Funktion oder den Abschluss. Der neue Benutzer ist dann sofort aktiv.
Müssen Sie zusätzliche Benutzerinformationen speichern? Lesen Sie hier weiter.
Hinweis: Bitte beachten Sie beim Senden einer E-Mail an den Benutzer, dass der (optionale) Benutzername zu diesem Zeitpunkt noch nicht als akzeptabel für den Inhaber der (neuen) E-Mail-Adresse bestätigt wurde. Es könnte eine beleidigende oder irreführende Sprache enthalten, die von jemandem gewählt wurde, der nicht tatsächlich der Eigentümer der Adresse ist.
try {
$ auth -> login ( $ _POST [ ' email ' ], $ _POST [ ' password ' ]);
echo ' User is logged in ' ;
}
catch ( Delight Auth InvalidEmailException $ e ) {
die ( ' Wrong email address ' );
}
catch ( Delight Auth InvalidPasswordException $ e ) {
die ( ' Wrong password ' );
}
catch ( Delight Auth EmailNotVerifiedException $ e ) {
die ( ' Email not verified ' );
}
catch ( Delight Auth TooManyRequestsException $ e ) {
die ( ' Too many requests ' );
}
Wenn Sie sich hingegen zusätzlich zum Login per E-Mail-Adresse oder als Ersatz mit Benutzernamen anmelden möchten, ist das ebenfalls möglich. Rufen Sie einfach die Methode loginWithUsername
anstelle der Methode login
auf. Stellen Sie dann sicher, dass Sie sowohl UnknownUsernameException
als auch AmbiguousUsernameException
abfangen, anstatt InvalidEmailException
abzufangen. Möglicherweise möchten Sie auch die Hinweise zur Einzigartigkeit von Benutzernamen im Abschnitt lesen, in dem erläutert wird, wie neue Benutzer angemeldet werden.
Extrahieren Sie den Selektor und das Token aus der URL, auf die der Benutzer in der Bestätigungs-E-Mail geklickt hat.
try {
$ auth -> confirmEmail ( $ _GET [ ' selector ' ], $ _GET [ ' token ' ]);
echo ' Email address has been verified ' ;
}
catch ( Delight Auth InvalidSelectorTokenPairException $ e ) {
die ( ' Invalid token ' );
}
catch ( Delight Auth TokenExpiredException $ e ) {
die ( ' Token expired ' );
}
catch ( Delight Auth UserAlreadyExistsException $ e ) {
die ( ' Email address already exists ' );
}
catch ( Delight Auth TooManyRequestsException $ e ) {
die ( ' Too many requests ' );
}
Wenn Sie möchten, dass der Benutzer nach erfolgreicher Bestätigung automatisch angemeldet wird, rufen Sie einfach confirmEmailAndSignIn
anstelle von confirmEmail
auf. Diese alternative Methode unterstützt auch dauerhafte Anmeldungen über ihren optionalen dritten Parameter.
Bei Erfolg geben die beiden Methoden confirmEmail
und confirmEmailAndSignIn
beide ein Array mit der neuen E-Mail-Adresse des Benutzers zurück, die gerade überprüft wurde, an Index eins. Wenn es sich bei der Bestätigung um eine Adressänderung und nicht um eine einfache Adressüberprüfung handelte, wird die alte E-Mail-Adresse des Benutzers am Index Null in das Array aufgenommen.
Der dritte Parameter der Methoden Auth#login
und Auth#confirmEmailAndSignIn
steuert, ob die Anmeldung mit einem langlebigen Cookie dauerhaft ist. Bei einer solchen dauerhaften Anmeldung bleiben Benutzer möglicherweise lange authentifiziert, selbst wenn die Browsersitzung bereits geschlossen wurde und die Sitzungscookies abgelaufen sind. Normalerweise möchten Sie, dass der Benutzer mit dieser Funktion, die als „An mich erinnern“ oder „Angemeldet bleiben“ bekannt ist, mehrere Wochen oder Monate lang angemeldet bleibt. Viele Benutzer werden dies bequemer finden, es ist jedoch möglicherweise weniger sicher, wenn sie ihre Geräte unbeaufsichtigt lassen.
if ( $ _POST [ ' remember ' ] == 1 ) {
// keep logged in for one year
$ rememberDuration = ( int ) ( 60 * 60 * 24 * 365.25 );
}
else {
// do not keep logged in after session ends
$ rememberDuration = null ;
}
// ...
$ auth -> login ( $ _POST [ ' email ' ], $ _POST [ ' password ' ], $ rememberDuration );
// . . .
Ohne die dauerhafte Anmeldung, die das Standardverhalten darstellt, bleibt ein Benutzer nur so lange angemeldet, bis er seinen Browser schließt, oder so lange, wie über session.cookie_lifetime
und session.gc_maxlifetime
in PHP konfiguriert.
Lassen Sie den dritten Parameter weg oder setzen Sie ihn auf null
um die Funktion zu deaktivieren. Andernfalls können Sie den Benutzer fragen, ob er „An mich erinnern“ aktivieren möchte. Dies geschieht normalerweise über ein Kontrollkästchen in Ihrer Benutzeroberfläche. Verwenden Sie die Eingabe aus diesem Kontrollkästchen, um hier zwischen null
und einer vordefinierten Dauer in Sekunden zu entscheiden, z. B. 60 * 60 * 24 * 365.25
für ein Jahr.
try {
$ auth -> forgotPassword ( $ _POST [ ' email ' ], function ( $ selector , $ token ) {
echo ' Send ' . $ selector . ' and ' . $ token . ' to the user (e.g. via email) ' ;
echo ' For emails, consider using the mail(...) function, Symfony Mailer, Swiftmailer, PHPMailer, etc. ' ;
echo ' For SMS, consider using a third-party service and a compatible SDK ' ;
});
echo ' Request has been generated ' ;
}
catch ( Delight Auth InvalidEmailException $ e ) {
die ( ' Invalid email address ' );
}
catch ( Delight Auth EmailNotVerifiedException $ e ) {
die ( ' Email not verified ' );
}
catch ( Delight Auth ResetDisabledException $ e ) {
die ( ' Password reset is disabled ' );
}
catch ( Delight Auth TooManyRequestsException $ e ) {
die ( ' Too many requests ' );
}
Hinweis: Die anonyme Rückruffunktion ist ein Abschluss. Daher sind darin neben den eigenen Parametern nur Superglobals wie $_GET
, $_POST
, $_COOKIE
und $_SERVER
verfügbar. Für jede andere Variable aus dem übergeordneten Bereich müssen Sie explizit eine Kopie darin verfügbar machen, indem Sie nach der Parameterliste eine use
Klausel hinzufügen.
Sie sollten eine URL mit dem Selektor und dem Token erstellen und diese an den Benutzer senden, z. B.:
$ url = ' https://www.example.com/reset_password?selector= ' . urlencode ( $ selector ) . ' &token= ' . urlencode ( $ token );
Wenn die Standardlebensdauer der Passwort-Reset-Anfragen für Sie nicht funktioniert, können Sie mit dem dritten Parameter von Auth#forgotPassword
ein benutzerdefiniertes Intervall in Sekunden angeben, nach dem die Anfragen ablaufen sollen.
Im nächsten Schritt klicken die Nutzer auf den Link, den sie erhalten haben. Extrahieren Sie den Selektor und das Token aus der URL.
Wenn das Selektor/Token-Paar gültig ist, lassen Sie den Benutzer ein neues Passwort wählen:
try {
$ auth -> canResetPasswordOrThrow ( $ _GET [ ' selector ' ], $ _GET [ ' token ' ]);
echo ' Put the selector into a "hidden" field (or keep it in the URL) ' ;
echo ' Put the token into a "hidden" field (or keep it in the URL) ' ;
echo ' Ask the user for their new password ' ;
}
catch ( Delight Auth InvalidSelectorTokenPairException $ e ) {
die ( ' Invalid token ' );
}
catch ( Delight Auth TokenExpiredException $ e ) {
die ( ' Token expired ' );
}
catch ( Delight Auth ResetDisabledException $ e ) {
die ( ' Password reset is disabled ' );
}
catch ( Delight Auth TooManyRequestsException $ e ) {
die ( ' Too many requests ' );
}
Wenn Sie keine Fehlermeldungen benötigen, sondern nur die Gültigkeit prüfen möchten, können Sie alternativ die etwas einfachere Variante verwenden:
if ( $ auth -> canResetPassword ( $ _GET [ ' selector ' ], $ _GET [ ' token ' ])) {
echo ' Put the selector into a "hidden" field (or keep it in the URL) ' ;
echo ' Put the token into a "hidden" field (or keep it in the URL) ' ;
echo ' Ask the user for their new password ' ;
}
Wenn Sie nun das neue Passwort für den Benutzer haben (und noch über die anderen beiden Informationen verfügen), können Sie das Passwort zurücksetzen:
try {
$ auth -> resetPassword ( $ _POST [ ' selector ' ], $ _POST [ ' token ' ], $ _POST [ ' password ' ]);
echo ' Password has been reset ' ;
}
catch ( Delight Auth InvalidSelectorTokenPairException $ e ) {
die ( ' Invalid token ' );
}
catch ( Delight Auth TokenExpiredException $ e ) {
die ( ' Token expired ' );
}
catch ( Delight Auth ResetDisabledException $ e ) {
die ( ' Password reset is disabled ' );
}
catch ( Delight Auth InvalidPasswordException $ e ) {
die ( ' Invalid password ' );
}
catch ( Delight Auth TooManyRequestsException $ e ) {
die ( ' Too many requests ' );
}
Möchten Sie, dass der jeweilige Benutzer automatisch angemeldet wird, wenn das Zurücksetzen seines Passworts erfolgreich ist? Verwenden Sie einfach Auth#resetPasswordAndSignIn
anstelle von Auth#resetPassword
um den Benutzer sofort anzumelden.
Wenn Sie die ID oder E-Mail-Adresse des Benutzers benötigen, um ihm beispielsweise eine Benachrichtigung zu senden, dass sein Passwort erfolgreich zurückgesetzt wurde, verwenden Sie einfach den Rückgabewert von Auth#resetPassword
, einem Array mit zwei Einträgen namens id
und email
.
Wenn ein Benutzer derzeit angemeldet ist, kann er sein Passwort ändern.
try {
$ auth -> changePassword ( $ _POST [ ' oldPassword ' ], $ _POST [ ' newPassword ' ]);
echo ' Password has been changed ' ;
}
catch ( Delight Auth NotLoggedInException $ e ) {
die ( ' Not logged in ' );
}
catch ( Delight Auth InvalidPasswordException $ e ) {
die ( ' Invalid password(s) ' );
}
catch ( Delight Auth TooManyRequestsException $ e ) {
die ( ' Too many requests ' );
}
Der empfohlene Weg, mit Passwortänderungen umzugehen, besteht darin, den Benutzer nach seinem aktuellen (und bald alten ) Passwort zu fragen und es zur Überprüfung aufzufordern. Dies ist oben dargestellt.
Wenn Sie jedoch sicher sind, dass Sie diese Bestätigung nicht benötigen, können Sie changePasswordWithoutOldPassword
anstelle von changePassword
aufrufen und den ersten Parameter aus diesem Methodenaufruf löschen (der andernfalls das alte Passwort enthalten würde).
Nachdem das Passwort des Benutzers geändert wurde, sollten Sie auf jeden Fall eine E-Mail an die primäre E-Mail-Adresse seines Kontos senden, um den Kontoinhaber als Out-of-Band-Benachrichtigung über diese kritische Änderung zu informieren.
Wenn ein Benutzer derzeit angemeldet ist, kann er seine E-Mail-Adresse ändern.
try {
if ( $ auth -> reconfirmPassword ( $ _POST [ ' password ' ])) {
$ auth -> changeEmail ( $ _POST [ ' newEmail ' ], function ( $ selector , $ token ) {
echo ' Send ' . $ selector . ' and ' . $ token . ' to the user (e.g. via email to the *new* address) ' ;
echo ' For emails, consider using the mail(...) function, Symfony Mailer, Swiftmailer, PHPMailer, etc. ' ;
echo ' For SMS, consider using a third-party service and a compatible SDK ' ;
});
echo ' The change will take effect as soon as the new email address has been confirmed ' ;
}
else {
echo ' We can ' t say if the user is who they claim to be ' ;
}
}
catch ( Delight Auth InvalidEmailException $ e ) {
die ( ' Invalid email address ' );
}
catch ( Delight Auth UserAlreadyExistsException $ e ) {
die ( ' Email address already exists ' );
}
catch ( Delight Auth EmailNotVerifiedException $ e ) {
die ( ' Account not verified ' );
}
catch ( Delight Auth NotLoggedInException $ e ) {
die ( ' Not logged in ' );
}
catch ( Delight Auth TooManyRequestsException $ e ) {
die ( ' Too many requests ' );
}
Hinweis: Die anonyme Rückruffunktion ist ein Abschluss. Daher sind darin neben den eigenen Parametern nur Superglobals wie $_GET
, $_POST
, $_COOKIE
und $_SERVER
verfügbar. Für jede andere Variable aus dem übergeordneten Bereich müssen Sie explizit eine Kopie darin verfügbar machen, indem Sie nach der Parameterliste eine use
Klausel hinzufügen.
Für die E-Mail-Verifizierung sollten Sie eine URL mit dem Selektor und dem Token erstellen und diese an den Benutzer senden, z. B.:
$ url = ' https://www.example.com/verify_email?selector= ' . urlencode ( $ selector ) . ' &token= ' . urlencode ( $ token );
Hinweis: Bitte beachten Sie beim Senden einer E-Mail an den Benutzer, dass der (optionale) Benutzername zu diesem Zeitpunkt noch nicht als akzeptabel für den Inhaber der (neuen) E-Mail-Adresse bestätigt wurde. Es könnte eine beleidigende oder irreführende Sprache enthalten, die von jemandem gewählt wurde, der nicht tatsächlich der Eigentümer der Adresse ist.
Nachdem der Antrag auf Änderung der E-Mail-Adresse gestellt wurde oder noch besser, nachdem die Änderung vom Benutzer bestätigt wurde, sollten Sie eine E-Mail an die vorherige E-Mail-Adresse seines Kontos als Out-of-Band-Benachrichtigung senden, um den Kontoinhaber darüber zu informieren diese entscheidende Veränderung.
Hinweis: Änderungen an der E-Mail-Adresse eines Benutzers werden erwartungsgemäß sofort in der lokalen Sitzung wirksam. In anderen Sitzungen (z. B. auf anderen Geräten) kann es jedoch bis zu fünf Minuten dauern, bis die Änderungen wirksam werden. Dies erhöht die Leistung und stellt in der Regel kein Problem dar. Wenn Sie dieses Verhalten dennoch ändern möchten, verringern (oder erhöhen) Sie einfach den Wert, den Sie als Argument namens $sessionResyncInterval
an den Auth
-Konstruktor übergeben.
Wenn dem Benutzer eine frühere Bestätigungsanfrage nicht zugestellt werden konnte, der Benutzer diese Anfrage verpasst hat oder einfach nicht länger warten möchte, können Sie eine frühere Anfrage wie folgt erneut senden:
try {
$ auth -> resendConfirmationForEmail ( $ _POST [ ' email ' ], function ( $ selector , $ token ) {
echo ' Send ' . $ selector . ' and ' . $ token . ' to the user (e.g. via email) ' ;
echo ' For emails, consider using the mail(...) function, Symfony Mailer, Swiftmailer, PHPMailer, etc. ' ;
echo ' For SMS, consider using a third-party service and a compatible SDK ' ;
});
echo ' The user may now respond to the confirmation request (usually by clicking a link) ' ;
}
catch ( Delight Auth ConfirmationRequestNotFound $ e ) {
die ( ' No earlier request found that could be re-sent ' );
}
catch ( Delight Auth TooManyRequestsException $ e ) {
die ( ' There have been too many requests -- try again later ' );
}
Wenn Sie den Benutzer über seine ID statt über seine E-Mail-Adresse angeben möchten, ist dies auch möglich:
try {
$ auth -> resendConfirmationForUserId ( $ _POST [ ' userId ' ], function ( $ selector , $ token ) {
echo ' Send ' . $ selector . ' and ' . $ token . ' to the user (e.g. via email) ' ;
echo ' For emails, consider using the mail(...) function, Symfony Mailer, Swiftmailer, PHPMailer, etc. ' ;
echo ' For SMS, consider using a third-party service and a compatible SDK ' ;
});
echo ' The user may now respond to the confirmation request (usually by clicking a link) ' ;
}
catch ( Delight Auth ConfirmationRequestNotFound $ e ) {
die ( ' No earlier request found that could be re-sent ' );
}
catch ( Delight Auth TooManyRequestsException $ e ) {
die ( ' There have been too many requests -- try again later ' );
}
Hinweis: Die anonyme Rückruffunktion ist ein Abschluss. Daher sind darin neben den eigenen Parametern nur Superglobals wie $_GET
, $_POST
, $_COOKIE
und $_SERVER
verfügbar. Für jede andere Variable aus dem übergeordneten Bereich müssen Sie explizit eine Kopie darin verfügbar machen, indem Sie nach der Parameterliste eine use
Klausel hinzufügen.
Normalerweise sollten Sie eine URL mit dem Selektor und dem Token erstellen und diese an den Benutzer senden, z. B. wie folgt:
$ url = ' https://www.example.com/verify_email?selector= ' . urlencode ( $ selector ) . ' &token= ' . urlencode ( $ token );
Hinweis: Bitte beachten Sie beim Senden einer E-Mail an den Benutzer, dass der (optionale) Benutzername zu diesem Zeitpunkt noch nicht als akzeptabel für den Inhaber der (neuen) E-Mail-Adresse bestätigt wurde. Es könnte eine beleidigende oder irreführende Sprache enthalten, die von jemandem gewählt wurde, der nicht tatsächlich der Eigentümer der Adresse ist.
$ auth -> logOut ();
// or
try {
$ auth -> logOutEverywhereElse ();
}
catch ( Delight Auth NotLoggedInException $ e ) {
die ( ' Not logged in ' );
}
// or
try {
$ auth -> logOutEverywhere ();
}
catch ( Delight Auth NotLoggedInException $ e ) {
die ( ' Not logged in ' );
}
Wenn Sie außerdem benutzerdefinierte Informationen in der Sitzung speichern und möchten, dass diese Informationen gelöscht werden, können Sie die gesamte Sitzung zerstören, indem Sie eine zweite Methode aufrufen:
$ auth -> destroySession ();
Hinweis: Globale Abmeldungen werden erwartungsgemäß sofort in der lokalen Sitzung wirksam. In anderen Sitzungen (z. B. auf anderen Geräten) kann es jedoch bis zu fünf Minuten dauern, bis die Änderungen wirksam werden. Dies erhöht die Leistung und stellt in der Regel kein Problem dar. Wenn Sie dieses Verhalten dennoch ändern möchten, verringern (oder erhöhen) Sie einfach den Wert, den Sie als Argument namens $sessionResyncInterval
an den Auth
-Konstruktor übergeben.
if ( $ auth -> isLoggedIn ()) {
echo ' User is signed in ' ;
}
else {
echo ' User is not signed in yet ' ;
}
Eine Abkürzung/ein Alias für diese Methode ist $auth->check()
.
$ id = $ auth -> getUserId ();
Wenn der Benutzer derzeit nicht angemeldet ist, wird null
zurückgegeben.
Eine Abkürzung/ein Alias für diese Methode ist $auth->id()
.
$ email = $ auth -> getEmail ();
Wenn der Benutzer derzeit nicht angemeldet ist, wird null
zurückgegeben.
$ username = $ auth -> getUsername ();
Denken Sie daran, dass Benutzernamen optional sind und es nur dann einen Benutzernamen gibt, wenn Sie ihn bei der Registrierung angegeben haben.
Wenn der Benutzer derzeit nicht angemeldet ist, wird null
zurückgegeben.
if ( $ auth -> isNormal ()) {
echo ' User is in default state ' ;
}
if ( $ auth -> isArchived ()) {
echo ' User has been archived ' ;
}
if ( $ auth -> isBanned ()) {
echo ' User has been banned ' ;
}
if ( $ auth -> isLocked ()) {
echo ' User has been locked ' ;
}
if ( $ auth -> isPendingReview ()) {
echo ' User is pending review ' ;
}
if ( $ auth -> isSuspended ()) {
echo ' User has been suspended ' ;
}
if ( $ auth -> isRemembered ()) {
echo ' User did not sign in but was logged in through their long-lived cookie ' ;
}
else {
echo ' User signed in manually ' ;
}
Wenn der Benutzer derzeit nicht angemeldet ist, wird null
zurückgegeben.
$ ip = $ auth -> getIpAddress ();
Um die universelle Eignung und volle Wiederverwendbarkeit dieser Bibliothek zu gewährleisten, wird auf zusätzliche gebündelte Spalten zur Benutzerinformation verzichtet. Auf zusätzliche Benutzerinformationen müssen Sie aber natürlich nicht verzichten:
So verwenden Sie diese Bibliothek mit Ihren eigenen Tabellen für benutzerdefinierte Benutzerinformationen auf wartbare und wiederverwendbare Weise:
Fügen Sie eine beliebige Anzahl benutzerdefinierter Datenbanktabellen hinzu, in denen Sie benutzerdefinierte Benutzerinformationen speichern, z. B. eine Tabelle mit dem Namen profiles
.
Wenn Sie die register
aufrufen (die die ID des neuen Benutzers zurückgibt), fügen Sie anschließend Ihre eigene Logik hinzu, die Ihre benutzerdefinierten Datenbanktabellen füllt.
Wenn Sie die benutzerdefinierten Benutzerinformationen nur selten benötigen, können Sie sie einfach bei Bedarf abrufen. Wenn Sie es jedoch häufiger benötigen, möchten Sie es wahrscheinlich in Ihren Sitzungsdaten haben. Mit der folgenden Methode können Sie Ihre Daten zuverlässig laden und abrufen:
function getUserInfo ( Delight Auth Auth $ auth ) {
if (! $ auth -> isLoggedIn ()) {
return null ;
}
if (! isset ( $ _SESSION [ ' _internal_user_info ' ])) {
// TODO : load your custom user information and assign it to the session variable below
// $ _SESSION [ ' _internal_user_info' ] = ...
}
return $ _SESSION [ ' _internal_user_info ' ];
}
Wann immer Sie die Identität des Benutzers erneut bestätigen möchten, z. B. bevor der Benutzer eine „gefährliche“ Aktion ausführen darf, sollten Sie sein Passwort erneut überprüfen, um zu bestätigen, dass er tatsächlich der ist, für den er sich ausgibt.
Wenn ein Benutzer beispielsweise durch ein langlebiges Cookie gespeichert wurde und Auth#isRemembered
daher true
zurückgibt, bedeutet dies, dass der Benutzer sein Passwort wahrscheinlich schon seit einiger Zeit nicht mehr eingegeben hat. In diesem Fall möchten Sie möglicherweise das Passwort erneut bestätigen.
try {
if ( $ auth -> reconfirmPassword ( $ _POST [ ' password ' ])) {
echo ' The user really seems to be who they claim to be ' ;
}
else {
echo ' We can ' t say if the user is who they claim to be ' ;
}
}
catch ( Delight Auth NotLoggedInException $ e ) {
die ( ' The user is not signed in ' );
}
catch ( Delight Auth TooManyRequestsException $ e ) {
die ( ' Too many requests ' );
}
Jeder Benutzer kann beliebig viele Rollen haben, mit denen Sie die Autorisierung umsetzen und Ihre Zugriffskontrollen verfeinern können.
Benutzer können überhaupt keine Rolle haben (was sie standardmäßig tun), genau eine Rolle oder eine beliebige Kombination von Rollen.
if ( $ auth -> hasRole ( Delight Auth Role:: SUPER_MODERATOR )) {
echo ' The user is a super moderator ' ;
}
// or
if ( $ auth -> hasAnyRole ( Delight Auth Role:: DEVELOPER , Delight Auth Role:: MANAGER )) {
echo ' The user is either a developer, or a manager, or both ' ;
}
// or
if ( $ auth -> hasAllRoles ( Delight Auth Role:: DEVELOPER , Delight Auth Role:: MANAGER )) {
echo ' The user is both a developer and a manager ' ;
}
Während die Methode hasRole
genau eine Rolle als Argument annimmt, können die beiden Methoden hasAnyRole
und hasAllRoles
beliebig viele Rollen annehmen, nach denen Sie suchen möchten.
Alternativ können Sie eine Liste aller Rollen abrufen, die dem Benutzer zugewiesen wurden:
$ auth -> getRoles ();
Delight Auth Role:: ADMIN ;
Delight Auth Role:: AUTHOR ;
Delight Auth Role:: COLLABORATOR ;
Delight Auth Role:: CONSULTANT ;
Delight Auth Role:: CONSUMER ;
Delight Auth Role:: CONTRIBUTOR ;
Delight Auth Role:: COORDINATOR ;
Delight Auth Role:: CREATOR ;
Delight Auth Role:: DEVELOPER ;
Delight Auth Role:: DIRECTOR ;
Delight Auth Role:: EDITOR ;
Delight Auth Role:: EMPLOYEE ;
Delight Auth Role:: MAINTAINER ;
Delight Auth Role:: MANAGER ;
Delight Auth Role:: MODERATOR ;
Delight Auth Role:: PUBLISHER ;
Delight Auth Role:: REVIEWER ;
Delight Auth Role:: SUBSCRIBER ;
Delight Auth Role:: SUPER_ADMIN ;
Delight Auth Role:: SUPER_EDITOR ;
Delight Auth Role:: SUPER_MODERATOR ;
Delight Auth Role:: TRANSLATOR ;
Sie können jede dieser Rollen verwenden und diejenigen ignorieren, die Sie nicht benötigen. Die obige Liste kann auch programmgesteuert in einem von drei Formaten abgerufen werden:
Delight Auth Role:: getMap ();
// or
Delight Auth Role:: getNames ();
// or
Delight Auth Role:: getValues ();
Die Berechtigungen jedes Benutzers werden so codiert, dass Rollenanforderungen in Ihrer gesamten Codebasis angegeben werden. Wenn diese Anforderungen mit den Rollen eines bestimmten Benutzers bewertet werden, sind implizit überprüfte Berechtigungen das Ergebnis.
Bei größeren Projekten empfiehlt es sich oft, die Definition der Berechtigungen an einer einzigen Stelle zu verwalten. Sie prüfen dann nicht nach Rollen in Ihrer Geschäftslogik, sondern nach individuellen Berechtigungen . Sie könnten dieses Konzept wie folgt umsetzen:
function canEditArticle ( Delight Auth Auth $ auth ) {
return $ auth -> hasAnyRole (
Delight Auth Role:: MODERATOR ,
Delight Auth Role:: SUPER_MODERATOR ,
Delight Auth Role:: ADMIN ,
Delight Auth Role:: SUPER_ADMIN
);
}
// . . .
if ( canEditArticle ( $ auth )) {
echo ' The user can edit articles here ' ;
}
// . . .
if ( canEditArticle ( $ auth )) {
echo ' ... and here ' ;
}
// . . .
if ( canEditArticle ( $ auth )) {
echo ' ... and here ' ;
}
Wie Sie sehen, wird die Berechtigung, ob ein bestimmter Benutzer einen Artikel bearbeiten darf, an einer zentralen Stelle gespeichert. Diese Implementierung hat zwei große Vorteile:
Wenn Sie wissen möchten, welche Benutzer Artikel bearbeiten können, müssen Sie Ihre Geschäftslogik nicht an verschiedenen Stellen überprüfen, sondern nur schauen, wo die spezifische Berechtigung definiert ist. Und wenn Sie ändern möchten, wer einen Artikel bearbeiten darf, müssen Sie dies auch nur an einer einzigen Stelle tun, nicht in Ihrer gesamten Codebasis.
Dies bringt jedoch auch einen etwas höheren Aufwand bei der erstmaligen Implementierung der Zugriffsbeschränkungen mit sich, der sich für Ihr Projekt lohnen kann, aber auch nicht.
Wenn die Namen der enthaltenen Rollen für Sie nicht funktionieren, können Sie eine beliebige Anzahl von Rollen mit Ihren eigenen Bezeichnern aliasen, z. B. so:
namespace My Namespace ;
final class MyRole {
const CUSTOMER_SERVICE_AGENT = Delight Auth Role:: REVIEWER ;
const FINANCIAL_DIRECTOR = Delight Auth Role:: COORDINATOR ;
private function __construct () {}
}
Das obige Beispiel würde Ihnen die Verwendung ermöglichen
My Namespace MyRole:: CUSTOMER_SERVICE_AGENT ;
// and
My Namespace MyRole:: FINANCIAL_DIRECTOR ;
anstatt
Delight Auth Role:: REVIEWER ;
// and
Delight Auth Role:: COORDINATOR ;
Denken Sie daran, eine einzelne enthaltene Rolle nicht mehreren Rollen mit benutzerdefinierten Namen zuzuordnen.
Während das Zurücksetzen von Passwörtern per E-Mail eine praktische Funktion ist, die die meisten Benutzer von Zeit zu Zeit als hilfreich empfinden, bedeutet die Verfügbarkeit dieser Funktion, dass Konten in Ihrem Dienst immer nur so sicher sind wie das mit dem Benutzer verknüpfte E-Mail-Konto.
Sie können sicherheitsbewussten (und erfahrenen) Benutzern die Möglichkeit bieten, das Zurücksetzen von Passwörtern für ihre Konten zu deaktivieren (und sie später wieder zu aktivieren), um die Sicherheit zu erhöhen:
try {
if ( $ auth -> reconfirmPassword ( $ _POST [ ' password ' ])) {
$ auth -> setPasswordResetEnabled ( $ _POST [ ' enabled ' ] == 1 );
echo ' The setting has been changed ' ;
}
else {
echo ' We can ' t say if the user is who they claim to be ' ;
}
}
catch ( Delight Auth NotLoggedInException $ e ) {
die ( ' The user is not signed in ' );
}
catch ( Delight Auth TooManyRequestsException $ e ) {
die ( ' Too many requests ' );
}
Um den aktuellen Wert dieser Einstellung zu überprüfen, verwenden Sie den Rückgabewert von
$ auth -> isPasswordResetEnabled ();
Suchen Sie nach der richtigen Standardoption in Ihrer Benutzeroberfläche. Sie müssen diesen Wert nicht auf Einschränkungen der Funktion überprüfen, die automatisch erzwungen werden.
Alle von dieser Bibliothek bereitgestellten Methoden werden automatisch vor einer übermäßigen Anzahl von Anfragen von Clients geschützt. Bei Bedarf können Sie diesen Schutz mithilfe des an den Konstruktor übergebenen Parameters $throttling
(vorübergehend) deaktivieren.
Wenn Sie auch externe Funktionen oder Methoden, z. B. in Ihrem eigenen Code, drosseln oder die Rate begrenzen möchten, können Sie die integrierte Hilfsmethode zur Drosselung und Ratenbegrenzung nutzen:
try {
// throttle the specified resource or feature to * 3 * requests per * 60 * seconds
$ auth -> throttle ([ ' my-resource-name ' ], 3 , 60 );
echo ' Do something with the resource or feature ' ;
}
catch ( Delight Auth TooManyRequestsException $ e ) {
// operation cancelled
http_response_code ( 429 );
exit ;
}
Wenn der Schutz der Ressource oder Funktion zusätzlich von einem anderen Attribut abhängen soll, z. B. um etwas separat pro IP-Adresse zu verfolgen, fügen Sie einfach weitere Daten zur Ressourcenbeschreibung hinzu, wie zum Beispiel:
[ ' my-resource-name ' , $ _SERVER [ ' REMOTE_ADDR ' ] ]
// instead of
// [ ' my-resource-name' ]
Durch die Angabe eines Burst-Faktors als viertes Argument können kurze Aktivitätsschübe während der Spitzenlastzeit zugelassen werden. Ein Wert von 5
würde beispielsweise vorübergehende Ausbrüche einer fünffachen Aktivität im Vergleich zum allgemein akzeptierten Wert ermöglichen.
In manchen Fällen möchten Sie möglicherweise nur die Drosselung oder Ratenbegrenzung simulieren . Auf diese Weise können Sie prüfen, ob eine Aktion zulässig wäre, ohne den Aktivitätstracker tatsächlich zu ändern. Übergeben Sie dazu einfach true
als fünftes Argument.
Hinweis: Wenn Sie die Drosselung für die Instanz deaktivieren (mithilfe des an den Konstruktor übergebenen Parameters $throttling
), werden sowohl der automatische interne Schutz als auch die Auswirkungen aller Aufrufe von Auth#throttle
in Ihrem eigenen Anwendungscode deaktiviert – es sei denn, Sie legen auch Folgendes fest Der optionale $force
Parameter wird in bestimmten Auth#throttle
Aufrufen auf true
gesetzt.
Die Verwaltungsschnittstelle ist über $auth->admin()
verfügbar. Sie können auf dieser Schnittstelle verschiedene Methoden aufrufen, wie unten dokumentiert.
Vergessen Sie nicht, eine sichere Zugriffskontrolle zu implementieren, bevor Sie den Zugriff auf diese Schnittstelle freigeben. Sie können beispielsweise nur angemeldeten Benutzern mit der Administratorrolle Zugriff auf diese Schnittstelle gewähren oder die Schnittstelle nur in privaten Skripten verwenden.
try {
$ userId = $ auth -> admin ()-> createUser ( $ _POST [ ' email ' ], $ _POST [ ' password ' ], $ _POST [ ' username ' ]);
echo ' We have signed up a new user with the ID ' . $ userId ;
}
catch ( Delight Auth InvalidEmailException $ e ) {
die ( ' Invalid email address ' );
}
catch ( Delight Auth InvalidPasswordException $ e ) {
die ( ' Invalid password ' );
}
catch ( Delight Auth UserAlreadyExistsException $ e ) {
die ( ' User already exists ' );
}
Der Benutzername im dritten Parameter ist optional. Sie können dort null
übergeben, wenn Sie Benutzernamen nicht verwalten möchten.
Wenn Sie andererseits eindeutige Benutzernamen erzwingen möchten, rufen Sie einfach createUserWithUniqueUsername
anstelle von createUser
auf und seien Sie darauf vorbereitet, die DuplicateUsernameException
abzufangen.
Benutzer anhand ihrer ID löschen:
try {
$ auth -> admin ()-> deleteUserById ( $ _POST [ ' id ' ]);
}
catch ( Delight Auth UnknownIdException $ e ) {
die ( ' Unknown ID ' );
}
Benutzer anhand ihrer E-Mail-Adresse löschen:
try {
$ auth -> admin ()-> deleteUserByEmail ( $ _POST [ ' email ' ]);
}
catch ( Delight Auth InvalidEmailException $ e ) {
die ( ' Unknown email address ' );
}
Benutzer anhand ihres Benutzernamens löschen:
try {
$ auth -> admin ()-> deleteUserByUsername ( $ _POST [ ' username ' ]);
}
catch ( Delight Auth UnknownUsernameException $ e ) {
die ( ' Unknown username ' );
}
catch ( Delight Auth AmbiguousUsernameException $ e ) {
die ( ' Ambiguous username ' );
}
Beim Abrufen einer Liste aller Benutzer variieren die Anforderungen je nach Projekt und Anwendungsfall stark und Anpassungen sind üblich. Beispielsweise möchten Sie möglicherweise verschiedene Spalten abrufen, verwandte Tabellen verknüpfen, nach bestimmten Kriterien filtern, die Sortierung der Ergebnisse ändern (in unterschiedlicher Richtung) und die Anzahl der Ergebnisse begrenzen (und gleichzeitig einen Offset angeben).
Aus diesem Grund ist es einfacher, eine einzelne benutzerdefinierte SQL-Abfrage zu verwenden. Beginnen Sie mit Folgendem:
SELECT id, email, username, status, verified, roles_mask, registered, last_login FROM users;
try {
$ auth -> admin ()-> addRoleForUserById ( $ userId , Delight Auth Role:: ADMIN );
}
catch ( Delight Auth UnknownIdException $ e ) {
die ( ' Unknown user ID ' );
}
// or
try {
$ auth -> admin ()-> addRoleForUserByEmail ( $ userEmail , Delight Auth Role:: ADMIN );
}
catch ( Delight Auth InvalidEmailException $ e ) {
die ( ' Unknown email address ' );
}
// or
try {
$ auth -> admin ()-> addRoleForUserByUsername ( $ username , Delight Auth Role:: ADMIN );
}
catch ( Delight Auth UnknownUsernameException $ e ) {
die ( ' Unknown username ' );
}
catch ( Delight Auth AmbiguousUsernameException $ e ) {
die ( ' Ambiguous username ' );
}
Hinweis: Es kann bis zu fünf Minuten dauern, bis Änderungen am Rollensatz eines Benutzers wirksam werden. Dies erhöht die Leistung und stellt in der Regel kein Problem dar. Wenn Sie dieses Verhalten dennoch ändern möchten, verringern (oder erhöhen) Sie einfach den Wert, den Sie als Argument namens $sessionResyncInterval
an den Auth
-Konstruktor übergeben.
try {
$ auth -> admin ()-> removeRoleForUserById ( $ userId , Delight Auth Role:: ADMIN );
}
catch ( Delight Auth UnknownIdException $ e ) {
die ( ' Unknown user ID ' );
}
// or
try {
$ auth -> admin ()-> removeRoleForUserByEmail ( $ userEmail , Delight Auth Role:: ADMIN );
}
catch ( Delight Auth InvalidEmailException $ e ) {
die ( ' Unknown email address ' );
}
// or
try {
$ auth -> admin ()-> removeRoleForUserByUsername ( $ username , Delight Auth Role:: ADMIN );
}
catch ( Delight Auth UnknownUsernameException $ e ) {
die ( ' Unknown username ' );
}
catch ( Delight Auth AmbiguousUsernameException $ e ) {
die ( ' Ambiguous username ' );
}
Hinweis: Es kann bis zu fünf Minuten dauern, bis Änderungen am Rollensatz eines Benutzers wirksam werden. Dies erhöht die Leistung und stellt in der Regel kein Problem dar. Wenn Sie dieses Verhalten dennoch ändern möchten, verringern (oder erhöhen) Sie einfach den Wert, den Sie als Argument namens $sessionResyncInterval
an den Auth
-Konstruktor übergeben.
try {
if ( $ auth -> admin ()-> doesUserHaveRole ( $ userId , Delight Auth Role:: ADMIN )) {
echo ' The specified user is an administrator ' ;
}
else {
echo ' The specified user is not an administrator ' ;
}
}
catch ( Delight Auth UnknownIdException $ e ) {
die ( ' Unknown user ID ' );
}
Alternativ können Sie eine Liste aller Rollen abrufen, die dem Benutzer zugewiesen wurden:
$ auth -> admin ()-> getRolesForUserById ( $ userId );
try {
$ auth -> admin ()-> logInAsUserById ( $ _POST [ ' id ' ]);
}
catch ( Delight Auth UnknownIdException $ e ) {
die ( ' Unknown ID ' );
}
catch ( Delight Auth EmailNotVerifiedException $ e ) {
die ( ' Email address not verified ' );
}
// or
try {
$ auth -> admin ()-> logInAsUserByEmail ( $ _POST [ ' email ' ]);
}
catch ( Delight Auth InvalidEmailException $ e ) {
die ( ' Unknown email address ' );
}
catch ( Delight Auth EmailNotVerifiedException $ e ) {
die ( ' Email address not verified ' );
}
// or
try {
$ auth -> admin ()-> logInAsUserByUsername ( $ _POST [ ' username ' ]);
}
catch ( Delight Auth UnknownUsernameException $ e ) {
die ( ' Unknown username ' );
}
catch ( Delight Auth AmbiguousUsernameException $ e ) {
die ( ' Ambiguous username ' );
}
catch ( Delight Auth EmailNotVerifiedException $ e ) {
die ( ' Email address not verified ' );
}
try {
$ auth -> admin ()-> changePasswordForUserById ( $ _POST [ ' id ' ], $ _POST [ ' newPassword ' ]);
}
catch ( Delight Auth UnknownIdException $ e ) {
die ( ' Unknown ID ' );
}
catch ( Delight Auth InvalidPasswordException $ e ) {
die ( ' Invalid password ' );
}
// or
try {
$ auth -> admin ()-> changePasswordForUserByUsername ( $ _POST [ ' username ' ], $ _POST [ ' newPassword ' ]);
}
catch ( Delight Auth UnknownUsernameException $ e ) {
die ( ' Unknown username ' );
}
catch ( Delight Auth AmbiguousUsernameException $ e ) {
die ( ' Ambiguous username ' );
}
catch ( Delight Auth InvalidPasswordException $ e ) {
die ( ' Invalid password ' );
}
Diese Bibliothek verwendet zwei Cookies, um den Status auf dem Client beizubehalten: Das erste, dessen Namen Sie mit abrufen können
session_name ();
ist das allgemeine (obligatorische) Sitzungscookie. Das zweite (optionale) Cookie wird nur für dauerhafte Anmeldungen verwendet und sein Name kann wie folgt abgerufen werden:
Delight Auth Auth:: createRememberCookieName ();
Sie können das von dieser Bibliothek verwendete Sitzungscookie auf eine der folgenden Weisen in der Reihenfolge der Empfehlung umbenennen:
Suchen Sie in der PHP-Konfiguration ( php.ini
) die Zeile mit der Anweisung session.name
und ändern Sie ihren Wert in etwas wie session_v1
, wie in:
session.name = session_v1
Rufen Sie so früh wie möglich in Ihrer Anwendung und bevor Sie die Auth
-Instanz erstellen, ini_set
auf, um session.name
in etwas wie session_v1
zu ändern, wie in:
ini_set ( ' session.name ' , ' session_v1 ' );
Damit dies funktioniert, muss session.auto_start
in der PHP-Konfiguration ( php.ini
) auf 0
gesetzt werden.
Rufen Sie so früh wie möglich in Ihrer Anwendung und bevor Sie die Auth
-Instanz erstellen, session_name
mit einem Argument wie session_v1
auf, wie in:
session_name ( ' session_v1 ' );
Damit dies funktioniert, muss session.auto_start
in der PHP-Konfiguration ( php.ini
) auf 0
gesetzt werden.
Der Name des Cookies für dauerhafte Anmeldungen ändert sich automatisch, wenn Sie den Namen des Sitzungscookies ändern.
Das domain
eines Cookies steuert, für welche Domäne (und welche Unterdomänen) das Cookie gültig ist und wo somit der Sitzungs- und Authentifizierungsstatus des Benutzers verfügbar ist.
Der empfohlene Standardwert ist eine leere Zeichenfolge, was bedeutet, dass das Cookie nur für den genauen aktuellen Host gültig ist, mit Ausnahme eventuell vorhandener Subdomains. Sie sollten nur dann einen anderen Wert verwenden, wenn Sie Cookies zwischen verschiedenen Subdomains teilen müssen. Häufig möchten Sie Cookies zwischen der reinen Domain und der www
Subdomain teilen, vielleicht möchten Sie sie aber auch zwischen anderen Subdomains teilen.
Unabhängig davon, für welchen Satz von Subdomains Sie sich entscheiden, sollten Sie das Attribut des Cookies auf den spezifischsten Domainnamen setzen, der noch alle erforderlichen Subdomains enthält. Um beispielsweise Cookies zwischen example.com
und www.example.com
zu teilen, würden Sie das Attribut auf example.com
setzen. Wenn Sie jedoch Cookies zwischen sub1.app.example.com
und sub2.app.example.com
teilen möchten, sollten Sie das Attribut auf app.example.com
setzen. Jeder explizit angegebene Domänenname umfasst immer alle möglicherweise vorhandenen Subdomänen.
Sie können das Attribut auf eine der folgenden Weisen (in der Reihenfolge der Empfehlung) ändern:
Suchen Sie in der PHP-Konfiguration ( php.ini
) die Zeile mit der Anweisung session.cookie_domain
und ändern Sie deren Wert wie gewünscht, z. B.:
session.cookie_domain = example.com
Rufen Sie so früh wie möglich in Ihrer Anwendung und bevor Sie die Auth
-Instanz erstellen, ini_set
auf, um den Wert der session.cookie_domain
-Direktive wie gewünscht zu ändern, z. B.:
ini_set ( ' session.cookie_domain ' , ' example.com ' );
Damit dies funktioniert, muss session.auto_start
in der PHP-Konfiguration ( php.ini
) auf 0
gesetzt werden.
Das path
eines Cookies steuert, für welche Verzeichnisse (und Unterverzeichnisse) das Cookie gültig ist und wo somit der Sitzungs- und Authentifizierungsstatus des Benutzers verfügbar ist.
In den meisten Fällen möchten Sie Cookies für alle Pfade verfügbar machen, also für jedes Verzeichnis und jede Datei, beginnend im Stammverzeichnis. Das ist es, was ein Wert von /
für das Attribut bewirkt, was auch die empfohlene Standardeinstellung ist. Sie sollten dieses Attribut nur dann auf einen anderen Wert ändern, z. B. /path/to/subfolder
, wenn Sie einschränken möchten, in welchen Verzeichnissen Ihre Cookies verfügbar sein werden, z. B. um mehrere Anwendungen nebeneinander in verschiedenen Verzeichnissen unter zu hosten gleichen Domainnamen.
Sie können das Attribut auf eine der folgenden Weisen (in der Reihenfolge der Empfehlung) ändern:
Suchen Sie in der PHP-Konfiguration ( php.ini
) die Zeile mit der Anweisung session.cookie_path
und ändern Sie deren Wert wie gewünscht, z. B.:
session.cookie_path = /
Rufen Sie so früh wie möglich in Ihrer Anwendung und bevor Sie die Auth
-Instanz erstellen, ini_set
auf, um den Wert der session.cookie_path
-Direktive wie gewünscht zu ändern, z. B.:
ini_set ( ' session.cookie_path ' , ' / ' );
Damit dies funktioniert, muss session.auto_start
in der PHP-Konfiguration ( php.ini
) auf 0
gesetzt werden.
Mithilfe des httponly
Attributs können Sie steuern, ob clientseitige Skripte, also JavaScript, auf Ihre Cookies zugreifen dürfen oder nicht. Aus Sicherheitsgründen ist es am besten, den Skriptzugriff auf Ihre Cookies zu verweigern , um beispielsweise den Schaden zu verringern, den erfolgreiche XSS-Angriffe gegen Ihre Anwendung anrichten könnten.
Daher sollten Sie httponly
immer auf 1
setzen, außer in den seltenen Fällen, in denen Sie wirklich Zugriff auf Ihre Cookies über JavaScript benötigen und keine bessere Lösung finden können. Setzen Sie in diesen Fällen das Attribut auf 0
, aber seien Sie sich der Konsequenzen bewusst.
Sie können das Attribut auf eine der folgenden Weisen (in der Reihenfolge der Empfehlung) ändern:
Suchen Sie in der PHP-Konfiguration ( php.ini
) die Zeile mit der Anweisung session.cookie_httponly
und ändern Sie deren Wert wie gewünscht, z. B.:
session.cookie_httponly = 1
Rufen Sie so früh wie möglich in Ihrer Anwendung und bevor Sie die Auth
-Instanz erstellen, ini_set
auf, um den Wert der session.cookie_httponly
-Direktive wie gewünscht zu ändern, z. B.:
ini_set ( ' session.cookie_httponly ' , 1 );
Damit dies funktioniert, muss session.auto_start
in der PHP-Konfiguration ( php.ini
) auf 0
gesetzt werden.
Mithilfe des Attributs secure
können Sie steuern, ob Cookies über eine beliebige Verbindung gesendet werden sollen, einschließlich reinem HTTP, oder ob eine sichere Verbindung, z. B. HTTPS (mit SSL/TLS), erforderlich sein soll. Der erstere (weniger sichere) Modus kann ausgewählt werden, indem das Attribut auf 0
gesetzt wird, und der letztere (sicherere) Modus kann ausgewählt werden, indem das Attribut auf 1
gesetzt wird.
Dies hängt natürlich ausschließlich davon ab, ob Sie alle Seiten ausschließlich über HTTPS bereitstellen können. Wenn möglich, sollten Sie das Attribut auf 1
setzen und es möglicherweise mit HTTP-Weiterleitungen zum sicheren Protokoll und HTTP Strict Transport Security (HSTS) kombinieren. Andernfalls müssen Sie das Attribut möglicherweise auf 0
setzen.
Sie können das Attribut auf eine der folgenden Weisen (in der Reihenfolge der Empfehlung) ändern:
Suchen Sie in der PHP-Konfiguration ( php.ini
) die Zeile mit der Anweisung session.cookie_secure
und ändern Sie ihren Wert wie gewünscht, z. B.:
session.cookie_secure = 1
Rufen Sie so früh wie möglich in Ihrer Anwendung und bevor Sie die Auth
-Instanz erstellen, ini_set
auf, um den Wert der session.cookie_secure
-Direktive wie gewünscht zu ändern, z. B.:
ini_set ( ' session.cookie_secure ' , 1 );
Damit dies funktioniert, muss session.auto_start
in der PHP-Konfiguration ( php.ini
) auf 0
gesetzt werden.
$ length = 24 ;
$ randomStr = Delight Auth Auth:: createRandomString ( $ length );
$ uuid = Delight Auth Auth:: createUuid ();
Ausführliche Informationen zum komfortablen Lesen und Schreiben von Sitzungsdaten finden Sie in der Dokumentation der standardmäßig enthaltenen Sitzungsbibliothek.
Jedes Passwort oder Authentifizierungstoken wird automatisch mit der „bcrypt“-Funktion gehasht, die auf der „Blowfish“-Verschlüsselung basiert und heute (immer noch) als eine der stärksten Passwort-Hash-Funktionen gilt. „bcrypt“ wird mit 1.024 Iterationen verwendet, also einem „Kosten“-Faktor von 10. Außerdem wird automatisch ein zufälliges „Salt“ angewendet.
Sie können diese Konfiguration überprüfen, indem Sie sich die Hashes in Ihrer Datenbanktabelle users
ansehen. Wenn das oben Gesagte auf Ihr Setup zutrifft, sollten alle Passwort-Hashes in Ihrer users
mit dem Präfix $2$10$
, $2a$10$
oder $2y$10$
beginnen.
Wenn in Zukunft möglicherweise neue Algorithmen (wie Argon2) eingeführt werden, kümmert sich diese Bibliothek automatisch um die „Aktualisierung“ Ihrer vorhandenen Passwort-Hashes, wenn sich ein Benutzer anmeldet oder sein Passwort ändert.
Die Durchsetzung einer Mindestlänge für Passwörter ist normalerweise eine gute Idee. Darüber hinaus möchten Sie möglicherweise nachsehen, ob sich ein potenzielles Passwort in einer Blacklist befindet, die Sie in einer Datenbank oder in einer Datei verwalten können, um zu verhindern, dass Wörterbuchwörter oder häufig verwendete Passwörter in Ihrer Anwendung verwendet werden.
Um maximale Flexibilität und Benutzerfreundlichkeit zu ermöglichen, wurde diese Bibliothek so konzipiert, dass sie selbst keine weiteren Prüfungen für Passwortanforderungen enthält, sondern es Ihnen stattdessen ermöglicht, Ihre eigenen Prüfungen um die relevanten Aufrufe von Bibliotheksmethoden zu wickeln. Beispiel:
function isPasswordAllowed ( $ password ) {
if ( strlen ( $ password ) < 8 ) {
return false ;
}
$ blacklist = [ ' password1 ' , ' 123456 ' , ' qwerty ' ];
if ( in_array ( $ password , $ blacklist )) {
return false ;
}
return true ;
}
if ( isPasswordAllowed ( $ password )) {
$ auth -> register ( $ email , $ password );
}
Sie können versuchen, zuerst diese Bibliothek zu laden und zuerst die Auth
Instanz zu erstellen, bevor Sie die anderen Bibliotheken laden. Abgesehen davon können wir hier wahrscheinlich nicht viel tun.
Wenn Sie zulassen möchten, dass andere Ihre Website in ein <frame>
-, <iframe>
, <object>
, <embed>
- oder <applet>
-Element einbinden, müssen Sie den standardmäßigen Clickjacking-Schutz deaktivieren:
header_remove ( ' X-Frame-Options ' );
Diese Bibliothek löst zwei Arten von Ausnahmen aus, um auf Probleme hinzuweisen:
AuthException
und seine Unterklassen werden immer dann ausgelöst, wenn eine Methode nicht erfolgreich abgeschlossen wird. Sie sollten diese Ausnahmen immer abfangen, da sie die normalen Fehlerantworten enthalten, auf die Sie reagieren müssen.AuthError
und seine Unterklassen werden immer dann ausgelöst, wenn ein internes Problem vorliegt oder die Bibliothek nicht korrekt installiert wurde. Sie sollten diese Ausnahmen nicht abfangen. Alle Beiträge sind willkommen! Wenn Sie einen Beitrag leisten möchten, erstellen Sie zuerst ein Problem, damit Ihre Funktion, Ihr Problem oder Ihre Frage besprochen werden können.
Dieses Projekt ist gemäß den Bedingungen der MIT -Lizenz lizenziert.