src/Security/ApiAdminAuthenticator.php line 27

Open in your IDE?
  1. <?php
  2. namespace App\Security;
  3. use Symfony\Component\HttpFoundation\JsonResponse;
  4. use Symfony\Component\HttpFoundation\Request;
  5. use Symfony\Component\HttpFoundation\Response;
  6. use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
  7. use Symfony\Component\Security\Core\Exception\AuthenticationException;
  8. use Symfony\Component\Security\Core\Exception\CustomUserMessageAuthenticationException;
  9. use Symfony\Component\Security\Http\Authenticator\AbstractAuthenticator;
  10. use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge;
  11. use Symfony\Component\Security\Http\Authenticator\Passport\Passport;
  12. use Symfony\Component\Security\Http\Authenticator\Passport\SelfValidatingPassport;
  13. use App\Entity\Admin;
  14. use Doctrine\ORM\EntityManagerInterface;
  15. use Symfony\Component\Security\Http\Authenticator\Passport\Credentials\CustomCredentials;
  16. use Symfony\Component\Security\Core\User\UserInterface;
  17. use Symfony\Component\HttpFoundation\RedirectResponse;
  18. use Symfony\Component\Routing\RouterInterface;
  19. use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;
  20. use Symfony\Component\Security\Core\Security;
  21. /**
  22.  * 使用这个验证访问权限  暂时无法使用rememberme功能(可改造)
  23.  */
  24. class ApiAdminAuthenticator extends AbstractAuthenticator
  25. {
  26.     public function __construct(
  27.         protected EntityManagerInterface $entityManager,
  28.         protected Security $security,
  29.         protected AuthorizationCheckerInterface $authChecker,
  30.         protected RouterInterface $router,
  31.     ) {}
  32.     /**
  33.      * Called on every request to decide if this authenticator should be
  34.      * used for the request. Returning `false` will cause this authenticator
  35.      * to be skipped.
  36.      */
  37.     public function supports(Request $request): ?bool
  38.     {
  39.         return === strpos($request->attributes->get('_route'), 'admin_auth');
  40.     }
  41.     public function authenticate(Request $request): Passport
  42.     {  
  43.         $admin $this->security->getUser();
  44.         if (!$admin) throw new CustomUserMessageAuthenticationException('请重新登陆系统123', ['code'=>-1]);
  45.         ////此处验证api是否用访问权限             
  46.         $router $request->attributes->get('_route');      
  47.         $isAuth $this->authChecker->isGranted($router);
  48.         if(!$isAuth && $admin->getUsername() !== 'admin') throw new CustomUserMessageAuthenticationException('没有访问权限', ['code'=>1]);  
  49.         return new SelfValidatingPassport(new UserBadge($admin->getUsername()));
  50.     }
  51.     public function onAuthenticationSuccess(Request $requestTokenInterface $tokenstring $firewallName): ?Response
  52.     {
  53.         // on success, let the request continue
  54.         return null;
  55.     }
  56.     public function onAuthenticationFailure(Request $requestAuthenticationException $exception): ?Response
  57.     {
  58.         if ($request->isXmlHttpRequest()) {  
  59.             $data = [
  60.                 // you may want to customize or obfuscate the message first
  61.                 'code'  => $exception->getMessageData()['code'] ?? -1,
  62.                 'message' => strtr($exception->getMessageKey(), $exception->getMessageData())
  63.             ];
  64.     
  65.             return new JsonResponse($dataResponse::HTTP_UNAUTHORIZED);             
  66.         }
  67.         $request->getSession()->getFlashBag()->add('alert'strtr($exception->getMessageKey(), $exception->getMessageData()));
  68.         if ($exception->getMessageData()['code'] === -1) return new RedirectResponse($this->router->generate('admin.login'));        
  69.         throw new \Exception(strtr($exception->getMessageKey(), $exception->getMessageData()));  
  70.     }
  71. }