Symfony: зарегистрируйте пользователя, если у него еще нет учетной записи с аутентификацией LDAP - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть сервер LDAP и приложение Symfony.Приложение будет подключаться к LDAP и аутентифицировать пользователя по LDAP.Если аутентификация прошла успешно, остальные пользовательские данные будут загружены из локальной базы данных приложений на основе MySQL.

Проблема возникает при первом входе пользователя в систему.Они имеют свою идентичность в LDAP, и это может быть подтверждено во время входа в систему, но их пользователь еще не создан в базе данных приложения Symfony.Я хотел бы создать нового пользователя с некоторой информацией по умолчанию при возникновении такой ситуации.

Я пока не нашел никакого способа сделать это, поэтому я открыт для любых предложений.

1 Ответ

0 голосов
/ 22 февраля 2019

Пример пользовательского провайдера, который будет регистрировать новых пользователей, если он аутентифицирован из LDAP и не существует в базе данных.

    <?php
// src/Security/UserProvider.php
namespace App\Security;

use Symfony\Component\Security\Core\Exception\UnsupportedUserException;
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException;
use Symfony\Component\Security\Core\User\UserInterface;
use Symfony\Component\Security\Core\User\UserProviderInterface;
use App\Entity\User;
use Doctrine\ORM\EntityManagerInterface;

class UserProvider implements UserProviderInterface
{
    private $em;

    public function __construct(EntityManagerInterface $em)
    {
        $this->em = $em;
    }

    /**
     * Symfony calls this method if you use features like switch_user
     * or remember_me.
     *
     * If you're not using these features, you do not need to implement
     * this method.
     *
     * @return UserInterface
     *
     * @throws UsernameNotFoundException if the user is not found
     */
    public function loadUserByUsername($username)
    {
        $em = $this->em;
        $user = $em->getRepository(User::class)->findOneBy(array('username' => $username));
        if ($user) {
            return $user;
        }

        $user = new User();
        $user->setUsername($username);
        $em->persist($user);
        $em->flush();

        return $user;
        // Load a User object from your data source or throw UsernameNotFoundException.
        // The $username argument may not actually be a username:
        // it is whatever value is being returned by the getUsername()
        // method in your User class.
        //throw new \Exception('TODO: fill in loadUserByUsername() inside '.__FILE__);
    }

    /**
     * Refreshes the user after being reloaded from the session.
     *
     * When a user is logged in, at the beginning of each request, the
     * User object is loaded from the session and then this method is
     * called. Your job is to make sure the user's data is still fresh by,
     * for example, re-querying for fresh User data.
     *
     * If your firewall is "stateless: false" (for a pure API), this
     * method is not called.
     *
     * @return UserInterface
     */
    public function refreshUser(UserInterface $user)
    {
        if (!$user instanceof User) {
            throw new UnsupportedUserException(sprintf('Invalid user class "%s".', get_class($user)));
        }

        if (!$refreshedUser = $this->em->getRepository(User::class)->find($user->getId())) {
            throw new UsernameNotFoundException(sprintf('User with id %s not found', json_encode($user->getId())));
        }

        return $refreshedUser;
    }

    /**
     * Tells Symfony to use this provider for this User class.
     */
    public function supportsClass($class)
    {
        return User::class === $class;
    }
}

Вам также необходимо настроить security.yml для использования этого провайдера

providers:
# used to reload user from session & other features (e.g. switch_user)
  app_user_provider:
    id: App\Security\UserProvider
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...