我跟随此tutorial(如何使用API密钥验证用户)在我的应用程序中实现api密钥。
我使用我的用户存储库类,该类是基于此tutorial(如何从数据库加载安全用户)创建的,作为预身份验证过程中所需的用户提供程序,因为该类我已经在下面的教程中使用了用户提供程序描述的方法,即loadUserByUsername()
,refreshUser()
和supportsClass()
。
Symfony调用我的apikey_authenticator
服务,该服务需要用户提供程序作为参数。因此,我已经配置了另一个名为userprovider
的服务,这是我的用户存储库类,如下所示:
services:
apikey_authenticator:
class: MyBundle\Security\ApiKeyAuthenticator
arguments: ["@userprovider"]
userprovider:
class: MyBundle\Entity\UserRepository
但我的用户存储库类依赖于实体管理器,我不知道如何注入。我的学说配置是symfony附带的默认配置:
# Doctrine Configuration
doctrine:
dbal:
driver: "%database_driver%"
host: "%database_host%"
port: "%database_port%"
dbname: "%database_name%"
user: "%database_user%"
password: "%database_password%"
charset: UTF8
orm:
auto_generate_proxy_classes: "%kernel.debug%"
auto_mapping: true
我该如何解决这个问题?在这种情况下,使用用户存储库类作为用户提供程序是一个好主意吗?
答案 0 :(得分:2)
使用工厂创建Doctrine实体存储库。这是一个例子:
cerad_game__game_repository__doctrine:
class: Cerad\Bundle\GameBundle\Doctrine\EntityRepository\GameRepository
factory_service: 'doctrine.orm.default_entity_manager'
factory_method: 'getRepository'
arguments:
- 'Cerad\Bundle\GameBundle\Doctrine\Entity\Game'
这是个好主意吗?将存储库注入UserProvider类可能更清晰,而不是使用UserProvider方法使存储库混乱。但无论哪种方式都有效。
答案 1 :(得分:1)
只是想添加我的2c,因为我也按照你提到的那些指南。
我已经定义了Authenticator和provider类。验证者只进行必要的安全检查,提供者处理数据库连接(例如,通过令牌返回用户)。
在我的提供者的__construct中,我有这个:
protected $em;
protected $repositoryClass = 'myrepoclass';
protected $repository;
public function __construct(EntityManager $em) {
$this->em = $em;
$this->repository = $this->em->getRepository($this->repositoryClass);
}
现在我可以调用像$ this-> repository-> findOneById($ id)这样的查询; 我明确定义了存储库类,因为如果需要我可以更容易地切换到其他实体(我认为这可能是错误的思考)。
在我的服务档案中,我有:
api_user_provider:
class: "%api_user_provider.class%"
arguments: ["@doctrine.orm.entity_manager"]
api_user_authenticator:
class: "%api_user_authenticator.class%"
arguments: ["@api_user_provider"]
提供者类与实体类不同(至少对我来说)。我将它们分开了,因为我认为它更清洁。
嗯,这就是我如何设定的。希望这会有所帮助:)
编辑:由于我创建了一个单独的包(ApiBundle和UserBundle),我将提供者与实体类分开。我还跟踪了来自数据库'的加载安全用户。教程,这是我想出来实现API令牌认证的最后一件事。虽然您的存储库中已经有相同的方法,但我仍然认为最好将它与您的存储库类分开(当然这取决于您的需求),因为我觉得它更清晰。当然,决定取决于你该做什么:)