国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

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>

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>
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>
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>

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>

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>

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>

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>
    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>

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

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

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.

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)

Hei?e Themen

PHP-Tutorial
1488
72
Variabler PHP -Bereich erkl?rt Variabler PHP -Bereich erkl?rt Jul 17, 2025 am 04:16 AM

H?ufige Probleme und L?sungen für den variablen PHP -Umfang umfassen: 1. Die globale Variable kann innerhalb der Funktion nicht zugegriffen werden, und sie muss bei der Verwendung des globalen Schlüsselworts oder Parameters übergeben werden. 2. Die statische Variable wird statisch deklariert und nur einmal initialisiert und der Wert wird zwischen mehreren Aufrufen beibehalten. 3.. Hyperglobale Variablen wie $ _get und $ _post k?nnen direkt in jedem Bereich verwendet werden, aber Sie müssen auf eine sichere Filterung achten. 4. Die anonymen Funktionen müssen über das Schlüsselwort verwenden, und wenn Sie externe Variablen ?ndern, müssen Sie eine Referenz übergeben. Das Beherrschen dieser Regeln kann dazu beitragen, Fehler zu vermeiden und die Code -Stabilit?t zu verbessern.

Wie behandle ich Datei -Uploads sicher in PHP? Wie behandle ich Datei -Uploads sicher in PHP? Jul 08, 2025 am 02:37 AM

Um PHP -Datei -Uploads sicher zu verarbeiten, müssen Sie die Quelle und die Type und die Eingabe des Dateinamens und des Pfades überprüfen, Serverbeschr?nkungen festlegen und Mediendateien zweimal verarbeiten. 1. überprüfen Sie die Upload -Quelle, um CSRF durch Token zu verhindern, und erkennen Sie den realen MIME -Typ über die Finfo_file mithilfe der Whitelist -Steuerung. 2. Benennen Sie die Datei in eine zuf?llige Zeichenfolge um und bestimmen Sie die Erweiterung, um sie gem?? dem Erkennungstyp in einem Verzeichnis ohne Web zu speichern. 3. Die PHP -Konfiguration begrenzt die Hochladengr??e und das tempor?re Verzeichnis Nginx/Apache verbietet den Zugriff auf das Upload -Verzeichnis. 4. Die GD -Bibliothek stellt die Bilder neu, um potenzielle b?swillige Daten zu l?schen.

Code in PHP aus dem Code ausgehen Code in PHP aus dem Code ausgehen Jul 18, 2025 am 04:57 AM

Es gibt drei g?ngige Methoden für den PHP -Kommentarcode: 1. Verwenden Sie // oder #, um eine Codezeile zu blockieren, und es wird empfohlen, // zu verwenden. 2. Verwenden Sie /.../, um Codebl?cke mit mehreren Zeilen zu wickeln, die nicht verschachtelt werden k?nnen, aber gekreuzt werden k?nnen. 3.. Kombinationskenntnisse Kommentare wie die Verwendung / if () {} / Um Logikbl?cke zu steuern oder um die Effizienz mit Editor -Verknüpfungsschlüssel zu verbessern, sollten Sie auf die Schlie?ung von Symbolen achten und das Verschachteln bei der Verwendung vermeiden.

Wie arbeiten Generatoren in PHP? Wie arbeiten Generatoren in PHP? Jul 11, 2025 am 03:12 AM

AgneeratorinphpiSamemory-effizientes WaytoiterateOverlargedatasetsByyieldingValueatimeinsteadofReturningThemallatonce.1.GeneratorsusetheyieldKeywordtoproduktenvaluesonDemand, ReducingMemoryUsage.2.TheyareusefulforfulforfulfordlingBiglopploups, Lesebiglochen, Leselungen, Lesebigs, Leselung, oder

Tipps zum Schreiben von PHP -Kommentaren Tipps zum Schreiben von PHP -Kommentaren Jul 18, 2025 am 04:51 AM

Der Schlüssel zum Schreiben von PHP -Kommentaren liegt in der Kl?rung des Zwecks und der Spezifikationen. Kommentare sollten "Warum" und nicht "was getan" erkl?ren, um Redundanz oder zu Einfachheit zu vermeiden. 1. Verwenden Sie ein einheitliches Format wie Docblock (/*/) für Klassen- und Methodenbeschreibungen, um die Lesbarkeit und die Kompatibilit?t der Werkzeuge zu verbessern. 2. Betonen Sie die Gründe für die Logik, z. B. warum JS -Sprünge manuell ausgeben müssen. 3. Fügen Sie eine übersichtsbeschreibung vor komplexem Code hinzu, beschreiben Sie den Prozess in Schritten und helfen Sie, die Gesamtidee zu verstehen. V. Gute Anmerkungen k?nnen die Kommunikationskosten senken und die Effizienz der Code -Wartung verbessern.

So greifen Sie in einer Zeichenfolge nach Index in PHP auf ein Zeichen zu So greifen Sie in einer Zeichenfolge nach Index in PHP auf ein Zeichen zu Jul 12, 2025 am 03:15 AM

In PHP k?nnen Sie quadratische Klammern oder lockige Klammern verwenden, um Zeichenfolgenspezifikationsspezifische Indexzeichen zu erhalten, aber quadratische Klammern werden empfohlen. Der Index startet von 0 und der Zugriff au?erhalb des Bereichs gibt einen Nullwert zurück und kann keinen Wert zugewiesen; MB_SUBSTR ist erforderlich, um Multi-Byte-Zeichen zu verarbeiten. Zum Beispiel: $ str = "Hallo"; echo $ str [0]; Ausgabe H; und chinesische Zeichen wie Mb_Substr ($ str, 1,1) müssen das richtige Ergebnis erzielen. In den tats?chlichen Anwendungen sollte die L?nge der Zeichenfolge vor dem Schleifen überprüft werden, dynamische Zeichenfolgen müssen für die Gültigkeit verifiziert werden, und mehrsprachige Projekte empfehlen, Multi-Byte-Sicherheitsfunktionen einheitlich zu verwenden.

SchnellpHP -Installations -Tutorial SchnellpHP -Installations -Tutorial Jul 18, 2025 am 04:52 AM

Toinstallphpquickly, usexampponwindowsorhomebrewonmacos.1.onwindows, download undInstallxampp, SelectComponents, Startapache und PlaceFilesinhtdocscs.2.Anternativ, manuellinstallphpfrfr

PHP lernen: Ein Anf?ngerführer PHP lernen: Ein Anf?ngerführer Jul 18, 2025 am 04:54 AM

Tolearnphpeffectival, startbysettingupalocalerverenVironmentusexs -LikexamppandacodeeditorikevScode.1) InstallxamppForapache, MySQL und Php.SeacodeeditorForsyntaxSupport.3) testyourscludingveliktingveliktelaThbiliodble.Neclyble.NektFile

See all articles