1

我正在使用 ionic 和 AngularJS (1.5.x) 制作 SPA(混合应用程序)。我在后台使用 Symfony 2.8 并处理我的 API。

我想使用 JWT,我正在使用 Lexik JWT 包。一切正常。当用户登录时,他会获得一个令牌,然后将其保存在 Authorization 标头中。只有拥有此令牌(或者更确切地说是此标头中的令牌)的用户才能访问 API 并进行 API 调用。

我唯一不清楚的是如何做到这一点,以便用户只能进行涉及他们自己的信息的 API 调用(获取用户信息,只更新他们自己的帖子等)。

到目前为止,我已经尝试从 Authorization 标头中获取数据,以进一步以某种方式使用此令牌的数据(用户名在其中)来检查它是否等于制作此报告的用户名。

尝试了几件事,例如检查请求标头getallheaders()$token = $_SERVER['Authorization'];其他通用功能,但每次我也遇到错误。

我是误解了什么还是错过了一步?我是否错误地使用了 JWT?我的推理是否正确,我应该这样做,还是有更流畅/合乎逻辑的方式来做到这一点?

我还在为我的 API 使用 FOSRestBundle 以及 NelmioCORS、NelmioApiDoc 和 FOSUSERBundle

4

1 回答 1

2

当您位于 bundle 提供的防火墙之后并且用户正确登录时,您可以通过调用服务的 then 方法从控制器获取用户getToken()对象。如果您的控制器扩展,您可以直接调用.getUser()security.token_storageSymfony\Bundle\FrameworkBundle\Controller\Controller$this->getUser()

<?php

namespace AcmeBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Security;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;

/**
 * @Route("/api")
 */
class ApiController extends Controller
{
    /**
     * @Route("/hello")
     * @Security("is_granted('ROLE_USER')")
     */
    public function helloAction()
    {
        $token = $this->get('security.token_storage')->getToken();
        $if (null !== $token) {
            //$token should be an instance of Lexik\Bundle\JWTAuthenticationBundle\Security\Authentication\Token\JWTUserToken
            $user = $token->getUser();
        }
        // or
        $user = $this->getUser();
        ...
    }
}
于 2016-08-20T16:37:23.350 回答