2

我正在使用LexikJWTAuthenticationBundle生成 json 令牌,我的问题是我不知道在验证用户是否在 BD 后如何生成令牌。我能帮忙吗?

我的代码。

 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]);
    }

    }

我的 Utilizador 类

 <?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;
    }
}

安全.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 }

另一个 API 类

<?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;
    }

}
4

1 回答 1

1

以下是如何从有效的安全用户创建令牌:

$token = $this->get('lexik_jwt_authentication.jwt_manager')->create($user);

您可以直接尝试它,但我想它对您不起作用,因为您的 User 实体看起来非常自定义。
要使其正常工作,您的 User 实体必须实现Symfony\Component\Security\Core\User\UserInterface.

为此,您应该真正配置Entity User Provider ,而不是通过实体管理器从控制器手动加载用户。请参阅如何从数据库加载安全用户

希望这可以帮助您以正确的方式前进。

编辑:

这是一个完整的示例,说明从数据库加载用户并使用此捆绑包对他们进行身份验证时必须执行的操作:

https://github.com/chalasr/lexik-jwt-authentication-sandbox

于 2016-08-23T12:03:08.690 回答