Php 自定义登录时无法识别UserInterface
我需要使用用户名、密码和密码手动登录用户 返回json响应而不使用symfony表单 这是进行登录的控制器,我根据请求获取用户名和密码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 { /**
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);但我还是犯了同样的错误。我还需要补充什么吗