[英]Symfony3, set user last login date
我有一个简单的登录表单:
public function loginAction(Request $request)
{
$authenticationUtils = $this->get('security.authentication_utils');
// get the login error if there is one
$error = $authenticationUtils->getLastAuthenticationError();
// last username entered by the user
$lastUsername = $authenticationUtils->getLastUsername();
return $this->render(
'users/login.html.twig',
[
'page' => 'login',
'last_username' => $lastUsername,
'error' => $error,
]
);
}
security.yml:
secured_area:
form_login:
provider: user_db_provider
login_path: /login
check_path: /login
csrf_token_generator: security.csrf.token_manager
我正在尝试设置用户的上次登录时间。
我是否真的必须创建一个新的监听器并编写一个完整的类,就像这个答案一样 ,仅针对这条指令: $user->setLastLogin(new \\DateTime());
? 或者是否有更简单的东西,比如把它放在控制器中?
是的,您必须创建登录成功侦听器,如本答案中所述 ,并使用onAuthenticationSuccess
方法存储您的用户信息。
您发布的代码用于生成登录页面本身。 任何登录操作都由防火墙处理,防火墙调用成功或失败监听器。 您可以在自定义侦听器中执行代码(例如,设置上次成功登录timestsamp)。
原因是创建执行单个任务的类更好,而不是将大量代码放在一个类中。 这样可以保持代码的模块性,可扩展性和可维护性。
好吧,在Symfony 4我使用另一种方法,因为我的项目中没有FOSUserBundle而且我不喜欢使用onAuthenticationSuccess每次调用的原因
(..)注意 - 如果您有基于会话的身份验证(...),此事件(onAuthenticationSuccess)将在每个请求上触发
检查用户的身份验证(请参阅此安全身份验证部分 )。 我知道可以使用security.interactive_login
EventListener(更好的方法),但由于其他原因,我更喜欢上面的步骤。
所以我在SecurityController上创建了一个简单的路由来检查和更新User-> lastLogin属性。
// /config/packages/security.yaml
security:
firewalls:
main:
pattern: ^/
user_checker: App\Security\UserChecker
form_login:
provider: my_db_provider
login_path: login
check_path: login
always_use_default_target_path: true
default_target_path: check_last_login
csrf_token_generator: security.csrf.token_manager
这里, always_use_default_target_path: true
和default_target_path: check_last_login
是键always_use_default_target_path:true强制目标, check_last_login是实际用户登录时重定向的路由名称
// /src/Controller/SecurityController.php
/**
* @param Request $request
* @Route("/check-last-login", name="check_last_login")
* @param Request $request
* @return Response
*
*/
public function checkLastLogin(Request $request)
{
/* @var $user User */
if (!$user = $this->getUser()) {
// redirect to somewhere to show some message
throw new someAuthenticationException();
}
if ($user->getLastLogin() == null) {
// Do something when is the first login
return $this->redirectToRoute('complete-register');
}
$user->setLastLogin(new \DateTime());
$oManager = $this->getDoctrine()->getManager();
$oManager->persist($user);
$oManager->flush();
//
return $this->forward('App\Controller\DefaultController::index', array($request));
}
forward()可以替换为
// almost the time $providerKey is 'main' - see your firewalls entries
$providerKey = 'main';
$targetPath = $request->getSession()->get('_security.'.$providerKey.'.target_path');
$this->redirect($targetPath);
但请记住,这可能是注销路线 ,因此您需要避免成功登录,然后注销
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.