Php 自定义登录时无法识别UserInterface

Php 自定义登录时无法识别UserInterface,php,symfony,doctrine-orm,Php,Symfony,Doctrine Orm,我需要使用用户名、密码和密码手动登录用户 返回json响应而不使用symfony表单 这是进行登录的控制器,我根据请求获取用户名和密码 use Gabriel\LiveLoginBundle\Entity\LiveUser; use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken; class AuthController extends Controller { /**

我需要使用用户名、密码和密码手动登录用户 返回json响应而不使用symfony表单

这是进行登录的控制器,我根据请求获取用户名和密码

use Gabriel\LiveLoginBundle\Entity\LiveUser;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken; 

class AuthController extends Controller
{
    /**
     * @Route("/livelogin",name="liveloginroute")
     * @Template()
     */
    public function loginAction(Request $request)
    {
        $username = $request->request->get('usrn');
        $password = $request->request->get('pwd');
        $roles = array('ROLE_USER');
        $providerkey = 'livemain'; //firewall name

        $em = $this->getDoctrine()->getManager();
        $user = $em->getRepository('GabrielLiveLoginBundle:LiveUser')->findBy(array('username'=>$username));

        if(!$user)
        {
            $response = array('usernmae'=>'not_found');
            new Response(json_encode($response));
        }

        $token = new UsernamePasswordToken(
            $user, $password,$providerkey,$roles);

        $this->get( 'security.context' )->setToken( $token );


        $this->get( 'event_dispatcher' )->dispatch(
        AuthenticationEvents::AUTHENTICATION_SUCCESS,
            new AuthenticationEvent( $token ) );

        $this->container->get('security.context')->setToken($token);

        //success
当我尝试以这种方式登录时,symfony抛出一个异常

$user必须是UserInterface的实例,一个实现 __toString方法或基本字符串

虽然我的liveUser类确实实现了UserInterface

/**
 * LiveUser
 *
 * @ORM\Table()
 * @ORM\Entity(repositoryClass="Gabriel\LiveLoginBundle\Entity\LiveUserRepository")
 */
class LiveUser implements UserInterface
{
我还添加了UserInterface所需的必要方法

也许我的防火墙设置有问题

security:
    encoders:
        Gabriel\LiveLoginBundle\Entity\LiveUser: sha512

    role_hierarchy:
        ROLE_USER:       ROLE_USER
        ROLE_ADMIN: [ROLE_ADMIN,ROLE_USER]

    providers:
        livemain:
          entity: { class: GabrielLiveLoginBundle:LiveUser, property: username }

    firewalls:
      livemain:
           pattern: ^/
           anonymous: true

答复 这是控制器上工作的代码

    $username = $request->request->get('usrn');
    $password = $request->request->get('pwd');
    $roles = array('ROLE_USER');
    $providerkey = 'livemain'; //firewall name

    $em = $this->get('doctrine')->getManager();
    $query = $em->createQuery("SELECT u FROM GabrielLiveLoginBundle:LiveUser u WHERE u.username = :username");
    $query->setParameter('username', $username);
    $user = $query->getOneOrNullResult();

    if(!$user)
    {
        $response = array('usernmae'=>'not_found');
        new Response(json_encode($response));
    }

    $token = new UsernamePasswordToken(
        $user, $password,$providerkey,$roles);

    $this->get( 'security.context' )->setToken( $token );

    $this->get( 'event_dispatcher' )->dispatch(
    AuthenticationEvents::AUTHENTICATION_SUCCESS,
        new AuthenticationEvent( $token ) );

    // Fire the login event
    // Logging the user in above the way we do it doesn't do this automatically
    $event = new InteractiveLoginEvent($request, $token);
    $this->get("event_dispatcher")->dispatch("security.interactive_login", $event);

    //success
    $response = array('i'=>0,'password'=>$password, 'username'=>$username);
    return new Response(json_encode($response));

使用
$repository->findBy()
时,将返回一个对象数组。在您的情况下,您只希望找到一个(或没有)用户。在这种情况下,您应该使用:

$em = $this->get('doctrine')->getManager();
$query = $em->createQuery("SELECT u FROM GabrielLiveLoginBundle:LiveUser u WHERE u.username = :username");
$query->setParameter('username', $username);
$user = $query->getOneOrNullResult();

在控制器的哪一行抛出错误?顺便说一下,findBy返回一个对象数组。我认为您应该使用
getOneOrNullResult()
。让我知道这是否有效,这样我就可以做一个正确的回答。如果有效,将此作为答案发布,这样我就可以选择最佳答案。我使用了$userData=$em->getRepository('UserBundle:User')->findOneByEmail($email);但我还是犯了同样的错误。我还需要补充什么吗