有时, 作为使用Symfony 1.4构建的应用程序的管理员, 你可能需要访问用户帐户才能重现错误, 并检查在当前调试措施还不够的情况下为什么会出现故障。出于明显的原因, 如果你的系统不是私有的, 并且有很多用户, 则你将无法要求他们提供密码, 因为这显然侵犯了隐私权。相反, 应该牢记这一点来构建系统的逻辑。在其他情况下, 你会使用访问令牌, 例如在桌面应用程序中, 当在浏览器中打开Web网址时, 用户会自动登录, 这是你还需要了解如何登录的一种情况在不知道密码的情况下手动用户。
作为一个著名的框架, 尽管Symfony 1.4是旧版本, 但这些标准永远不会过时, 因此显然存在一种方法, 可以在不知道用户密码但只知道数据库中ID的情况下登录用户, 尤其是在用户行上的所有信息。 sf_guard_user表。在本文中, 我们将以一小段代码向你展示如何在几行代码中遵循这种行为。
注意
你可以在表中找到用户, 还可以使用其用户名, 电子邮件等, 而不是特定的ID。这里的重点是你提供sf_guard_user表的Doctrine对象。
例子
由于在每个项目中使用此逻辑的方式可能会有所不同, 因此我们将使用一个简单的PHP代码段来描述该逻辑在控制器(actions.class.php)文件中的工作方式。你可能要做的第一件事是注销当前用户(如果有的话)。接下来, 你需要找到用户对象, 特别是要从数据库中登录的对象。 sfGuard的登录方法需要一个包含你的用户实体的Doctrine对象, 这完全取决于你, 因为如上所述, 你可以通过其ID, 用户名, 电子邮件或其他自定义属性找到该用户。然后, 获得当前会话, 以将当前用户注销后获得当前用户(在这种情况下为空), 并调用提供2个必需参数的signin方法。第一个参数是你要登录的用户的” Doctrine用户对象”, 第二个参数是定义登录表单的”记住我”登录选项的布尔变量。通常, 当我们从控制器手动记录时, 应将其设置为false:
<?php
// 1. Close current session if there's any
$this->getUser()->signOut();
// 2. Obtain an user object to login
// The $userToLogin is a doctrine object of an user in the `sf_guard_user` table of the sfGuardPlugin
// so the logic of how to retrieve the user is up to you !
$userId = 1;
$userToLogin = Doctrine_Core::getTable('sfGuardUser')->find($userId);
// 3. Retrieve the session and force login of the providen user object
// the second argument indicated wheter the user should be remembered or not
// (usually false) if this is done manually
$this->getUser()->signin($userToLogin, false);
// Now you can redirect the user to some page where you want to !
$this->redirect('@homepage');
最后, 如图所示, 你可能希望根据用户的凭据将其重定向到另一个页面, 或者只是将其发送到已经为你执行此操作的控制器。
编码愉快!
评论前必须登录!
注册