Можно ли разрешить пользователям входить в Symfony по ссылке с секретным ключом? - PullRequest
4 голосов
/ 12 декабря 2011

Я хотел бы отправить всем своим пользователям по электронной почте ссылку на сайт Symfony, который я пишу, и сделать так, чтобы при переходе по этой ссылке они входили на сайт (вероятно, с особой ролью, напримерIS_AUTHENTICATED_REMEMBERED) и перенаправляется на определенную страницу.Как я могу это сделать?

Так что ссылка будет выглядеть примерно так:

http://example.com/?key=[some sort secret key with their account encoded in it]

Ответы [ 3 ]

2 голосов
/ 12 декабря 2011

Я бы сделал что-то вроде этого: сгенерировать ключ с помощью хеш-функции над именем пользователя. Затем отправьте им ссылку на http://example.com/?user= username &hash= the-hash-result.

В действии, которое получит этот URL, вы можете получить параметры запроса username и hash, применить ту же хеш-функцию к полученному вами имени пользователя и сравнить результат с хеш-ключом в параметрах запроса.

Если совпадение, просто установите соответствующие учетные данные для пользователя и зарегистрируйте его в

Давайте посмотрим код, в вашем классе аутентификации у вас должна быть функция для аутентификации пользователя с параметрами $user и $password. Здесь или расширяя этот класс, вы можете определить такую ​​функцию:

function authenticate($user,$hash-key){
    if(hashFunction($user) == $hash-key){
        $user->setAuthFunction(true);//sort of
    }
}

Надеюсь, это помогло вам!

1 голос
/ 13 декабря 2011

Не так просто реализовать, я могу вам сказать, но вы должны взглянуть на метод UsernamePasswordFormAuthenticationListener :: tryAuthentication ... Создайте свой собственный сервис для автоматического подтверждения аутентификации.

0 голосов
/ 15 декабря 2011

Вдохновленный этим сообщением и этим кодом, я написал контроллер, который получает пользователя из базы данных, проверяет секретный ключ, а затем подделывает маркер входа следующим образом:

$providerKey = 'secured_area'; // Name of firewall from security.yml - not sure this is correct.
$token = new UsernamePasswordToken($user, null, $providerKey, array('AUTO_LOGIN'));

$this->container->get('security.context')->setToken($token);

(вам нужно это вверху вашего файла)

use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...