![](/img/trans.png)
[英]Symfony2 - custom authentication provider with FOS User Bundle installed
[英]Symfony2 custom authentication system passes user when it shouldn't
我正在為Symfony2編寫一個包,我需要編寫一個帶有警衛的自定義身份驗證系統。 整個系統基於令牌。 我們假設我需要發送一個POST請求。 在標題中我必須包含'TOKEN:testtoken'。
我在標題中發送沒有'TOKEN:testtoken'的請求,我得到了
{ "message": "Authentication Required" }
我發送了一個'TOKEN:badtoken'的請求,我得到了
{ "message": "Username could not be found." }
不要看'用戶名'。 這是錯誤的。
我發送請求'TOKEN:testtoken'然后我得到了
{ "token": "testtoken" }
這只是示例頁面。
現在我從頭文件中刪除'TOKEN:testtoken'(我使用Postman來測試REST API)然后我得到了
{ "token": "testtoken" }
我不知道為什么。 在我看來,在這種情況下我的系統應該返回
{ "message": "Authentication Required" }
這是我的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;
}
}
PS我的應用程序是共享托管。 可能緩存導致它或類似的東西?
我弄清楚出了什么問題。 當我在我的會話中請求有效令牌時形成了PHPSESSID。 因此,我的API行為變得非常怪異。 在我的情況下,解決方案是將security.firewalls.main.stateless設置為true :)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.