Symfony 2:手动登录和 Json Web Token
Posted
技术标签:
【中文标题】Symfony 2:手动登录和 Json Web Token【英文标题】:Symfony 2 : manual login and Json Web Token 【发布时间】:2015-06-28 03:30:10 【问题描述】:我当前的项目有问题。 我一直在使用 Symfony 2.6 这个项目是我的前端调用的 API。 身份验证和登录流程非常具体,它使用中间件(其他网站)。
我添加了一个名为 JWTAuthenticationWebToken 的包 因此,由于使用了中间件,我需要手动登录用户。 我正确安装了捆绑包并添加了正确的设置,但从未调用过此自定义用户提供程序。
手动登录如何实现?
我的控制器:
<?php $token = new UsernamePasswordToken($user, null, "login", $user->getRoles());
$this->get("security.context")->setToken($token); //now the user is logged in
//now dispatch the login event
$request = $this->get("request");
$event = new InteractiveLoginEvent($request, $token);
$this->get("event_dispatcher")->dispatch("security.interactive_login", $event); ?>
security.yml
firewalls:
# disables authentication for assets and the profiler, adapt it according to your needs
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
# the login page has to be accessible for everybody
demo_login:
pattern: ^/demo/secured/login$
security: false
login:
pattern: /api/user/uber/f6d75c949cda2517b826cacba5523792
stateless: true
anonymous: true
form_login:
check_path: /api/user/uber/f6d75c949cda2517b826cacba5523792
success_handler: lexik_jwt_authentication.handler.authentication_success
failure_handler: lexik_jwt_authentication.handler.authentication_failure
require_previous_session: false
api:
pattern: ^/(api)
stateless: true
lexik_jwt: ~
我还编写了两个文件“ApiKeyAuthenticator”和“ApiKeyUserProvider”,正如这里提到的手动身份验证。 http://symfony.com/doc/current/cookbook/security/api_key_authentication.html
编辑: 我还创建了 LexikJWTAuthenticationBundle 文档中提到的侦听器
怎么了? :(
感谢您的帮助
【问题讨论】:
怎么了?太多可能的故障点,甚至无法做出疯狂的猜测。我建议创建一个新的 Symfony 项目并仅添加 lexik 包。然后逐步阅读文档并让默认配置正常工作。然后才尝试使用您的手动登录进行自定义,这可能甚至不需要。 这就是你的security.yml的全部内容?您没有配置任何实体提供程序吗?为什么需要手动登录用户?使用 LexikJWTAuthenticationBundle 的目的是让包以对控制器透明的方式处理身份验证。 【参考方案1】:经过大量搜索(google、***、示例应用程序、bundle 的文档……),似乎没有建议的解决方案从控制器手动验证用户身份。
另外,我必须打开源代码,找到在成功的身份验证事件(source code)时调用哪个方法来生成令牌,最后根据我的需要调整代码(从Facebook 登录的响应,在移动应用程序中)。
我的选择:
// SecurityController.php
protected function generateToken($user, $statusCode = 200)
// Call jwt_manager service & create the token
$token = $this->get('lexik_jwt_authentication.jwt_manager')->create($user);
// If you want, add some user informations
$userInformations = array(
'id' => $user->getId(),
'username' => $user->getUsername(),
'email' => $user->getEmail(),
'roles' => $user->getRoles(),
);
// Build your response
$response = array(
'token' => $token,
'user' => $user,
);
// Return the response in JSON format
return new JsonResponse($response, $statusCode);
token 将与经典 login_check 处理程序一样返回,并且在到期前具有相同的时间。
希望对下一个用户有所帮助。
【讨论】:
有趣.. 使用LexikJWTAuthenticationBundle,我有 "onAuthenticationSuccessResponse" 监听器和一个特定的控制器操作,几乎没有相同的代码逻辑。有谁知道是否有办法从该侦听器内部调用我的控制器的操作,然后将其返回的 JsonResponse 数据推送到 AuthenticationSuccessEvent 事件数据中?我希望这是有道理的:/
。谢谢。
嗨@Stphane,因为这个问题我在 LexikJWTAuthenticationBundle 上做了很多工作,现在我是它的主要维护者。看到这个答案对我来说感觉不对,除了非常特定的需求(例如,从通过注册确认电子邮件中的链接浏览的端点验证用户)。否则,只需要配置,如文档中所示。为什么你在 AuthenticationSuccessEvent 监听器中重现了这个? LexikJWTAuthentication 提供了一个内置的 AuthenticationSuccess 事件和处理程序,返回一个包含令牌的响应,只需要配置。
我实际上并没有在…sucessListener 中重现这个答案。我在寻找一种方法来实现我在第一条评论中提到的内容时发现了这个 SO。你是维护者真是个好消息!你也许能帮我找到我的路!我已经设置了一条路线来提供从移动应用程序请求的数据。登录后,用户会获得他们的令牌,但我需要附加这些以前的数据以在之后立即为我的用户保存另一个 ajax 请求。我需要一种方法来使侦听器和控制器的操作共享一些代码,而不是在 2 个不同的地方对其进行两次编码。你有什么建议?谢谢:)
LexikJWTAuthenticationBundle
只进行表单登录,我必须将 JWTTokenAuthenticator
中的所有变量都放在受保护的状态并覆盖几乎所有内容以使其在没有表单的情况下正常工作。老实说,我想要的只是生成一个令牌,但这花了将近一周的时间来挖掘代码并手动分解代码。
@G_V 如果您需要从控制器生成令牌,我真的不知道扩展/更改 JWTTokenAuthenticator
有什么帮助。只需使用此处所示的lexik_jwt_authentication.jwt_manager
即可很好地生成用户。你能否给我更多关于你想要达到的目标的细节?这将有助于改进捆绑包本身的用户体验。以上是关于Symfony 2:手动登录和 Json Web Token的主要内容,如果未能解决你的问题,请参考以下文章
Symfony 5 - 使用 json_login 登录;登录过程不起作用;