之前使用到了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
