Symfony2自定义身份验证系统在不应该使用时传递给用户

时间:2016-06-27 18:01:22

标签: php symfony

我正在为Symfony2编写一个包,我需要编写一个带有警卫的自定义身份验证系统。整个系统基于令牌。我们假设我需要发送一个POST请求。在标题中,我必须包含“TOKEN:testtoken'”。

  1. 我发送的请求没有' TOKEN:testtoken'在标题中我得到了

    { "message": "Authentication Required" }
    
  2. 我发送了一封请求,其中包括:'tokEN:badtoken'我得到了

    { "message": "Username could not be found." }
    

    请勿查看用户名'。这是错误的。

  3. 我发送请求' TOKEN:testtoken'我得到了

    { "token": "testtoken" }
    

    这只是示例页面。

  4. 现在我删除了'tokEN:testtoken'来自标题(我使用Postman测试REST API),我得到了

    { "token": "testtoken" }
    

    我不知道为什么。在我看来,在这种情况下我的系统应该返回

    { "message": "Authentication Required" }
    
  5. 这是我的TokenAuthenticator.php

    <?php
    namespace WLN\AuthTokenBundle\Security;
    
    use Doctrine\ORM\EntityManager;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\HttpFoundation\JsonResponse;
    use Symfony\Component\Security\Core\User\UserInterface;
    use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
    use Symfony\Component\Security\Core\Exception\AuthenticationException;
    use Symfony\Component\Security\Core\User\UserProviderInterface;
    use Symfony\Component\Security\Guard\AbstractGuardAuthenticator;
    use Symfony\Component\Security\Core\Exception\CustomUserMessageAuthenticationException;
    
    class TokenAuthenticator extends AbstractGuardAuthenticator
    {
        private $em;
        private $user_repository;
    
        public function __construct(EntityManager $em)
        {
            $this->em = $em;
        }
    
        public function setConfig($user_repo)
        {
            $this->user_repository = $user_repo;
        }
    
        public function getCredentials(Request $request)
        {
            if($token = $request->headers->get('WLN-AUTH-TOKEN'))
            {
                return [
                    'token' => $token
                ];
            }
    
            return null;
        }
    
        public function getUser($credentials, UserProviderInterface $userProvider)
        {
            $token = $credentials['token'];
    
            return $this->em->getRepository($this->user_repository)
                ->findOneBy(array('token' => $token));
        }
    
        public function checkCredentials($credentials, UserInterface $user)
        {
            return true;
        }
    
        public function onAuthenticationSuccess(Request $request, TokenInterface $token, $providerKey)
        {
            return null;
        }
    
        public function onAuthenticationFailure(Request $request, AuthenticationException $exception)
        {
            $data = array(
                'message' => strtr($exception->getMessageKey(), $exception->getMessageData())
            );
    
            return new JsonResponse($data, 403);
        }
    
        public function start(Request $request, AuthenticationException $authException = null)
        {
            $data = array(
                'message' => 'Authentication Required'
            );
    
            return new JsonResponse($data, 401);
        }
    
        public function supportsRememberMe()
        {
            return false;
        }
    }
    

    P.S。我的应用程序是共享托管。可能缓存导致它或类似的事情?

1 个答案:

答案 0 :(得分:0)

我弄清楚出了什么问题。当我在我的会话中请求有效令牌时形成了PHPSESSID。因此,我的API行为变得非常怪异。在我的例子中,解决方案是将security.firewalls.main.stateless设置为true:)。