Heim > Backend-Entwicklung > PHP-Tutorial > Benutzerauthentifizierung in Symfony2 mit userApp.io

Benutzerauthentifizierung in Symfony2 mit userApp.io

Christopher Nolan
Freigeben: 2025-02-18 09:47:08
Original
475 Leute haben es durchsucht

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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage