我正在构建一个应该托管在公司服务器中并通过Intranet使用的webapp。要求是:
我正在使用Symfony3开发webapp,我想到使用FriendsOfSymfony用户包。我该如何实现这一目标? FOSUserBundle不是强制性的。
答案 0 :(得分:0)
您希望实现的登录功能与例如通过电子邮件重置密码。除了用例中的临时令牌用于验证用户,而不是验证密码重置。
一个非常简单的解释
您应该创建一个存储身份验证令牌的实体,例如AutoLogin
user
,token
和timestamp
属性。{/ p>
在提交“身份验证表单”后,新的AutoLogin
记录会与用户建立关系,并通过电子邮件通知用户。
每当用户点击链接时,您应该有一个方法来验证时间范围的时间戳,并由您的用户提供商对用户进行身份验证。
实施例
Symfony 2:AutoLogin
答案 1 :(得分:0)
我认为在您接受电子邮件后,您可以这样做:
将网址发送到这样的电子邮件
<?php
$url = "http://example.com/login.php?token=$token";
?>
然后登录页面
<?php
// retrieve token
if (isset($_GET["token"]) && preg_match('/^[0-9A-F]{40}$/i', $_GET["token"]))
{
$token = $_GET["token"];
}
else {
throw new Exception("Valid token not provided.");
}
// verify token
$query = $db->prepare("SELECT username, tstamp FROM pending_users WHERE token = ?");
$query->execute(array($token));
$row = $query->fetch(PDO::FETCH_ASSOC);
$query->closeCursor();
if ($row) {
extract($row);
}
else {
throw new Exception("Valid token not provided.");
}
// do action here, like activating a user account/redirect
// ...
// delete token so it can't be used again
$query = $db->prepare(
"DELETE FROM pending_users WHERE username = ? AND token = ? AND tstamp = ?",
);
$query->execute(
array(
$username,
$token,
$tstamp
)
);
假设您的表格与查询中的表格相似。希望我能回答你好
答案 2 :(得分:0)
有一项名为fos_user.security.login_manager
的服务可以提供帮助:
public function loginByTokenAction($token)
{
$em = $this->getDoctrine()->getManager();
$user = $em->getRepository('AppBundle:User')->findOneByToken($token);
$this->container->get('fos_user.security.login_manager')->loginUser('firewall_name', $user);
// ...
}