LexikJWTAuthenticationBundle 生成令牌
LexikJWTAuthenticationBundle generate Token
我正在使用 LexikJWTAuthenticationBundle 生成 json 令牌,我的问题是我不知道如何在验证用户在之后生成令牌屋宇署。我能帮忙吗?
我的代码。
public function postLoginAction(Request $request)
{
$user = new Utilizador();
$json = json_decode($request->getContent(), true);
$user->setUser($json['user']);
$user->setPass($json['pass']);
$em = $this->getDoctrine()->getManager();
$existuser = $em->getRepository('RestBundle:Utilizador')->findOneBy(array(
'user' => $user->getUser(),
'pass' => $user->getPass()
));
if($existuser)
{
$token = $this->get('lexik_jwt_authentication.jwt_manager')->create($user);
return new JsonResponse(['token' => $token]);
}
}
我的实用程序Class
<?php
namespace RestBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;
/**
* Utilizador
*
* @ORM\Entity
* @ORM\Table(name="utilizador")
*/
class Utilizador implements UserInterface
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="nome", type="string", length=100, nullable=true)
*/
private $nome;
/**
* @var string
*
* @ORM\Column(name="user", type="string", length=100, nullable=true)
*/
private $username;
/**
* @var string
*
* @ORM\Column(name="pass", type="string", length=100, nullable=true)
*/
private $pass;
/**
* @var string
*
* @ORM\Column(name="email", type="string", length=100, nullable=true)
*/
private $email;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set nome
*
* @param string $nome
*
* @return Utilizador
*/
public function setNome($nome)
{
$this->nome = $nome;
return $this;
}
/**
* Get nome
*
* @return string
*/
public function getNome()
{
return $this->nome;
}
/**
* Set user
*
* @param string $username
*
* @return Utilizador
*/
public function setUsername($username)
{
$this->username = $username;
return $this;
}
/**
* Get user
*
* @return string
*/
public function getUsername()
{
return $this->username;
}
/**
* Set pass
*
* @param string $pass
*
* @return Utilizador
*/
public function setPassword($pass)
{
$this->pass = $pass;
return $this;
}
/**
* Get pass
*
* @return string
*/
public function getPassword()
{
return $this->pass;
}
/**
* Set email
*
* @param string $email
*
* @return Utilizador
*/
public function setEmail($email)
{
$this->email = $email;
return $this;
}
/**
* Get email
*
* @return string
*/
public function getEmail()
{
return $this->email;
}
public function getRoles()
{
return array('ROLE_USER');
}
public function eraseCredentials()
{
}
public function getSalt()
{
return null;
}
}
Security.yml
security:
# http://symfony.com/doc/current/book/security.html#where-do-users-come-from-user-providers
providers:
in_memory:
memory: ~
firewalls:
login:
pattern: ^/api/logins
stateless: true
anonymous: true
api:
pattern: ^/api
stateless: true
lexik_jwt: ~
access_control:
- { path: ^/api/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/api, roles: IS_AUTHENTICATED_FULLY }
另一个APIClass
<?php
/**
* Created by PhpStorm.
* Date: 08/08/16
* Time: 18:28
*/
namespace RestBundle\Controller;
use RestBundle\Form\StatusType;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use FOS\RestBundle\Controller\FOSRestController;
use Symfony\Component\HttpKernel\Exception\HttpException;
use RestBundle\Entity\Status;
class StatusController extends FOSRestController
{
public function getStatusAction()
{
$em = $this->getDoctrine()->getManager();
$user = $em->getRepository('RestBundle:Status')->findAll();
return $user;
}
public function getStatuAction($id)
{
$em = $this->getDoctrine()->getManager();
$user = $em->getRepository('RestBundle:Status')->find($id);
if (!$id) {
throw new HttpException(400, "Invalid id");
}
return $user;
}
public function postStatusAction(Request $request)
{
$user = new Status();
$json = json_decode($request->getContent(), true);
$user->setNome($json['nome']);
$em = $this->getDoctrine()->getManager();
$em->persist($user);
$em->flush();
return $user;
}
}
这是从有效的安全用户创建令牌的方法:
$token = $this->get('lexik_jwt_authentication.jwt_manager')->create($user);
您可以直接尝试,但我想这对您不起作用,因为您的用户实体看起来非常自定义。
要使其工作,您的用户实体必须实现 Symfony\Component\Security\Core\User\UserInterface
。
为此,与其通过实体管理器从控制器手动加载用户,不如真正配置 Entity User Provider。
参见 How to load security users from the database
希望这能帮助您走上正确的道路。
编辑:
这是一个完整的示例,说明您必须执行哪些操作才能从数据库加载用户并使用此包对他们进行身份验证:
我正在使用 LexikJWTAuthenticationBundle 生成 json 令牌,我的问题是我不知道如何在验证用户在之后生成令牌屋宇署。我能帮忙吗?
我的代码。
public function postLoginAction(Request $request)
{
$user = new Utilizador();
$json = json_decode($request->getContent(), true);
$user->setUser($json['user']);
$user->setPass($json['pass']);
$em = $this->getDoctrine()->getManager();
$existuser = $em->getRepository('RestBundle:Utilizador')->findOneBy(array(
'user' => $user->getUser(),
'pass' => $user->getPass()
));
if($existuser)
{
$token = $this->get('lexik_jwt_authentication.jwt_manager')->create($user);
return new JsonResponse(['token' => $token]);
}
}
我的实用程序Class
<?php
namespace RestBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\UserInterface;
/**
* Utilizador
*
* @ORM\Entity
* @ORM\Table(name="utilizador")
*/
class Utilizador implements UserInterface
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer", nullable=false)
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="nome", type="string", length=100, nullable=true)
*/
private $nome;
/**
* @var string
*
* @ORM\Column(name="user", type="string", length=100, nullable=true)
*/
private $username;
/**
* @var string
*
* @ORM\Column(name="pass", type="string", length=100, nullable=true)
*/
private $pass;
/**
* @var string
*
* @ORM\Column(name="email", type="string", length=100, nullable=true)
*/
private $email;
/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}
/**
* Set nome
*
* @param string $nome
*
* @return Utilizador
*/
public function setNome($nome)
{
$this->nome = $nome;
return $this;
}
/**
* Get nome
*
* @return string
*/
public function getNome()
{
return $this->nome;
}
/**
* Set user
*
* @param string $username
*
* @return Utilizador
*/
public function setUsername($username)
{
$this->username = $username;
return $this;
}
/**
* Get user
*
* @return string
*/
public function getUsername()
{
return $this->username;
}
/**
* Set pass
*
* @param string $pass
*
* @return Utilizador
*/
public function setPassword($pass)
{
$this->pass = $pass;
return $this;
}
/**
* Get pass
*
* @return string
*/
public function getPassword()
{
return $this->pass;
}
/**
* Set email
*
* @param string $email
*
* @return Utilizador
*/
public function setEmail($email)
{
$this->email = $email;
return $this;
}
/**
* Get email
*
* @return string
*/
public function getEmail()
{
return $this->email;
}
public function getRoles()
{
return array('ROLE_USER');
}
public function eraseCredentials()
{
}
public function getSalt()
{
return null;
}
}
Security.yml
security:
# http://symfony.com/doc/current/book/security.html#where-do-users-come-from-user-providers
providers:
in_memory:
memory: ~
firewalls:
login:
pattern: ^/api/logins
stateless: true
anonymous: true
api:
pattern: ^/api
stateless: true
lexik_jwt: ~
access_control:
- { path: ^/api/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/api, roles: IS_AUTHENTICATED_FULLY }
另一个APIClass
<?php
/**
* Created by PhpStorm.
* Date: 08/08/16
* Time: 18:28
*/
namespace RestBundle\Controller;
use RestBundle\Form\StatusType;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use FOS\RestBundle\Controller\FOSRestController;
use Symfony\Component\HttpKernel\Exception\HttpException;
use RestBundle\Entity\Status;
class StatusController extends FOSRestController
{
public function getStatusAction()
{
$em = $this->getDoctrine()->getManager();
$user = $em->getRepository('RestBundle:Status')->findAll();
return $user;
}
public function getStatuAction($id)
{
$em = $this->getDoctrine()->getManager();
$user = $em->getRepository('RestBundle:Status')->find($id);
if (!$id) {
throw new HttpException(400, "Invalid id");
}
return $user;
}
public function postStatusAction(Request $request)
{
$user = new Status();
$json = json_decode($request->getContent(), true);
$user->setNome($json['nome']);
$em = $this->getDoctrine()->getManager();
$em->persist($user);
$em->flush();
return $user;
}
}
这是从有效的安全用户创建令牌的方法:
$token = $this->get('lexik_jwt_authentication.jwt_manager')->create($user);
您可以直接尝试,但我想这对您不起作用,因为您的用户实体看起来非常自定义。
要使其工作,您的用户实体必须实现 Symfony\Component\Security\Core\User\UserInterface
。
为此,与其通过实体管理器从控制器手动加载用户,不如真正配置 Entity User Provider。 参见 How to load security users from the database
希望这能帮助您走上正确的道路。
编辑:
这是一个完整的示例,说明您必须执行哪些操作才能从数据库加载用户并使用此包对他们进行身份验证: