我正在研究多租户应用程序,我需要完成一些规则来检查用户何时可以进行身份验证(我不是在讨论角色,尝试登录时应该返回“无效的用户名或密码”)。
我的问题是:这些额外检查的最佳位置在哪里?
我认为你最好的选择是阅读FosUserBundle中的用户相关课程。我通过在UserManager.php中添加自定义方法制作了许多内容
FOS调用许多链式方法,您可以浏览这些文件并根据需要进行更改
另外请注意
UserListerner.php
User.php
这取决于您打算执行的检查类型,但一般来说,最好的方法是使用自定义安全选民。
官方文档中有一个示例显示如何实施IP黑名单:http://symfony.com/doc/current/cookbook/security/voters.html
问题是陈旧的,但我认为仍然非常相关。答案帮助我走上正确的道路(FOSUserBundle 2.0与Symfony 3.3) - 如果有人还在寻找,这里有更多细节https://symfony.com/doc/master/bundles/FOSUserBundle/user_manager.html
这部分对我来说很关键:
您可以通过定义实现
FOS\UserBundle\Model\UserManagerInterface
的服务并在配置中设置其ID来替换用户管理器的默认实现。默认实现的id是fos_user.user_manager.default
fos_user: # ... service: user_manager: custom_user_manager_id
您的自定义实现可以扩展
FOS\UserBundle\Model\UserManager
以重用通用逻辑。
在我的情况下,我只是将整个FOS\UserBundle\Doctrine\UserManager
(扩展FOS\UserBundle\Model\UserManager
)复制到我的AppBundle\Services
作为我的起点。
我还必须从这里复制注射:vendor/friendsofsymfony/user-bundle/Resources/config/doctrine.xml