如何使用EntityRepository获得更好的Symfony 3身份验证错误消息

时间:2016-09-24 09:56:00

标签: authentication login entity symfony

您好我从数据库加载用户。 (不使用FOSUserBundle或Grant) 我使用Symfony 3 documentation中的实体提供程序方法 但我遇到了一个问题。一切正常,我可以登录但是当我尝试使用错误的用户名登录时,我得到了这个相当不合理的错误

  

由于系统问题,无法处理身份验证请求。

开发人员不清楚并且引起普通用户的总体恐慌,因此我必须找到一种方法来替换这种方式,而不仅仅是一些非常好的东西。

我试图在UserRepostory中抛出UserNameNotFoundException或BadCredentialsException,它没有效果。

有没有办法可以改进这个或者我应该放弃这种方法并使用UserProvider和服务方法吗?

PS:我还想改进BadCrentials消息。

UserRepository:

<?php
// src/AppBundle/Entity/UserRepository.php

namespace AppBundle\Entity ;

use Symfony\Bridge\Doctrine\Security\User\UserLoaderInterface ;
use Symfony\Component\Security\Core\User\UserInterface ;
use Symfony\Component\Security\Core\Exception\UsernameNotFoundException ;
use Doctrine\ORM\EntityRepository ;

class UserRepository extends EntityRepository implements UserLoaderInterface {

public function loadUserByUsername($username)
{

        $user = $this->createQueryBuilder('u')
            ->where('u.username = :username OR u.email = :email')
            ->setParameter('username', $username)
            ->setParameter('email', $username)
            ->getQuery()
            ->getOneOrNullResult();


        if($user === null){
        throw new UsernameNotFoundException("You provided a wrong username");
        }

        return $user;
    }
}
?>

在security.yml中:

ordinary_users
  entity:
       class: AppBundle:OrdinaryUser

控制器:

class securityController extends Controller {
/**
* @Route("/account/signin", name="signin_form")
* @Template("AppBundle:security:signin.html.twig")
*/
public function signinAction(Request $request)
{
    $this->get('logger')->info("called secureLoginAction");
    $session = $request->getSession();
    //gets the login error is there is one

    if($request->attributes->get(Security::AUTHENTICATION_ERROR)){
        $error = $request->attributes->get(
            Security::AUTHENTICATION_ERROR
        );
    } else {
        $error = $session->get(Security::AUTHENTICATION_ERROR);
        $session->remove(Security::AUTHENTICATION_ERROR);
    }

    return array(
        'last_username' => $session->get(Security::LAST_USERNAME),
        'error' => $error
    );
}

... goes on nothing special all like in the example.

我不包含相当长的OrdinaryUser实体,但它是标准的AdvancedUserInterface实现。

那么我该如何解决这个问题呢? (在它修复之后我想把它翻译成一个ajax登录,但以后就可以了。)

0 个答案:

没有答案