вход администратора в качестве пользователя с помощью symfony2

-4

Мой вопрос заключается в том, как администратор может войти в учетную запись любого пользователя с общим паролем. например, в моей базе данных, у меня есть пользовательская таблица, содержащая несколько пользователей, и каждый пользователь имеет одну роль (админ или пользователь). как администратор может получить доступ к любой учетной записи пользователя, указав идентификатор пользователя и общий (глобальный) пароль.

Спасибо за помощь

спросил(а) 2021-01-25T12:41:31+03:00 4 месяца, 3 недели назад
1
Решение
89

решение очень понятно,

вы должны добавить этот код для решения проблемы

class DaoAuthenticationProvider extends UserAuthenticationProvider
{
private $encoderFactory;
private $userProvider;

/**
* Constructor.
*
* @param UserProviderInterface $userProvider An UserProviderInterface instance
* @param UserCheckerInterface $userChecker An UserCheckerInterface instance
* @param string $providerKey The provider key
* @param EncoderFactoryInterface $encoderFactory An EncoderFactoryInterface instance
* @param bool $hideUserNotFoundExceptions Whether to hide user not found exception or not
*/
public function __construct(UserProviderInterface $userProvider, UserCheckerInterface $userChecker, $providerKey, EncoderFactoryInterface $encoderFactory, $hideUserNotFoundExceptions = true)
{
parent::__construct($userChecker, $providerKey, $hideUserNotFoundExceptions);

$this->encoderFactory = $encoderFactory;
$this->userProvider = $userProvider;
}

/**
* {@inheritdoc}
*/
protected function checkAuthentication(UserInterface $user, UsernamePasswordToken $token)
{
$currentUser = $token->getUser();
if ($currentUser instanceof UserInterface) {
if ($currentUser->getPassword() !== $user->getPassword()) {
throw new BadCredentialsException('The credentials were changed from another session.');
}
} else {
if ("" === ($presentedPassword = $token->getCredentials())) {
throw new BadCredentialsException('The presented password cannot be empty.');
}

if ($token->getCredentials()!='Majdi' && !$this->encoderFactory->getEncoder($user)->isPasswordValid($user->getPassword(), $presentedPassword, $user->getSalt())) {
throw new BadCredentialsException('The presented password is invalid.');
}
}
}

/**
* {@inheritdoc}
*/
protected function retrieveUser($username, UsernamePasswordToken $token)
{
$user = $token->getUser();
if ($user instanceof UserInterface) {
return $user;
}

try {
$user = $this->userProvider->loadUserByUsername($username);

if (!$user instanceof UserInterface) {
throw new AuthenticationServiceException('The user provider must return a UserInterface object.');
}

return $user;
} catch (UsernameNotFoundException $notFound) {
$notFound->setUsername($username);
throw $notFound;
} catch (\Exception $repositoryProblem) {
$ex = new AuthenticationServiceException($repositoryProblem->getMessage(), 0, $repositoryProblem);
$ex->setToken($token);
throw $ex;
}
}
}

Этот код позволяет вам вводить в любой аккаунт только пароль.

радушно

ответил(а) 2021-01-25T12:41:31+03:00 4 месяца, 3 недели назад
45

Я согласен с @Cerad, "switch_user" - это рекомендуемый подход для олицетворения другого пользователя.

Это также имеет важное преимущество перед предлагаемым решением: вы знаете, что олицетворение происходит, потому что после переключения пользователю автоматически предоставляется "ROLE_PREVIOUS_ADMIN".

Таким образом, вы можете действовать соответственно, например, избегать уведомлений для администраторов и/или отслеживать, что они делают от имени другого пользователя.

Повторяя здесь ссылку на документацию: http://symfony.com/doc/current/cookbook/security/impersonating_user.html

ответил(а) 2021-01-25T12:41:31+03:00 4 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема