0

$message = '';

$authenticationUtils = $this->get('security.authentication_utils');
$error = $authenticationUtils->getLastAuthenticationError();
if (!empty($error)) {
    $message = $error->getMessage();
    if ($message == 'Bad credentials.') {
        $message = '您的账号和密码不匹配!' ;
    }
}

return $this->render('account/login.html.twig', array(
    'message' => $message,
));

这个问题已被关闭,原因:问题已解决 - 问题已解决,且对他人无借鉴意义

1个回答

0

在Symfony3中实现刷新登录时间、登录加1的功能需要自己写一个success handle。

简单讲一下创建success handle的流程,使用的环境如下
PHP版本:7.1.8
Symfony版本:3.3.5
默认管理员权限相关的Bundle名为AuthorizationBundle

首先我们在AuthorizationBundle下创建一个Service文件夹,用来储存所有与service相关的文件。建立一个AuthorizationHandle.php的文件,这个是我们用来实现success handle的代码文件。

因为实现success handle需要实现AuthenticationSuccessHandlerInterface接口中的方法,所以我们的handle类这么写

<?php

namespace HuanYue\AuthorizationBundle\Service;

use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Http\Authentication\AuthenticationSuccessHandlerInterface;
use Symfony\Component\DependencyInjection\ContainerAwareTrait;


class AuthorizationHandle implements AuthenticationSuccessHandlerInterface
{
    use ContainerAwareTrait;
    /**
     * This is called when an interactive authentication attempt succeeds. This
     * is called by authentication listeners inheriting from
     * AbstractAuthenticationListener.
     *
     * @param Request        $request
     * @param TokenInterface $token
     *
     * @return Response never null
     */
    function onAuthenticationSuccess(Request $request, TokenInterface $token){
        $user = $token->getUser();
        $user->setLastLogin(new \DateTime());
        $user->save();

        return new RedirectResponse($this->container->get('router')->generate('huan_yue_admin_authorization_dashboard'));
    }
}

下面解释一下代码,AuthenticationSuccessHandlerInterface中的注释很清晰的写明了我们可以在onAuthenticationSuccess中实现我们的功能,并且最后需要返回一个Response。我们进行刷新登录时间、或者登录加1、或者其他什么操作后需要跳转到后台首页,因此需要生成一个RedirectResponse,我的代码里用到了Symfony container去获取router,所以需要使用Symfony提供给我们的Trait(注:在2.*版本中可以直接继承ContainerAware类)。到此,我们的success handel已经实现完成。

下一步,我们把我们的AuthorizationHandle注册到Symfony的Service中,在Resources\services.yml中添加

services:
    huan_yue_authorization.authorization_handle:
        class: HuanYue\AuthorizationBundle\Service\AuthorizationHandle
        calls:
            - [ setContainer, [ "@service_container" ] ]

最后一步,修改app\config\security.yml文件,在form_login下添加我们的success handle,代码如下

form_login:
    check_path: huan_yue_admin_authorization_login
    login_path: huan_yue_admin_authorization_login
    default_target_path: huan_yue_admin_authorization_dashboard
    success_handler: huan_yue_authorization.authorization_handle
    

到此,整个流程完成。

这个问题已经被关闭无法回答