Допустим, у меня есть счет-фактура. Счет принадлежит какому-то пользователю (invoices.user_id).
Если пользователь вводит myapp.com/invoices/1, ему необходимо войти в систему, чтобы получить доступ к своему счету. Это нормально.
Иногда invoices.user_id равен нулю (у владельца счета нет учетной записи в нашей системе), но у нас есть столбец invoices.phone_number.
Цель состоит в том, чтобы создать систему аутентификации на основе проверки кода SMS для пользователей, у которых нет учетной записи в нашей системе. Если пользователь подтверждает, что ему действительно принадлежит номер телефона, связанный со счетом (проверка кода), я хочу предоставить ему временный доступ (15 минут) к этой странице сведений о счете (и только к этой странице).
Моя первая идея состояла в том, чтобы использовать токен JWT, хранящийся в сеансе.
Моя вторая идея заключалась в использовании настраиваемого брандмауэра.
Есть ли лучший подход?
К сожалению, по требованиям проверка смс обязательна. Но все равно спасибо, я не знал, что такое URL с подписью!
Мне любопытно узнать, какова здесь цель; для подтверждения того, что аутентифицированный пользователь является тем, кем они себя называют, или для подтверждения того, что они настоящие люди? какие конкретные проблемы вы пытаетесь решить с помощью этого решения?
@WilliamPerron Я отредактировал вопрос. Должно быть кристально ясно, какова цель!
Вы используете JWT для остальной части вашей аутентификации и авторизации? Мне интересно, почему вы не можете использовать существующий механизм контроля доступа вашего приложения для аутентификации и управления доступом к этой странице. Я хотел сказать, что вместо входа в систему с идентификатором пользователя + пароль, пользователь войдет в систему, используя номер телефона + smscode, а затем вы войдете в систему в течение 15 минут.
@ so-random-dude проблема в том, что во втором случае в таблице пользователей нет пользователя. В некоторых случаях у меня есть только какой-то номер телефона, не связанный с каким-либо конкретным пользователем из таблицы пользователей. Вот почему существующий механизм не подходит. Очевидно, что этот номер телефона есть у какого-то человека, и поэтому я хотел бы предоставить ему доступ, даже если у него нет учетной записи в моей системе.






Создайте kernel.requestслушатель. Таким образом, вы можете действовать до того, как что-либо будет выполнено, и все приложение не обращает внимания на тот факт, что пользователь может выйти из системы в любую минуту.
Вызовите «службу», которая проверит токен. Если токен недействителен, очистите статус аутентификации и переопределите запрос. Например, перенаправьте пользователя на страницу «вам нужно снова заплатить».
Таким образом, вам не нужно изменять какой-либо код, выполнять голосование и т. д., Все ваше приложение может быть защищено.
Что касается самой аутентификации, выберите таможенная охрана, где вы можете полностью контролировать, как будет работать процесс аутентификации.
Хотя я решил это немного иначе, вы наставили меня на правильный путь. Я добавлю свое окончательное решение вопроса. Спасибо!
Рад помочь Камилю.
Вы можете аутентифицировать фиктивного пользователя в течение 15 минут, используя следующее действие:
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;
use Symfony\Component\Security\Http\Event\InteractiveLoginEvent;
public function indexAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
/**
* confirm that the user indeed owns
* phone number related to the invoice (code verification)
*/
//create a user for this task only and fetch it
$user = $em->getRepository(User::class)->find(1);
//firewall name used for authentication in security.yml
$firewall = "main_secured_area";
$token = new UsernamePasswordToken($user, null, $firewall, $user->getRoles());
$this->get('security.token_storage')->setToken($token);
$this->get('session')->set("_security_$firewall", serialize($token));
//$lifetime takes number of seconds to define session timeout 15min = 900sec
$this->container->get('session')->migrate($destroy = false, $lifetime = 900);
//fire the login event manually
$event = new InteractiveLoginEvent($request, $token);
$this->get("event_dispatcher")->dispatch("security.interactive_login", $event);
return $this->render('default/index.html.twig');
}
Кажется, вы ищете сценарий подписанного URL-адреса. Этот пакет может помочь: github.com/spatie/url-signer