指尖上的记忆指尖上的记忆
首页
  • 基础
  • Laravel框架
  • Symfony框架
  • 基础
  • Gin框架
  • 基础
  • Spring框架
  • 命令
  • Nginx
  • Ai
  • Deploy
  • Docker
  • K8s
  • Micro
  • RabbitMQ
  • Mysql
  • PostgreSsql
  • Redis
  • MongoDb
  • Html
  • Js
  • 前端
  • 后端
  • Git
  • 知识扫盲
  • Golang
🌟 gitHub
首页
  • 基础
  • Laravel框架
  • Symfony框架
  • 基础
  • Gin框架
  • 基础
  • Spring框架
  • 命令
  • Nginx
  • Ai
  • Deploy
  • Docker
  • K8s
  • Micro
  • RabbitMQ
  • Mysql
  • PostgreSsql
  • Redis
  • MongoDb
  • Html
  • Js
  • 前端
  • 后端
  • Git
  • 知识扫盲
  • Golang
🌟 gitHub

之前使用到了form_login的登录方式,后来有新的需求,想直接通过接口的形式登录,比如常规的RESTFUL方式,查看 文档发现有 json_login可以实现,官方默认有5种登录方式,全部对应有自己的默认 authenticator,各个默认的authenticator 都定义在:/vendor/symfony/security-bundle/Resources/config/security_authenticator.php

关于 json_login :
官方文档:https://symfony.com/doc/current/security.html#json-login
这个文档中比较重要的一点是:ApiLoginController中的路由api_login方法体,会在用户授权成功之后(会先走默认的authenticator)被调用,然后在这个方法体里面添加需要返回给接口调用方的参数,比如 token信息:

    #[Route('/api/login', name: 'api_login')]
    public function apiLogin(Request $request, SessionInterface $session, TokenStorageInterface $tokenStorage, EventDispatcherInterface $eventDispatcher): Response
    {
        $user = $this->getUser();

        $token = new UsernamePasswordToken($user, null, 'main', $user->getRoles());
        $tokenStorage->setToken($token);
        $session->set('_security_main', serialize($token));//这个_security_main是默认授权成功之后的key

        // Fire the login event manually
        $event = new InteractiveLoginEvent($request, $token);
        $eventDispatcher->dispatch($event);

        return $this->json([
            'user' => $user->getemail(),
        ]);
    }

但是有个问题,就是如果配置了 success_handler,如下在security.yaml:

json_login:
     check_path: /api/login
     success_handler: App\Security\LoginSuccessHandler

那么会在授权成功之后直接走这个success_handler,不会再走api_login方法体.

JsonLoginConfig参数在:
namespace Symfony\Config\Security\FirewallConfig;
JsonLoginConfig

如果使用jwt认证,推荐使用这个包: composer require lexik/jwt-authentication-bundle