匿名。在自定义用户提供程序

时间:2016-08-11 15:33:22

标签: php security symfony

我想管理没有数据库的用户,并检查他们的JWT

我使用Guard和自定义服务来验证我的JWT。

我想要使用自定义user provider,如果用户没有JWT,我想重定向到新页面或调用异常

这是我的代码

class WebserviceUserProvider implements UserProviderInterface {

  /**
   * @var \Symfony\Component\Routing\RouterInterface
   */
  private $router;
  private $requestStack;

  /**
   * WebserviceUserProvider constructor.
   * @param RequestStack $router
   */
  public function __construct($router,RequestStack $requestStack) {
    $this->router = $router;
    $this->requestStack = $requestStack;
  }

  public function refreshUser(UserInterface $user) {
    if (!$user instanceof User) {
      throw new UnsupportedUserException(
              sprintf('Instances of "%s" are not supported.', get_class($user))
      );
    }

    return $this->loadUserByUsername($user->getUsername());
  }

  public function loadUserByUsername($username) {

    if (!$token = $this->requestStack->getCurrentRequest()->headers->get('Authorization') ?: $this->requestStack->getCurrentRequest()->query->get('token')) {
      throw new UsernameNotFoundException('Could not find user. Sorry!');
    }

    $user = new \AppBundle\Entity\User('MyUsername');
    $user->setJwtToken($token);
    return $user;
  }

  public function supportsClass($class) {
    return $class === 'AppBundle\Security\User\WebserviceUser';
  }


}

这是我的service.yml

app.webservice_user_provider:
    class: AppBundle\Security\WebserviceUserProvider
    arguments: ['@router','@request_stack']

和我的security.yml

user-providers
    providers:
        webservice:
            id: app.webservice_user_provider

当我在queryString

中访问带有令牌的网址时
http://127.0.0.1:8000/app_dev.php/?token=my.token.jwt

我的用户已登录。 访问时

http://127.0.0.1:8000/app_dev.php/

我有一个用户anon。 (我的令牌设置为Anon。)我没有异常

如果我用

更改loadUserByUsername
  public function loadUserByUsername($username) {

    if (!$token = $this->requestStack->getCurrentRequest()->headers->get('Authorization') ?: $this->requestStack->getCurrentRequest()->query->get('token')) {
      $url = $this->router->generate('errorPage');
      return new RedirectResponse($url);
    }

    $user = new \AppBundle\Entity\User('MyUsername');
    $user->setJwtToken($token);
    return $user;
  }

我有这个错误

  

尝试调用名为" getUsername"的未定义方法。班级   " Symfony的\元器件\ HttpFoundation \ RedirectResponse&#34 ;. 500内部   服务器错误 - UndefinedMethodException

如果我没有JWT(或无效)或有异常,我该如何重定向到某个页面?

0 个答案:

没有答案