假设我有发票实体。发票属于某个用户(invoices.user_id)。
如果用户输入myapp.com/invoices/1,他需要登录才能访问他的发票。这很正常。
有时invoices.user_id是空的(发票所有者在我们的系统中没有帐户),但是我们有一个invoices.phone_number列。
我们的目标是为在我们系统中没有帐号的用户创建一个基于SMS代码验证的身份验证系统。如果用户确认他确实拥有与发票相关的电话号码(代码验证),我希望允许他临时访问此发票详细信息页面(15分钟)(只有此页)。
我的第一个想法是使用存储在会话中的JWT令牌。
我的第二个想法是使用自定义防火墙。
有什么更好的方法吗?
发布于 2018-08-01 14:25:44
发布于 2018-08-05 18:06:23
可以使用以下操作对虚拟用户进行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');
}https://stackoverflow.com/questions/51596032
复制相似问题