Inhaltsverzeichnis
Key Takeaways
abhängig
Die Authentifizierungsklassen
Schließlich wird AuthenticatEtoken () aufgerufen und versucht zu überprüfen, ob die Anmeldeinformationen im Token gültig sind. Hier und mithilfe der PHP -Bibliothek von userApp.io versuchen wir, eine Symfony -Authentifizierungsausnahme auszusetzen oder zu werfen, wenn dies fehlschlägt. Wenn die Authentifizierung jedoch erfolgreich ist, wird der verantwortliche Benutzeranbieter verwendet, um unser Benutzerobjekt aufzubauen, bevor er ein anderes Token -Objekt basierend auf letzterem erstellt und zurückgibt.
Die Benutzerklasse
logout
alles verdrahtet
Schlussfolgerung
häufig gestellte Fragen (FAQs) zur Benutzerauthentifizierung mit Symfony2 und userApp.io
Wie kann ich userApp.io in Symfony2 für die Benutzerauthentifizierung integrieren? Zunächst müssen Sie die UserApp -Bibliothek mit Composer installieren. Anschließend müssen Sie den UserApp -Dienst in Ihrem Symfony2 -Projekt konfigurieren. Dabei wird der UserApp -API -Schlüssel eingerichtet und den UserApp -Dienst in der Datei dienste.yml konfiguriert. Danach können Sie den UserApp -Dienst in Ihren Controllern verwenden, um Benutzer zu authentifizieren. Vorteile für die Benutzerauthentifizierung in Symfony2. Es vereinfacht den Prozess der Benutzerverwaltung, indem eine vorbereitete Lösung für die Benutzerauthentifizierung, Registrierung, Zurücksetzen des Kennworts und vieles mehr bereitgestellt wird. Es bietet auch eine sichere und skalierbare Lösung für die Benutzerauthentifizierung, die für groß angelegte Anwendungen sehr vorteilhaft sein kann.
Wie kann ich Benutzerrollen und Berechtigungen mit userApp.io in Symfony2? Sie können verschiedene Rollen definieren und sie den Benutzern zuweisen. Anschließend können Sie die Rolle des Benutzers in Ihren Symfony2 -Controllern überprüfen, um den Zugriff auf verschiedene Teile Ihrer Anwendung zu steuern. Bietet eine Funktion „Benutzerregistrierung“, mit der Sie die Benutzerregistrierung in Ihrer Symfony2 -Anwendung verarbeiten können. Sie können den UserApp -Dienst in Ihren Controllern verwenden, um neue Benutzer zu registrieren. Der UserApp -Dienst wird den Registrierungsprozess behandelt, einschließlich der Validierung des Benutzers und des Kennworts des Benutzers und Erstellen eines neuen Benutzerkontos. .IO bietet eine Funktion namens „Kennwortreset“, mit der Sie in Ihrer Symfony2 -Anwendung das Zurücksetzen des Kennworts behandeln können. Sie können den UserApp -Dienst in Ihren Controllern verwenden, um das Kennwort eines Benutzers zurückzusetzen. Der UserApp -Dienst wird den Vorgang des Kennworts zurücksetzen, einschließlich des Sendens einer E -Mail -Reset -E -Mail an das Benutzer an den Benutzer. Eine Funktion namens "Fehlerbehandlung", mit der Sie Benutzerauthentifizierungsfehler in Ihrer Symfony2 -Anwendung behandeln können. Sie können den UserApp -Dienst in Ihren Controllern verwenden, um Authentifizierungsfehler zu fangen und zu behandeln. Der UserApp -Dienst enthält detaillierte Fehlermeldungen, mit denen Sie Authentifizierungsprobleme debuggen und beheben können. Eine Reihe von Anpassungsoptionen für den Benutzerauthentifizierungsprozess. Sie können das Anmeldeformular, das Registrierungsformular, das Passwort -Reset -Formular und mehr anpassen. Sie können den Benutzerauthentifizierungsprozess auch anpassen, indem Sie dem Benutzerprofil benutzerdefinierte Felder hinzufügen oder benutzerdefinierte Authentifizierungslogik implementieren. IO bietet eine Reihe von Sicherheitsfunktionen, mit denen Sie Ihre Symfony2 -Anwendung sichern können. Es bietet eine sichere Benutzerauthentifizierung, ein sicherer Kennwortspeicher und eine sichere Benutzerverwaltung. Es bietet auch Funktionen wie zwei-Faktor-Authentifizierung und IP-Whitelisting, die die Sicherheit Ihrer Anwendung weiter verbessern können. .IO bietet eine Funktion namens „Datenmigration“, mit der Sie Ihre vorhandenen Benutzerdaten auf userApp.io migrieren können. Sie können die UserApp -API verwenden, um Ihre vorhandenen Benutzerdaten in userApp.io zu importieren. Die UserApp -API bietet eine Reihe von Endpunkten, mit denen Sie Benutzerdaten importieren können, einschließlich Benutzerprofile, Benutzerrollen und Benutzerberechtigungen.
Wie kann ich Probleme mit userApp.io in symfony2? Es bietet detaillierte Fehlermeldungen, Protokollierung und Debugging -Tools. Sie können auch die UserApp -API verwenden, um Probleme mit dem UserApp -Dienst zu beheben. Die UserApp -API bietet eine Reihe von Endpunkten, mit denen Sie Probleme mit dem UserApp -Dienst debuggen und beheben können.
Heim Backend-Entwicklung PHP-Tutorial Benutzerauthentifizierung in Symfony2 mit userApp.io

Benutzerauthentifizierung in Symfony2 mit userApp.io

Feb 18, 2025 am 09:47 AM

Benutzerauthentifizierung in Symfony2 mit userApp.io

userApp.io ist ein praktisches Tool und eine API von Benutzerverwaltung. Es bietet eine Weboberfläche, mit der Sie mit Benutzerkonten (und den vielen Funktionen, die dies mit sich bringt) und eine API, um sie in Ihre eigene Webanwendung einzuschließen. Der Zweck dieses Dienstes ist es, es einfacher und sicherer zu machen, die Benutzerauthentifizierung zu verwalten, indem Sie sich auf Ihrem eigenen Server nicht darum kümmern müssen.

Benutzerauthentifizierung in Symfony2 mit userApp.io

Es verfügt über SDKs und verschiedene Wrapper für viele Programmiersprachen und Frameworks, und der Preis ist erschwinglich. Ja, es ist mit einem Preis verbunden, aber Sie können mit ziemlich vielen Dingen, mit denen Sie herumspielen können, frei beginnen. Ich empfehle, ihre Funktionsseite zu überprüfen, um weitere Informationen zu erhalten. Außerdem ist es sehr einfach, ein Konto zu erstellen und mit dem Erstellen von Benutzern zu experimentieren, ihre Profile usw. Eigenschaften hinzuzufügen. Ich empfehle Ihnen, dies auch zu überprüfen, wenn Sie es noch nicht getan haben.

In diesem Artikel werden wir uns untersuchen, wie wir einen Symfony2 -Authentifizierungsmechanismus implementieren können, der userApp.io nutzt. Der Code, den wir schreiben, finden Sie auch in dieser kleinen Bibliothek, die ich (derzeit in Dev) erstellt habe, die Sie ausprobieren können. Um es in Ihrer Symfony -App zu installieren, befolgen Sie einfach die Anweisungen auf GitHub.

Key Takeaways

  • userApp.io bietet eine umfassende API der Benutzerverwaltung, die es einfacher und sicherer macht, die Benutzerauthentifizierung ohne serverseitige Bedenken zu verarbeiten.
  • symfony2 Integration in userApp.io wird über eine PHP -Bibliothek erleichtert, die über Komponisten leicht installierbar und konfigurierbar in Symfony's Services Framework ist.
  • Benutzerdefinierte Klassen wie Formauthentiker, Benutzeranbieter und Abmeldehandler sind für die Nutzung von userApp.io in Symfony2 unerlässlich, wodurch nahtlose Authentifizierungsprozesse ermöglicht werden.
  • Das Formular Authenticator -Klasse in Symfony2 übernimmt Benutzeranmeldesversuche und erstellt und authentifiziert Token basierend auf den Antworten von UserApp.io.
  • Benutzeranbieter in Symfony2 Interagieren Sie mit userApp.io, um Benutzerdetails zu holen und in Symfony-kompatible Benutzerobjekte zu konvertieren, Rollen und Berechtigungen effektiv zu bearbeiten.
  • Anmeldung von Benutzern beinhaltet eine benutzerdefinierte Logout -Handlerklasse, die mit userApp.io interagiert, um sicherzustellen, dass Benutzer auch aus dem Dienst angemeldet sind, wodurch die Konsistenz über Plattformen hinweg aufrechterhalten wird.

abhängig

Um mit dem UserApp.io -Dienst zu kommunizieren, verwenden wir ihre PHP -Bibliothek. Stellen Sie sicher, dass Sie dies in der Composer.json -Datei Ihrer Symfony -Anwendung benötigen, wie auf ihrer Github -Seite angewiesen.

Die Authentifizierungsklassen

, um userApp.io -Benutzer mit unserer Symfony -App zu authentifizieren, erstellen wir einige Klassen:

  • Eine Formular -Authentikatorenklasse zur Durchführung der Authentifizierung mit der userApp.io api
  • Eine benutzerdefinierte Benutzerklasse, mit der unsere Benutzer mit Informationen aus der API
  • gesammelt wurden
  • Eine Benutzeranbieterklasse, mit der Benutzer abgerufen und in Objekte unserer Benutzerklasse
  • umgewandelt werden können
  • eine Token -Klasse, mit der das Symfony Authentication Token
  • dargestellt wird.
  • Eine Abmeldungs ​​-Handler -Klasse, die sich um die Anmeldung vom UserApp.io -Dienst kümmert.
Eine einfache Ausnahmeklasse, die wir werfen können, wenn die Benutzer userApp.io keine Berechtigungen haben (die wir in Symfony -Rollen konvertieren)

Sobald wir diese Klassen erstellt haben, werden wir einige von ihnen als Dienste deklarieren und sie innerhalb des Symfony -Sicherheitssystems verwenden.

Form Authenticator
<span><span><?php
</span></span><span>
</span><span><span>/**
</span></span><span><span> * <span>@file AppBundle\Security\UserAppAuthenticator.php
</span></span></span><span><span> */
</span></span><span>
</span><span><span>namespace AppBundle<span>\Security</span>;
</span></span><span>
</span><span><span>use Symfony<span>\Component\HttpFoundation\Request</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\Authentication\SimpleFormAuthenticatorInterface</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\Authentication\Token\TokenInterface</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\Exception\AuthenticationException</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\User\UserProviderInterface</span>;
</span></span><span><span>use UserApp<span>\API</span> as UserApp;
</span></span><span><span>use UserApp<span>\Exceptions\ServiceException</span>;
</span></span><span>
</span><span><span>class UserAppAuthenticator implements SimpleFormAuthenticatorInterface
</span></span><span><span>{
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>@var UserApp
</span></span></span><span><span>   */
</span></span><span>  <span>private $userAppClient;
</span></span><span>
</span><span>  <span>public function __construct(UserApp $userAppClient) {
</span></span><span>    <span>$this->userAppClient = $userAppClient;
</span></span><span>  <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>{@inheritdoc}
</span></span></span><span><span>   */
</span></span><span>  <span>public function authenticateToken(TokenInterface $token, UserProviderInterface $userProvider, $providerKey)
</span></span><span>  <span>{
</span></span><span>
</span><span>    <span>try {
</span></span><span>      <span>$login = $this->userAppClient->user->login(array(
</span></span><span>        <span>"login" => $token->getUsername(),
</span></span><span>        <span>"password" => $token->getCredentials(),
</span></span><span>        <span>)
</span></span><span>      <span>);
</span></span><span>
</span><span>      <span>// Load user from provider based on id
</span></span><span>      <span>$user = $userProvider->loadUserByLoginInfo($login);
</span></span><span>    <span>} catch(ServiceException $exception) {
</span></span><span>      <span>if ($exception->getErrorCode() == 'INVALID_ARGUMENT_LOGIN' || $exception->getErrorCode() == 'INVALID_ARGUMENT_PASSWORD') {
</span></span><span>        <span>throw new AuthenticationException('Invalid username or password');
</span></span><span>      <span>}
</span></span><span>      <span>if ($exception->getErrorCode() == 'INVALID_ARGUMENT_APP_ID') {
</span></span><span>        <span>throw new AuthenticationException('Invalid app ID');
</span></span><span>      <span>}
</span></span><span>    <span>}
</span></span><span>    <span>return new UserAppToken(
</span></span><span>      <span>$user,
</span></span><span>      <span>$user->getToken(),
</span></span><span>      <span>$providerKey,
</span></span><span>      <span>$user->getRoles()
</span></span><span>    <span>);
</span></span><span>  <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>{@inheritdoc}
</span></span></span><span><span>   */
</span></span><span>  <span>public function supportsToken(TokenInterface $token, $providerKey)
</span></span><span>  <span>{
</span></span><span>    <span>return $token instanceof UserAppToken
</span></span><span>    <span>&& $token->getProviderKey() === $providerKey;
</span></span><span>  <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>{@inheritdoc}
</span></span></span><span><span>   */
</span></span><span>  <span>public function createToken(Request $request, $username, $password, $providerKey)
</span></span><span>  <span>{
</span></span><span>    <span>return new UserAppToken($username, $password, $providerKey);
</span></span><span>  <span>}
</span></span><span><span>}</span></span>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Erstens erstellen wir die wichtigste Klasse, den Formular Authenticator (in einem Sicherheits-/ Ordner unserer besten Practice namens AppBundle). Hier ist der Code, ich werde ihn danach erklären:

Wie Sie sehen, implementieren wir das SimpleFormAuthenticatorInterface und haben folglich 3 Methoden und einen Konstruktor. Letzteres nimmt eine Abhängigkeit als sofortiger userApp.io -Client (über den Service Container übergeben, aber in einer Minute mehr).

.

Diese Klasse wird von Symfony verwendet, wenn ein Benutzer versucht, sich mit der Anwendung anzumelden und zu authentifizieren. Das erste, was passiert, ist, dass CreateToken () aufgerufen wird. Diese Methode muss ein Authentifizierungs -Token zurückgeben, das den eingereichten Benutzernamen und das eingereichte Passwort kombiniert. In unserem Fall wird es eine Instanz der benutzerdepToken -Klasse sein, die wir in einem Moment definieren werden.

Dann wird die SupportToken () -Methode aufgerufen, um zu überprüfen, ob diese Klasse das von CreateToken () zurückgegebene Token unterstützt. Hier stellen wir nur sicher, dass wir für unseren Token -Typ zutreffen.

Schließlich wird AuthenticatEtoken () aufgerufen und versucht zu überprüfen, ob die Anmeldeinformationen im Token gültig sind. Hier und mithilfe der PHP -Bibliothek von userApp.io versuchen wir, eine Symfony -Authentifizierungsausnahme auszusetzen oder zu werfen, wenn dies fehlschlägt. Wenn die Authentifizierung jedoch erfolgreich ist, wird der verantwortliche Benutzeranbieter verwendet, um unser Benutzerobjekt aufzubauen, bevor er ein anderes Token -Objekt basierend auf letzterem erstellt und zurückgibt.

<span><span><?php
</span></span><span>
</span><span><span>/**
</span></span><span><span> * <span>@file AppBundle\Security\UserAppToken.php
</span></span></span><span><span> */
</span></span><span>
</span><span><span>namespace AppBundle<span>\Security</span>;
</span></span><span>
</span><span><span>use Symfony<span>\Component\Security\Core\Authentication\Token\UsernamePasswordToken</span>;
</span></span><span>
</span><span><span>class UserAppToken extends UsernamePasswordToken {
</span></span><span>
</span><span><span>}</span></span>
Nach dem Login kopieren
Nach dem Login kopieren
Wir werden unseren Benutzeranbieter gleich nach dem schnellen Erstellen der einfachen userAptoken -Klasse schreiben.

Token -Klasse

Wie Sie sehen, ist dies nur eine Erweiterung der usernamepassword -Class, um zu benennen, genauer zu sein (da wir ein Token anstelle eines Passworts speichern).

<span><span><?php
</span></span><span>
</span><span><span>/**
</span></span><span><span> * <span>@file AppBundle\Security\UserAppProvider.php
</span></span></span><span><span> */
</span></span><span>
</span><span><span>namespace AppBundle<span>\Security</span>;
</span></span><span>
</span><span><span>use Symfony<span>\Component\Security\Core\Exception\AuthenticationException</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\Exception\UsernameNotFoundException</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\User\UserProviderInterface</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\User\UserInterface</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\Exception\UnsupportedUserException</span>;
</span></span><span><span>use UserApp<span>\API</span> as UserApp;
</span></span><span><span>use UserApp<span>\Exceptions\ServiceException</span>;
</span></span><span><span>use AppBundle<span>\Security\Exception\NoUserRoleException</span>;
</span></span><span><span>use AppBundle<span>\Security\UserAppUser</span>;
</span></span><span>
</span><span><span>class UserAppProvider implements UserProviderInterface
</span></span><span><span>{
</span></span><span>  <span>/**
</span></span><span><span>   * <span>@var UserApp
</span></span></span><span><span>   */
</span></span><span>  <span>private $userAppClient;
</span></span><span>
</span><span>  <span>public function __construct(UserApp $userAppClient) {
</span></span><span>    <span>$this->userAppClient = $userAppClient;
</span></span><span>  <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>{@inheritdoc}
</span></span></span><span><span>   */
</span></span><span>  <span>public function loadUserByUsername($username)
</span></span><span>  <span>{
</span></span><span>    <span>// Empty for now
</span></span><span>  <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>{@inheritdoc}
</span></span></span><span><span>   */
</span></span><span>  <span>public function refreshUser(UserInterface $user)
</span></span><span>  <span>{
</span></span><span>    <span>if (!$user instanceof UserAppUser) {
</span></span><span>      <span>throw new UnsupportedUserException(
</span></span><span>        <span>sprintf('Instances of "%s" are not supported.', get_class($user))
</span></span><span>      <span>);
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>try {
</span></span><span>      <span>$api = $this->userAppClient;
</span></span><span>      <span>$api->setOption('token', $user->getToken());
</span></span><span>      <span>$api->token->heartbeat();
</span></span><span>      <span>$user->unlock();
</span></span><span>    <span>}
</span></span><span>    <span>catch (ServiceException $exception) {
</span></span><span>      <span>if ($exception->getErrorCode() == 'INVALID_CREDENTIALS') {
</span></span><span>        <span>throw new AuthenticationException('Invalid credentials');
</span></span><span>      <span>}
</span></span><span>      <span>if ($exception->getErrorCode() == 'AUTHORIZATION_USER_LOCKED') {
</span></span><span>        <span>$user->lock();
</span></span><span>      <span>}
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>return $user;
</span></span><span>  <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>{@inheritdoc}
</span></span></span><span><span>   */
</span></span><span>  <span>public function supportsClass($class)
</span></span><span>  <span>{
</span></span><span>    <span>return $class === 'AppBundle\Security\UserAppUser';
</span></span><span>  <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   *
</span></span><span><span>   * Loads a user from UserApp.io based on a successful login response.
</span></span><span><span>   *
</span></span><span><span>   * <span>@param $login
</span></span></span><span><span>   * <span>@return UserAppUser
</span></span></span><span><span>   * <span>@throws NoUserRoleException
</span></span></span><span><span>   */
</span></span><span>  <span>public function loadUserByLoginInfo($login) {
</span></span><span>
</span><span>    <span>try {
</span></span><span>      <span>$api = $this->userAppClient;
</span></span><span>      <span>$api->setOption('token', $login->token);
</span></span><span>      <span>$users = $api->user->get();
</span></span><span>    <span>} catch(ServiceException $exception) {
</span></span><span>      <span>if ($exception->getErrorCode() == 'INVALID_ARGUMENT_USER_ID') {
</span></span><span>        <span>throw new UsernameNotFoundException(sprintf('User with the id "%s" not found.', $login->user_id));
</span></span><span>      <span>}
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>if (!empty($users)) {
</span></span><span>      <span>return $this->userFromUserApp($users[0], $login->token);
</span></span><span>    <span>}
</span></span><span>  <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * Creates a UserAppUser from a user response from UserApp.io
</span></span><span><span>   *
</span></span><span><span>   * <span>@param $user
</span></span></span><span><span>   * <span>@param $token
</span></span></span><span><span>   * <span>@return UserAppUser
</span></span></span><span><span>   * <span>@throws NoUserRoleException
</span></span></span><span><span>   */
</span></span><span>  <span>private function userFromUserApp($user, $token) {
</span></span><span>
</span><span>    <span>$roles = $this->extractRolesFromPermissions($user);
</span></span><span>
</span><span>    <span>$options = array(
</span></span><span>      <span>'id' => $user->user_id,
</span></span><span>      <span>'username' => $user->login,
</span></span><span>      <span>'token' => $token,
</span></span><span>      <span>'firstName' => $user->first_name,
</span></span><span>      <span>'lastName' => $user->last_name,
</span></span><span>      <span>'email' => $user->email,
</span></span><span>      <span>'roles' => $roles,
</span></span><span>      <span>'properties' => $user->properties,
</span></span><span>      <span>'features' => $user->features,
</span></span><span>      <span>'permissions' => $user->permissions,
</span></span><span>      <span>'created' => $user->created_at,
</span></span><span>      <span>'locked' => !empty($user->locks),
</span></span><span>      <span>'last_logged_in' => $user->last_login_at,
</span></span><span>      <span>'last_heartbeat' => time(),
</span></span><span>    <span>);
</span></span><span>
</span><span>    <span>return new UserAppUser($options);  
</span></span><span> <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * Extracts the roles from the permissions list of a user
</span></span><span><span>   *
</span></span><span><span>   * <span>@param $user
</span></span></span><span><span>   * <span>@return <span>array</span>
</span></span></span><span><span>   * <span>@throws NoUserRoleException
</span></span></span><span><span>   */
</span></span><span>  <span>private function extractRolesFromPermissions($user) {
</span></span><span>    <span>$permissions = get_object_vars($user->permissions);
</span></span><span>    <span>if (empty($permissions)) {
</span></span><span>      <span>throw new NoUserRoleException('There are no roles set up for your users.');
</span></span><span>    <span>}
</span></span><span>    <span>$roles = array();
</span></span><span>    <span>foreach ($permissions as $role => $permission) {
</span></span><span>      <span>if ($permission->value === TRUE) {
</span></span><span>        <span>$roles[] = $role;
</span></span><span>      <span>}
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>if (empty($roles)) {
</span></span><span>      <span>throw new NoUserRoleException('This user has no roles enabled.');
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>return $roles;
</span></span><span>  <span>}
</span></span><span><span>}</span></span>
Nach dem Login kopieren
Nach dem Login kopieren
Benutzeranbieter

Nächst Ähnlich wie bei der Form der Form der Authentikatoren injizieren wir den userApp.io -Client mithilfe der Abhängigkeitsinjektion in diese Klasse und implementieren das UserProviderInterface. Letzteres erfordert, dass wir 3 Methoden haben:
  • loadUserByusername () - was wir vorerst leer lassen, da wir es nicht brauchen
  • refreshuser () - das auf jede authentifizierte Anfrage aufgerufen wird
  • SupportSClass () - was bestimmt, ob dieser Benutzeranbieter mit unserer (noch zu erstellten) Benutzerklasse arbeitet.

Lassen Sie uns eine Sekunde in unsere Authenticator -Klasse zurückgeben und sehen, was genau passiert, wenn die Authentifizierung mit userApp.io erfolgreich ist Verwendet sein Authentifizierungs-Token, um das angemeldete Benutzerobjekt von der API zurückzufordern. Das Ergebnis wird über den Benutzer aus dem Benutzer aus der lokalen örtlichen UserAppuser über den BenutzerfromuserApp () und die ExtractrolesFrompermissions () Helper -Methoden eingewickelt. Letzteres ist meine eigene Implementierung einer Möglichkeit, das Konzept der Berechtigungen in userApp.io in Symfony zu übersetzen. Und wir werfen unsere eigene Nouserrolexception, wenn der userApp.io nicht mit Berechtigungen für die Benutzer eingerichtet ist. Stellen Sie also sicher, dass Ihre Benutzer in userApp.io Berechtigungen haben, die Sie in Symfony zuordnen möchten.

Die Ausnahmeklasse ist eine einfache Erweiterung aus der Standard -PHP -Ausnahme:

<span><span><?php
</span></span><span>
</span><span><span>/**
</span></span><span><span> * <span>@file AppBundle\Security\UserAppAuthenticator.php
</span></span></span><span><span> */
</span></span><span>
</span><span><span>namespace AppBundle<span>\Security</span>;
</span></span><span>
</span><span><span>use Symfony<span>\Component\HttpFoundation\Request</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\Authentication\SimpleFormAuthenticatorInterface</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\Authentication\Token\TokenInterface</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\Exception\AuthenticationException</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\User\UserProviderInterface</span>;
</span></span><span><span>use UserApp<span>\API</span> as UserApp;
</span></span><span><span>use UserApp<span>\Exceptions\ServiceException</span>;
</span></span><span>
</span><span><span>class UserAppAuthenticator implements SimpleFormAuthenticatorInterface
</span></span><span><span>{
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>@var UserApp
</span></span></span><span><span>   */
</span></span><span>  <span>private $userAppClient;
</span></span><span>
</span><span>  <span>public function __construct(UserApp $userAppClient) {
</span></span><span>    <span>$this->userAppClient = $userAppClient;
</span></span><span>  <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>{@inheritdoc}
</span></span></span><span><span>   */
</span></span><span>  <span>public function authenticateToken(TokenInterface $token, UserProviderInterface $userProvider, $providerKey)
</span></span><span>  <span>{
</span></span><span>
</span><span>    <span>try {
</span></span><span>      <span>$login = $this->userAppClient->user->login(array(
</span></span><span>        <span>"login" => $token->getUsername(),
</span></span><span>        <span>"password" => $token->getCredentials(),
</span></span><span>        <span>)
</span></span><span>      <span>);
</span></span><span>
</span><span>      <span>// Load user from provider based on id
</span></span><span>      <span>$user = $userProvider->loadUserByLoginInfo($login);
</span></span><span>    <span>} catch(ServiceException $exception) {
</span></span><span>      <span>if ($exception->getErrorCode() == 'INVALID_ARGUMENT_LOGIN' || $exception->getErrorCode() == 'INVALID_ARGUMENT_PASSWORD') {
</span></span><span>        <span>throw new AuthenticationException('Invalid username or password');
</span></span><span>      <span>}
</span></span><span>      <span>if ($exception->getErrorCode() == 'INVALID_ARGUMENT_APP_ID') {
</span></span><span>        <span>throw new AuthenticationException('Invalid app ID');
</span></span><span>      <span>}
</span></span><span>    <span>}
</span></span><span>    <span>return new UserAppToken(
</span></span><span>      <span>$user,
</span></span><span>      <span>$user->getToken(),
</span></span><span>      <span>$providerKey,
</span></span><span>      <span>$user->getRoles()
</span></span><span>    <span>);
</span></span><span>  <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>{@inheritdoc}
</span></span></span><span><span>   */
</span></span><span>  <span>public function supportsToken(TokenInterface $token, $providerKey)
</span></span><span>  <span>{
</span></span><span>    <span>return $token instanceof UserAppToken
</span></span><span>    <span>&& $token->getProviderKey() === $providerKey;
</span></span><span>  <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>{@inheritdoc}
</span></span></span><span><span>   */
</span></span><span>  <span>public function createToken(Request $request, $username, $password, $providerKey)
</span></span><span>  <span>{
</span></span><span>    <span>return new UserAppToken($username, $password, $providerKey);
</span></span><span>  <span>}
</span></span><span><span>}</span></span>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Zurück zu unserem Authenticator sehen wir, dass ein Benutzeranpassungsobjekt, der vom Benutzeranbieter mit allen erforderlichen Informationen über den Benutzer enthält, wenn die Authentifizierung mit userApp.io erfolgreich ist. Mit diesem Objekt müssen wir es einer neuen Instanz der Benutzerapptoken -Klasse hinzufügen und zurückgeben.

Im Grunde genommen geschieht dies ab dem Moment, in dem ein Benutzer versucht, sich anzumelden:

  1. Wir erstellen ein Token mit den eingereichten Anmeldeinformationen (createToken ())
  2. Wir versuchen, die Anmeldeinformationen in diesem Token zu authentifizieren und eine Authentifizierungsausnahme auszulegen, wenn wir nicht
  3. versagen
  4. Wir erstellen ein neues Token, das das Benutzerobjekt und einige andere Informationen enthält, wenn die Authentifizierung erfolgreich ist
  5. Wir geben dieses Token zurück, mit dem Symfony den Benutzer in der Sitzung speichert.

Die Methode refreshuser () am Benutzeranbieter ist ebenfalls sehr wichtig. Diese Methode ist dafür verantwortlich, eine neue Instanz des aktuell angemeldeten Benutzer auf jeder authentifizierten Seiten -Aktualisierung abzurufen. Wenn der authentifizierte Benutzer auf eine der Seiten in der Firewall geht, wird diese Methode ausgelöst. Es geht darum, das Benutzerobjekt mit Änderungen des Speichers zu hydratisieren, die in der Zwischenzeit möglicherweise stattgefunden haben.

Offensichtlich müssen wir API -Anrufe auf ein Minimum führen, aber dies ist eine gute Gelegenheit, die Authentifizierungszeit von userApp.io zu erhöhen, indem eine Herzschlaganfrage gesendet wird. Standardmäßig (aber konfigurierbar) ist jedes authentifizierte Benutzer -Token für 60 Minuten gültig, aber durch Senden einer Herzschlaganforderung wird dies um 20 Minuten verlängert.

Dies ist ein großartiger Ort, um auch zwei weitere Funktionen auszuführen:

  1. Wenn das Token in der Zwischenzeit in userApp.io abgelaufen ist, erhalten wir eine Ausnahme von Invalid_credentials.
  2. Obwohl Heartbeat -Anfragen so billig wie möglich sind (was bedeutet, dass keine wirklichen Benutzerdaten abgerufen werden), wird der Benutzersperrstatus in Form einer Ausnahme wieder übertragen. So können wir diese Gelegenheit nutzen und auch unser Benutzerobjekt markieren, das gesperrt ist. Der gesperrte Status kann dann in der Anwendung verwendet werden, beispielsweise durch Überprüfen dagegen und den Zugriff auf verschiedene Teile, wenn der Benutzer gesperrt ist.

Wenn Sie möchten, können Sie hier eine API -Anforderung stellen und das Benutzerobjekt mit Daten von userApp.io aktualisieren, aber ich finde, dass es für die meisten Anwendungsfälle nicht viel Sinn macht. Daten können aktualisiert werden, wenn sich der Benutzer im nächsten Mal anmeldet und zurück anmeldet. Abhängig von den Bedürfnissen kann dies jedoch einfach hier erfolgen. Beachten Sie zwar die Auswirkungen auf die Leistung und die Kosten vieler API -Aufrufe bei userApp.io.

Und im Grunde ist das der Kern unserer Authentifizierungslogik.

Die Benutzerklasse

Erstellen wir auch die UserAppuser -Klasse, über die wir früher gesprochen haben:

<span><span><?php
</span></span><span>
</span><span><span>/**
</span></span><span><span> * <span>@file AppBundle\Security\UserAppAuthenticator.php
</span></span></span><span><span> */
</span></span><span>
</span><span><span>namespace AppBundle<span>\Security</span>;
</span></span><span>
</span><span><span>use Symfony<span>\Component\HttpFoundation\Request</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\Authentication\SimpleFormAuthenticatorInterface</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\Authentication\Token\TokenInterface</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\Exception\AuthenticationException</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\User\UserProviderInterface</span>;
</span></span><span><span>use UserApp<span>\API</span> as UserApp;
</span></span><span><span>use UserApp<span>\Exceptions\ServiceException</span>;
</span></span><span>
</span><span><span>class UserAppAuthenticator implements SimpleFormAuthenticatorInterface
</span></span><span><span>{
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>@var UserApp
</span></span></span><span><span>   */
</span></span><span>  <span>private $userAppClient;
</span></span><span>
</span><span>  <span>public function __construct(UserApp $userAppClient) {
</span></span><span>    <span>$this->userAppClient = $userAppClient;
</span></span><span>  <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>{@inheritdoc}
</span></span></span><span><span>   */
</span></span><span>  <span>public function authenticateToken(TokenInterface $token, UserProviderInterface $userProvider, $providerKey)
</span></span><span>  <span>{
</span></span><span>
</span><span>    <span>try {
</span></span><span>      <span>$login = $this->userAppClient->user->login(array(
</span></span><span>        <span>"login" => $token->getUsername(),
</span></span><span>        <span>"password" => $token->getCredentials(),
</span></span><span>        <span>)
</span></span><span>      <span>);
</span></span><span>
</span><span>      <span>// Load user from provider based on id
</span></span><span>      <span>$user = $userProvider->loadUserByLoginInfo($login);
</span></span><span>    <span>} catch(ServiceException $exception) {
</span></span><span>      <span>if ($exception->getErrorCode() == 'INVALID_ARGUMENT_LOGIN' || $exception->getErrorCode() == 'INVALID_ARGUMENT_PASSWORD') {
</span></span><span>        <span>throw new AuthenticationException('Invalid username or password');
</span></span><span>      <span>}
</span></span><span>      <span>if ($exception->getErrorCode() == 'INVALID_ARGUMENT_APP_ID') {
</span></span><span>        <span>throw new AuthenticationException('Invalid app ID');
</span></span><span>      <span>}
</span></span><span>    <span>}
</span></span><span>    <span>return new UserAppToken(
</span></span><span>      <span>$user,
</span></span><span>      <span>$user->getToken(),
</span></span><span>      <span>$providerKey,
</span></span><span>      <span>$user->getRoles()
</span></span><span>    <span>);
</span></span><span>  <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>{@inheritdoc}
</span></span></span><span><span>   */
</span></span><span>  <span>public function supportsToken(TokenInterface $token, $providerKey)
</span></span><span>  <span>{
</span></span><span>    <span>return $token instanceof UserAppToken
</span></span><span>    <span>&& $token->getProviderKey() === $providerKey;
</span></span><span>  <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>{@inheritdoc}
</span></span></span><span><span>   */
</span></span><span>  <span>public function createToken(Request $request, $username, $password, $providerKey)
</span></span><span>  <span>{
</span></span><span>    <span>return new UserAppToken($username, $password, $providerKey);
</span></span><span>  <span>}
</span></span><span><span>}</span></span>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Nichts Besonderes hier, wir machen nur einige Daten von userApp.io ab und implementieren einige der von der Schnittstelle erforderlichen Methoden. Zusätzlich haben wir den gesperrten/entsperrten Flagger hinzugefügt.

logout

Die letzte Klasse, die wir erstellen müssen, ist diejenige, die sich mit der Protokollierung des Benutzers von userApp.io befasst, wenn sie sich von Symfony anmelden.

<span><span><?php
</span></span><span>
</span><span><span>/**
</span></span><span><span> * <span>@file AppBundle\Security\UserAppToken.php
</span></span></span><span><span> */
</span></span><span>
</span><span><span>namespace AppBundle<span>\Security</span>;
</span></span><span>
</span><span><span>use Symfony<span>\Component\Security\Core\Authentication\Token\UsernamePasswordToken</span>;
</span></span><span>
</span><span><span>class UserAppToken extends UsernamePasswordToken {
</span></span><span>
</span><span><span>}</span></span>
Nach dem Login kopieren
Nach dem Login kopieren

Hier injizieren wir den userApp.io -PHP -Client und da wir das LogoutHerDerInterface implementieren, müssen wir über eine mental () -Methode () verfügen. Alles, was wir darin tun, ist, den Benutzer von userApp.io abzumelden, wenn er noch angemeldet ist.

alles verdrahtet

Jetzt, da wir unsere Klassen haben, ist es an der Zeit, sie als Dienste zu erklären und in unserem Authentifizierungssystem zu nutzen. Hier sind unsere YML -basierten Serviceerklärungen:

<span><span><?php
</span></span><span>
</span><span><span>/**
</span></span><span><span> * <span>@file AppBundle\Security\UserAppProvider.php
</span></span></span><span><span> */
</span></span><span>
</span><span><span>namespace AppBundle<span>\Security</span>;
</span></span><span>
</span><span><span>use Symfony<span>\Component\Security\Core\Exception\AuthenticationException</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\Exception\UsernameNotFoundException</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\User\UserProviderInterface</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\User\UserInterface</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\Exception\UnsupportedUserException</span>;
</span></span><span><span>use UserApp<span>\API</span> as UserApp;
</span></span><span><span>use UserApp<span>\Exceptions\ServiceException</span>;
</span></span><span><span>use AppBundle<span>\Security\Exception\NoUserRoleException</span>;
</span></span><span><span>use AppBundle<span>\Security\UserAppUser</span>;
</span></span><span>
</span><span><span>class UserAppProvider implements UserProviderInterface
</span></span><span><span>{
</span></span><span>  <span>/**
</span></span><span><span>   * <span>@var UserApp
</span></span></span><span><span>   */
</span></span><span>  <span>private $userAppClient;
</span></span><span>
</span><span>  <span>public function __construct(UserApp $userAppClient) {
</span></span><span>    <span>$this->userAppClient = $userAppClient;
</span></span><span>  <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>{@inheritdoc}
</span></span></span><span><span>   */
</span></span><span>  <span>public function loadUserByUsername($username)
</span></span><span>  <span>{
</span></span><span>    <span>// Empty for now
</span></span><span>  <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>{@inheritdoc}
</span></span></span><span><span>   */
</span></span><span>  <span>public function refreshUser(UserInterface $user)
</span></span><span>  <span>{
</span></span><span>    <span>if (!$user instanceof UserAppUser) {
</span></span><span>      <span>throw new UnsupportedUserException(
</span></span><span>        <span>sprintf('Instances of "%s" are not supported.', get_class($user))
</span></span><span>      <span>);
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>try {
</span></span><span>      <span>$api = $this->userAppClient;
</span></span><span>      <span>$api->setOption('token', $user->getToken());
</span></span><span>      <span>$api->token->heartbeat();
</span></span><span>      <span>$user->unlock();
</span></span><span>    <span>}
</span></span><span>    <span>catch (ServiceException $exception) {
</span></span><span>      <span>if ($exception->getErrorCode() == 'INVALID_CREDENTIALS') {
</span></span><span>        <span>throw new AuthenticationException('Invalid credentials');
</span></span><span>      <span>}
</span></span><span>      <span>if ($exception->getErrorCode() == 'AUTHORIZATION_USER_LOCKED') {
</span></span><span>        <span>$user->lock();
</span></span><span>      <span>}
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>return $user;
</span></span><span>  <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>{@inheritdoc}
</span></span></span><span><span>   */
</span></span><span>  <span>public function supportsClass($class)
</span></span><span>  <span>{
</span></span><span>    <span>return $class === 'AppBundle\Security\UserAppUser';
</span></span><span>  <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   *
</span></span><span><span>   * Loads a user from UserApp.io based on a successful login response.
</span></span><span><span>   *
</span></span><span><span>   * <span>@param $login
</span></span></span><span><span>   * <span>@return UserAppUser
</span></span></span><span><span>   * <span>@throws NoUserRoleException
</span></span></span><span><span>   */
</span></span><span>  <span>public function loadUserByLoginInfo($login) {
</span></span><span>
</span><span>    <span>try {
</span></span><span>      <span>$api = $this->userAppClient;
</span></span><span>      <span>$api->setOption('token', $login->token);
</span></span><span>      <span>$users = $api->user->get();
</span></span><span>    <span>} catch(ServiceException $exception) {
</span></span><span>      <span>if ($exception->getErrorCode() == 'INVALID_ARGUMENT_USER_ID') {
</span></span><span>        <span>throw new UsernameNotFoundException(sprintf('User with the id "%s" not found.', $login->user_id));
</span></span><span>      <span>}
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>if (!empty($users)) {
</span></span><span>      <span>return $this->userFromUserApp($users[0], $login->token);
</span></span><span>    <span>}
</span></span><span>  <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * Creates a UserAppUser from a user response from UserApp.io
</span></span><span><span>   *
</span></span><span><span>   * <span>@param $user
</span></span></span><span><span>   * <span>@param $token
</span></span></span><span><span>   * <span>@return UserAppUser
</span></span></span><span><span>   * <span>@throws NoUserRoleException
</span></span></span><span><span>   */
</span></span><span>  <span>private function userFromUserApp($user, $token) {
</span></span><span>
</span><span>    <span>$roles = $this->extractRolesFromPermissions($user);
</span></span><span>
</span><span>    <span>$options = array(
</span></span><span>      <span>'id' => $user->user_id,
</span></span><span>      <span>'username' => $user->login,
</span></span><span>      <span>'token' => $token,
</span></span><span>      <span>'firstName' => $user->first_name,
</span></span><span>      <span>'lastName' => $user->last_name,
</span></span><span>      <span>'email' => $user->email,
</span></span><span>      <span>'roles' => $roles,
</span></span><span>      <span>'properties' => $user->properties,
</span></span><span>      <span>'features' => $user->features,
</span></span><span>      <span>'permissions' => $user->permissions,
</span></span><span>      <span>'created' => $user->created_at,
</span></span><span>      <span>'locked' => !empty($user->locks),
</span></span><span>      <span>'last_logged_in' => $user->last_login_at,
</span></span><span>      <span>'last_heartbeat' => time(),
</span></span><span>    <span>);
</span></span><span>
</span><span>    <span>return new UserAppUser($options);  
</span></span><span> <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * Extracts the roles from the permissions list of a user
</span></span><span><span>   *
</span></span><span><span>   * <span>@param $user
</span></span></span><span><span>   * <span>@return <span>array</span>
</span></span></span><span><span>   * <span>@throws NoUserRoleException
</span></span></span><span><span>   */
</span></span><span>  <span>private function extractRolesFromPermissions($user) {
</span></span><span>    <span>$permissions = get_object_vars($user->permissions);
</span></span><span>    <span>if (empty($permissions)) {
</span></span><span>      <span>throw new NoUserRoleException('There are no roles set up for your users.');
</span></span><span>    <span>}
</span></span><span>    <span>$roles = array();
</span></span><span>    <span>foreach ($permissions as $role => $permission) {
</span></span><span>      <span>if ($permission->value === TRUE) {
</span></span><span>        <span>$roles[] = $role;
</span></span><span>      <span>}
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>if (empty($roles)) {
</span></span><span>      <span>throw new NoUserRoleException('This user has no roles enabled.');
</span></span><span>    <span>}
</span></span><span>
</span><span>    <span>return $roles;
</span></span><span>  <span>}
</span></span><span><span>}</span></span>
Nach dem Login kopieren
Nach dem Login kopieren

Die erste ist die userApp.io -PHP -Bibliothek, an die wir unsere Anwendungs ​​-ID in Form eines Verweiss auf einen Parameter übergeben. Sie benötigen einen Parameter namens userApp_id mit Ihrer userApp.io -App -ID.

Die anderen drei sind der Formular Authenticator, Benutzeranbieter und Abmeldungsklassen, die wir zuvor geschrieben haben. Und wie Sie sich erinnern, akzeptiert jeder einen Parameter in seinem Konstruktor in Form des als ersten Dienstes definierten userApp.io -Clients.

Nächst

  1. Fügen Sie unter der Taste der Anbieter Folgendes hinzu:

    <span><span><?php
    </span></span><span>
    </span><span><span>/**
    </span></span><span><span> * <span>@file AppBundle\Security\Exception\NoUserRoleException.php
    </span></span></span><span><span> */
    </span></span><span>
    </span><span><span>namespace AppBundle<span>\Security\Exception</span>;
    </span></span><span>
    </span><span><span>class NoUserRoleException extends <span>\Exception</span> {
    </span></span><span>
    </span><span><span>}</span></span>
    Nach dem Login kopieren
    Hier geben wir an, dass unsere Anwendung auch diesen Benutzeranbieter hat, damit er sie verwenden kann.

  2. Fügen Sie unter der Firewall -Taste Folgendes hinzu:

<span><span><?php
</span></span><span>
</span><span><span>/**
</span></span><span><span> * <span>@file AppBundle\Security\UserAppAuthenticator.php
</span></span></span><span><span> */
</span></span><span>
</span><span><span>namespace AppBundle<span>\Security</span>;
</span></span><span>
</span><span><span>use Symfony<span>\Component\HttpFoundation\Request</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\Authentication\SimpleFormAuthenticatorInterface</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\Authentication\Token\TokenInterface</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\Exception\AuthenticationException</span>;
</span></span><span><span>use Symfony<span>\Component\Security\Core\User\UserProviderInterface</span>;
</span></span><span><span>use UserApp<span>\API</span> as UserApp;
</span></span><span><span>use UserApp<span>\Exceptions\ServiceException</span>;
</span></span><span>
</span><span><span>class UserAppAuthenticator implements SimpleFormAuthenticatorInterface
</span></span><span><span>{
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>@var UserApp
</span></span></span><span><span>   */
</span></span><span>  <span>private $userAppClient;
</span></span><span>
</span><span>  <span>public function __construct(UserApp $userAppClient) {
</span></span><span>    <span>$this->userAppClient = $userAppClient;
</span></span><span>  <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>{@inheritdoc}
</span></span></span><span><span>   */
</span></span><span>  <span>public function authenticateToken(TokenInterface $token, UserProviderInterface $userProvider, $providerKey)
</span></span><span>  <span>{
</span></span><span>
</span><span>    <span>try {
</span></span><span>      <span>$login = $this->userAppClient->user->login(array(
</span></span><span>        <span>"login" => $token->getUsername(),
</span></span><span>        <span>"password" => $token->getCredentials(),
</span></span><span>        <span>)
</span></span><span>      <span>);
</span></span><span>
</span><span>      <span>// Load user from provider based on id
</span></span><span>      <span>$user = $userProvider->loadUserByLoginInfo($login);
</span></span><span>    <span>} catch(ServiceException $exception) {
</span></span><span>      <span>if ($exception->getErrorCode() == 'INVALID_ARGUMENT_LOGIN' || $exception->getErrorCode() == 'INVALID_ARGUMENT_PASSWORD') {
</span></span><span>        <span>throw new AuthenticationException('Invalid username or password');
</span></span><span>      <span>}
</span></span><span>      <span>if ($exception->getErrorCode() == 'INVALID_ARGUMENT_APP_ID') {
</span></span><span>        <span>throw new AuthenticationException('Invalid app ID');
</span></span><span>      <span>}
</span></span><span>    <span>}
</span></span><span>    <span>return new UserAppToken(
</span></span><span>      <span>$user,
</span></span><span>      <span>$user->getToken(),
</span></span><span>      <span>$providerKey,
</span></span><span>      <span>$user->getRoles()
</span></span><span>    <span>);
</span></span><span>  <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>{@inheritdoc}
</span></span></span><span><span>   */
</span></span><span>  <span>public function supportsToken(TokenInterface $token, $providerKey)
</span></span><span>  <span>{
</span></span><span>    <span>return $token instanceof UserAppToken
</span></span><span>    <span>&& $token->getProviderKey() === $providerKey;
</span></span><span>  <span>}
</span></span><span>
</span><span>  <span>/**
</span></span><span><span>   * <span>{@inheritdoc}
</span></span></span><span><span>   */
</span></span><span>  <span>public function createToken(Request $request, $username, $password, $providerKey)
</span></span><span>  <span>{
</span></span><span>    <span>return new UserAppToken($username, $password, $providerKey);
</span></span><span>  <span>}
</span></span><span><span>}</span></span>
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren
Nach dem Login kopieren

Was hier passiert, ist, dass wir einen einfachen sicheren Bereich definieren, der die Authentifizierungstyp von Simple_form mit unserem Authentikator verwendet. Unter dem Abmeldetaste fügen wir einen Handler hinzu, der aufgerufen werden soll (unsere als Dienstleistung definierte Benutzeranplout -Klasse). Der Rest ist ein regelmäßiges Symfony Security -Setup. Stellen Sie also sicher, dass auf der Anmelderoute ein Anmeldeformular angezeigt wird. Weitere Informationen finden Sie in der Dokumentation.

Und das ist alles. Durch die Verwendung der Simple_Form -Authentifizierung mit unserem benutzerdefinierten Formular Authenticator und Benutzeranbieter (zusammen mit einem optionalen Abmeldungshandler) haben wir unseren eigenen Symfony -Authentifizierungsmechanismus von UserApp.io implementiert.

Schlussfolgerung

In diesem Artikel haben wir gesehen, wie eine benutzerdefinierte Symfony -Formauthentifizierung mit dem UserApp.io -Dienst und API als Benutzeranbieter implementiert werden kann. Wir haben eine Menge Code durchgemacht, was eine sehr kurze Erklärung des Code selbst bedeutete. Vielmehr habe ich versucht, den Authentifizierungsprozess mit Symfony zu erklären, indem ich eine benutzerdefinierte Lösung erstellt, die die Art und Weise berücksichtigt, wie wir mit userApp.io interagieren können.

Wenn Sie diese Methode in Ihrem Bundle befolgt und implementiert haben und sie so verwenden möchten, machen Sie weiter. Sie haben auch die Möglichkeit, die von mir erstellte Bibliothek zu verwenden, die ein sehr schnelles und einfaches Setup auf der GitHub -Seite enthält. Ich empfehle letztere, da ich vorhabe, sie zu entwickeln und zu pflegen, damit Sie immer eine aktualisierte Version erhalten, wenn Fehler entfernt oder Funktionen eingeführt werden (hoffe nicht umgekehrt).

Wenn Sie dazu beitragen möchten, sind Sie sehr willkommen. Ich schätze es auch, mich wissen zu lassen, wenn Sie Probleme finden oder glauben, dass es bessere Möglichkeiten gibt, ähnliche Ziele zu erreichen.

häufig gestellte Fragen (FAQs) zur Benutzerauthentifizierung mit Symfony2 und userApp.io

Wie kann ich userApp.io in Symfony2 für die Benutzerauthentifizierung integrieren? Zunächst müssen Sie die UserApp -Bibliothek mit Composer installieren. Anschließend müssen Sie den UserApp -Dienst in Ihrem Symfony2 -Projekt konfigurieren. Dabei wird der UserApp -API -Schlüssel eingerichtet und den UserApp -Dienst in der Datei dienste.yml konfiguriert. Danach können Sie den UserApp -Dienst in Ihren Controllern verwenden, um Benutzer zu authentifizieren. Vorteile für die Benutzerauthentifizierung in Symfony2. Es vereinfacht den Prozess der Benutzerverwaltung, indem eine vorbereitete Lösung für die Benutzerauthentifizierung, Registrierung, Zurücksetzen des Kennworts und vieles mehr bereitgestellt wird. Es bietet auch eine sichere und skalierbare Lösung für die Benutzerauthentifizierung, die für groß angelegte Anwendungen sehr vorteilhaft sein kann.

Wie kann ich Benutzerrollen und Berechtigungen mit userApp.io in Symfony2? Sie können verschiedene Rollen definieren und sie den Benutzern zuweisen. Anschließend können Sie die Rolle des Benutzers in Ihren Symfony2 -Controllern überprüfen, um den Zugriff auf verschiedene Teile Ihrer Anwendung zu steuern. Bietet eine Funktion „Benutzerregistrierung“, mit der Sie die Benutzerregistrierung in Ihrer Symfony2 -Anwendung verarbeiten können. Sie können den UserApp -Dienst in Ihren Controllern verwenden, um neue Benutzer zu registrieren. Der UserApp -Dienst wird den Registrierungsprozess behandelt, einschließlich der Validierung des Benutzers und des Kennworts des Benutzers und Erstellen eines neuen Benutzerkontos. .IO bietet eine Funktion namens „Kennwortreset“, mit der Sie in Ihrer Symfony2 -Anwendung das Zurücksetzen des Kennworts behandeln können. Sie können den UserApp -Dienst in Ihren Controllern verwenden, um das Kennwort eines Benutzers zurückzusetzen. Der UserApp -Dienst wird den Vorgang des Kennworts zurücksetzen, einschließlich des Sendens einer E -Mail -Reset -E -Mail an das Benutzer an den Benutzer. Eine Funktion namens "Fehlerbehandlung", mit der Sie Benutzerauthentifizierungsfehler in Ihrer Symfony2 -Anwendung behandeln können. Sie können den UserApp -Dienst in Ihren Controllern verwenden, um Authentifizierungsfehler zu fangen und zu behandeln. Der UserApp -Dienst enthält detaillierte Fehlermeldungen, mit denen Sie Authentifizierungsprobleme debuggen und beheben können. Eine Reihe von Anpassungsoptionen für den Benutzerauthentifizierungsprozess. Sie können das Anmeldeformular, das Registrierungsformular, das Passwort -Reset -Formular und mehr anpassen. Sie können den Benutzerauthentifizierungsprozess auch anpassen, indem Sie dem Benutzerprofil benutzerdefinierte Felder hinzufügen oder benutzerdefinierte Authentifizierungslogik implementieren. IO bietet eine Reihe von Sicherheitsfunktionen, mit denen Sie Ihre Symfony2 -Anwendung sichern können. Es bietet eine sichere Benutzerauthentifizierung, ein sicherer Kennwortspeicher und eine sichere Benutzerverwaltung. Es bietet auch Funktionen wie zwei-Faktor-Authentifizierung und IP-Whitelisting, die die Sicherheit Ihrer Anwendung weiter verbessern können. .IO bietet eine Funktion namens „Datenmigration“, mit der Sie Ihre vorhandenen Benutzerdaten auf userApp.io migrieren können. Sie können die UserApp -API verwenden, um Ihre vorhandenen Benutzerdaten in userApp.io zu importieren. Die UserApp -API bietet eine Reihe von Endpunkten, mit denen Sie Benutzerdaten importieren können, einschließlich Benutzerprofile, Benutzerrollen und Benutzerberechtigungen.

Wie kann ich Probleme mit userApp.io in symfony2? Es bietet detaillierte Fehlermeldungen, Protokollierung und Debugging -Tools. Sie können auch die UserApp -API verwenden, um Probleme mit dem UserApp -Dienst zu beheben. Die UserApp -API bietet eine Reihe von Endpunkten, mit denen Sie Probleme mit dem UserApp -Dienst debuggen und beheben können.

Das obige ist der detaillierte Inhalt vonBenutzerauthentifizierung in Symfony2 mit userApp.io. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Erklären Sie JSON Web Tokens (JWT) und ihren Anwendungsfall in PHP -APIs. Erklären Sie JSON Web Tokens (JWT) und ihren Anwendungsfall in PHP -APIs. Apr 05, 2025 am 12:04 AM

JWT ist ein offener Standard, der auf JSON basiert und zur sicheren Übertragung von Informationen zwischen Parteien verwendet wird, hauptsächlich für die Identitätsauthentifizierung und den Informationsaustausch. 1. JWT besteht aus drei Teilen: Header, Nutzlast und Signatur. 2. Das Arbeitsprinzip von JWT enthält drei Schritte: Generierung von JWT, Überprüfung von JWT und Parsingnayload. 3. Bei Verwendung von JWT zur Authentifizierung in PHP kann JWT generiert und überprüft werden, und die Funktionen und Berechtigungsinformationen der Benutzer können in die erweiterte Verwendung aufgenommen werden. 4. Häufige Fehler sind Signaturüberprüfungsfehler, Token -Ablauf und übergroße Nutzlast. Zu Debugging -Fähigkeiten gehört die Verwendung von Debugging -Tools und Protokollierung. 5. Leistungsoptimierung und Best Practices umfassen die Verwendung geeigneter Signaturalgorithmen, das Einstellen von Gültigkeitsperioden angemessen.

Wie funktioniert die Session -Entführung und wie können Sie es in PHP mildern? Wie funktioniert die Session -Entführung und wie können Sie es in PHP mildern? Apr 06, 2025 am 12:02 AM

Die Hijacking der Sitzung kann in den folgenden Schritten erreicht werden: 1. Erhalten Sie die Sitzungs -ID, 2. Verwenden Sie die Sitzungs -ID, 3. Halten Sie die Sitzung aktiv. Zu den Methoden zur Verhinderung der Sitzung der Sitzung in PHP gehören: 1. Verwenden Sie die Funktion Session_regenerate_id (), um die Sitzungs -ID zu regenerieren. 2. Store -Sitzungsdaten über die Datenbank, 3. Stellen Sie sicher, dass alle Sitzungsdaten über HTTPS übertragen werden.

Beschreiben Sie die soliden Prinzipien und wie sie sich für die PHP -Entwicklung anwenden. Beschreiben Sie die soliden Prinzipien und wie sie sich für die PHP -Entwicklung anwenden. Apr 03, 2025 am 12:04 AM

Die Anwendung des soliden Prinzips in der PHP -Entwicklung umfasst: 1. Prinzip der Einzelverantwortung (SRP): Jede Klasse ist nur für eine Funktion verantwortlich. 2. Open and Close Principle (OCP): Änderungen werden eher durch Erweiterung als durch Modifikation erreicht. 3.. Lischs Substitutionsprinzip (LSP): Unterklassen können Basisklassen ersetzen, ohne die Programmgenauigkeit zu beeinträchtigen. 4. Schnittstellen-Isolationsprinzip (ISP): Verwenden Sie feinkörnige Schnittstellen, um Abhängigkeiten und nicht verwendete Methoden zu vermeiden. 5. Abhängigkeitsinversionsprinzip (DIP): Hoch- und niedrige Module beruhen auf der Abstraktion und werden durch Abhängigkeitsinjektion implementiert.

Was sind Aufzählungen (Enums) in PHP 8.1? Was sind Aufzählungen (Enums) in PHP 8.1? Apr 03, 2025 am 12:05 AM

Die Aufzählungsfunktion in Php8.1 verbessert die Klarheit und Type des Codes, indem benannte Konstanten definiert werden. 1) Aufzählungen können Ganzzahlen, Zeichenfolgen oder Objekte sein, die die Lesbarkeit der Code und die Type der Type verbessern. 2) Die Aufzählung basiert auf der Klasse und unterstützt objektorientierte Merkmale wie Traversal und Reflexion. 3) Die Aufzählung kann zum Vergleich und zur Zuordnung verwendet werden, um die Sicherheit der Typ zu gewährleisten. 4) Aufzählung unterstützt das Hinzufügen von Methoden zur Implementierung einer komplexen Logik. 5) Strenge Typ Überprüfung und Fehlerbehandlung können häufig auftretende Fehler vermeiden. 6) Die Aufzählung verringert den magischen Wert und verbessert die Wartbarkeit, achten Sie jedoch auf die Leistungsoptimierung.

Wie debugge ich den CLI -Modus in PhpStorm? Wie debugge ich den CLI -Modus in PhpStorm? Apr 01, 2025 pm 02:57 PM

Wie debugge ich den CLI -Modus in PhpStorm? Bei der Entwicklung mit PHPSTORM müssen wir manchmal den PHP im CLI -Modus (COMS -Zeilenschnittstellen) debuggen ...

Wie setze ich nach dem Neustart des Systems automatisch Berechtigungen von Unixsocket fest? Wie setze ich nach dem Neustart des Systems automatisch Berechtigungen von Unixsocket fest? Mar 31, 2025 pm 11:54 PM

So setzen Sie die Berechtigungen von Unixsocket automatisch nach dem Neustart des Systems. Jedes Mal, wenn das System neu startet, müssen wir den folgenden Befehl ausführen, um die Berechtigungen von Unixsocket: sudo ...

Erklären Sie die späte statische Bindung in PHP (statisch: :). Erklären Sie die späte statische Bindung in PHP (statisch: :). Apr 03, 2025 am 12:04 AM

Statische Bindung (statisch: :) implementiert die späte statische Bindung (LSB) in PHP, sodass das Aufrufen von Klassen in statischen Kontexten anstatt Klassen zu definieren. 1) Der Analyseprozess wird zur Laufzeit durchgeführt.

See all articles