为了账号安全,请及时绑定邮箱和手机立即绑定

更改内存提供程序的默认用户对象

更改内存提供程序的默认用户对象

PHP
UYOU 2023-07-08 21:45:50
我只是想更改User内存提供程序的默认对象。默认User对象是Symfony\Component\Security\Core\User\User. 但这个对象不满足我的要求,所以我复制了该对象并添加了一些满足我的要求的属性,然后将其命名为并按InMemoryUser如下方式使用:encoders:    App\Component\Security\Core\User\InMemoryUser: plaintext然后我在尝试运行该应用程序时收到以下错误。No encoder has been configured for account "App\Component\Security\Core\User\InMemoryUser"经过大约半个小时的调查,我发现了这个问题。Symfony\Component\Security\Core\User\InMemoryUserProviderSymfony默认调用并使用Symfony\Component\Security\Core\User\User对象在方法中创建内存用户__construct。InMemoryUserProvider然后我尝试按如下方式覆盖默认值。services:    App\Component\Security\Core\User\CustomInMemoryUserProvider:        decorates: security.user.provider.concrete.api_user_provider        arguments:            $users: []  # this should be contains in-memory users defined in the security.yaml but i dont know how to do that.$users这工作正常,除了一个小问题,不像 那样注入InMemoryUserProvider。通常,$users包含定义在内存中的用户列表security.yaml。现在,我如何$users为我的对象注入CustomInMemoryUserProvider,这是更改User对象的好习惯吗InMemoryProvider?感谢您提前的答复。我就symfony 5.1顺便用一下
查看完整描述

1 回答

?
森林海

TA贡献2011条经验 获得超2个赞

我从未完全解开正确装饰其构造函数由 DI 扩展动态注入的服务的谜团。


但是,在这种情况下,您真正需要做的就是更改内存提供程序的类,这可以在内核中的编译器传递中完成:


# src\Kernel.php

use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;

use App\User\InMemoryUserProvider;

class Kernel extends BaseKernel implements CompilerPassInterface

...

    public function process(ContainerBuilder $container)

    {

        $id = 'security.user.provider.in_memory';

        $container->getDefinition($id)->setClass(InMemoryUserProvider::class);

    }

在测试此功能时,我最初尝试扩展内存提供程序中的现有核心,但它使用无法覆盖的私有方法。所以我只是重新实现了完整的接口


namespace App\User;

class InMemoryUserProvider implements UserProviderInterface

{

    public function __construct(array $users)

    {

        dump($users); // Confirms get the users from security.yaml

    }

    public function loadUserByUsername(string $username)

    {

        // TODO: Implement loadUserByUsername() method.

        echo "Get User {$username}\n";

    }

确认它已按预期接线:


bin/console debug:container | grep UserProv                                               

  App\User\InMemoryUserProvider = App\User\InMemoryUserProvider                                                                   

  Symfony\Component\Security\Core\User\UserProviderInterface = alias for "security.user.provider.concrete.users_in_memory"                                                                                                                    

  security.user.provider.concrete.users_in_memory = App\User\InMemoryUserProvider                                                                   

  security.user.provider.in_memory = App\User\InMemoryUserProvider                                                                                  

并发出一个命令来验证它是否按预期工作:


class UserProviderCommand extends Command

{

    protected static $defaultName = 'user:provider';


    private $userProvider;


    public function __construct(UserProviderInterface $userProvider)

    {

        parent::__construct();

        $this->userProvider = $userProvider;

    }


    protected function execute(InputInterface $input, OutputInterface $output): int

    {

        echo "User Provider: " . get_class($this->userProvider) . "\n";

        $this->userProvider->loadUserByUsername('xxx');

        return 0;

    }

}


查看完整回答
反对 回复 2023-07-08
  • 1 回答
  • 0 关注
  • 110 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信