gpt4 book ai didi

php - symfony2 以编程方式验证用户

转载 作者:可可西里 更新时间:2023-10-31 22:42:32 24 4
gpt4 key购买 nike

我刚刚完成了本教程: http://symfony.com/doc/current/cookbook/security/api_key_authentication.html (包括“在 session 中存储身份验证”)

它通过 api key 工作并授权用户,并成功地将身份验证存储在 session 中。

但是,我不知道如何通过该身份验证方法以编程方式对用户进行身份验证。

我试过类似的方法:

$user = new User(
'admin',
null,
['ROLE_ADMIN']
);

$token = new PreAuthenticatedToken($user, null, "secured_area", $user->getRoles());
$this->get("security.token_storage")->setToken($token);

$request = $this->get("request");
$event = new InteractiveLoginEvent($request, $token);
$this->get("event_dispatcher")->dispatch("security.interactive_login", $event);

但它似乎使用了错误的身份验证提供程序。

有人可以告诉我我做错了什么吗? (:

更新:

当通过上述方法完成身份验证时, session token 存储在“默认”防火墙下。

security:
providers:
api_key_user_provider:
id: api_key_user_provider

firewalls:
dev:
pattern: ^/(_(profiler|wdt|error)|css|images|js)/
security: false

secured_area:
pattern: ^/admin
simple_preauth:
authenticator: apikey_authenticator

default:
anonymous: ~

为什么不使用“secured_area”防火墙,而是使用“default”?如何正确强制使用“secured_area”?

最佳答案

您的用户创建不正确,您应该使用用户管理器:

$userManager = $this->container->get('fos_user.user_manager');

// Create our user and set details
$user = $userManager->createUser();
$user->setUsername('username');
$user->setEmail('email@domain.com');
$user->setPlainPassword('password');
//$user->setPassword('encrypted_password');
$user->setEnabled(true);
$user->setRoles(array('ROLE_ADMIN'));

// Update the user
$userManager->updateUser($user, true);

然后你可以用这个验证用户:

$token = new UsernamePasswordToken(
$user,
$user->getPassword(),
'secured_area',
$user->getRoles()
);

$this->get('security.context')->setToken($token);

$request->getSession()->set('_security_secured_area', serialize($token));

编辑:

$token = new UsernamePasswordToken($user, $user->getPassword(), "secured_area", $user->getRoles());
$this->get("security.context")->setToken($token);

$event = new InteractiveLoginEvent($request, $token);
$this->get("event_dispatcher")->dispatch("security.interactive_login", $event);

您可以用更传统的方式这样做,如果它有助于获得正确的防火墙,请告诉我。

顺便说一句,我不确定这是否已经在您的 symfony 版本中,但是有一个更简单的方法:

https://github.com/symfony/symfony/pull/13062

关于php - symfony2 以编程方式验证用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29216670/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com