如何在symfony2 login_check中的特定情况下设置错误消息

时间:2013-05-28 10:28:41

标签: security symfony

当登录失败时,如何根据情况在symfony2中编写特定的错误消息

例如: 找不到用户名时 用户名'userxxx'不存在。 找到用户名但密码错误时 您输入的密码错误!请再试一次! 或者:'userxxx'的密码错误!请再试一次!

我找到了一种在未找到用户名的情况下提醒错误消息的方法是编写自定义用户提供程序

class UserProvider implements UserProviderInterface {

    protected $entityManager;

    public function __construct(EntityManager $entityManager) {
        $this->entityManager = $entityManager;
    }

    public function loadUserByUsername($username) {
        $user = $this->entityManager
                ->getRepository('ShopSecurityBundle:User')
                ->findOneBy(array('username' => $username));        
        if ($user) {
            $service_user = new SecurityServiceUser($user->getUsername(), $user->getPassword(), $user->getSalt(), array($user->getRole()));
            //var_dump($service_user); die;
            return $service_user;
        }
        // I throw a BadCredentialsException() here then the error message in security Context will be changed arcodding to the exception message!
        throw new BadCredentialsException(sprintf('Username "%s" does not exist', $username));
    }
// ...
}

但是当用户名正确时,我不知道如何在密码错误时更改错误消息!

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

干净的解决方案是在表单字段“用户名”和“密码”中添加错误,或者直接在表单中添加错误以显示常规“错误”。

快速解决方案只是将一个变量即'错误'传递给twig(就像FOSUserBundle那样)。

抛出与您的身份验证错误相对应的异常并将其与侦听器一起捕获。

了解FOSUserBundle如何在FOSUserBundle\Security\UserProviderController\SecurityController中解决此问题。

可以在文档章节How to create a custom Authentication Provider中找到有关如何捕获侦听器中的异常的示例。 (看看句柄方法)

可以找到symfony安全例外的概述here