symfony2以编程方式验证用户

x2df2na

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

它通过api密钥工作并授权用户,并将身份验证成功存储在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);

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

能否请别人告诉我我做错了什么?(:

更新:

通过上述方法完成身份验证后,会话令牌将存储在“默认”防火墙下。

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”防火墙?如何正确强制使用“ secured_area”?

纳瓦尔·瑟拉尔(Nawfal Serrar)

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

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

// Create our user and set details
$user = $userManager->createUser();
$user->setUsername('username');
$user->setEmail('[email protected]');
$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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章