gpt4 book ai didi

symfony - 扩展 FOS UserBundle 的 UserProvider

转载 作者:行者123 更新时间:2023-12-02 15:35:09 24 4
gpt4 key购买 nike

我正在使用 Symfony2 构建一个站点,它将是一个白标签类型的站点,其中多个域映射到同一服务器。因此,coolsite.customer1.com 和 aservice.customer2.com 将映射到同一站点,但需要对最终用户显示不同。我已经解决了域问题,并将独特的配置加载为服务。

通过设置 FOS UserBundle 并使用自定义用户(其中​​存储了domain_id)运行,注册、登录等工作正常,只是来自domain1的用户也可以登录到domain2。这是 FOS UserBundle 中所期望的。我需要对 bundle 进行修改,以便它仅对用户分配到的域上的用户进行身份验证。

我创建了一个 userProvider,它扩展了 FOS 中的原始 userProvider,并重写了 loadUserByUsername 方法来检查域。见下文:

use FOS\UserBundle\Security\UserProvider as FOSProvider;
use Symfony\Component\DependencyInjection\ContainerInterface;
use FOS\UserBundle\Model\UserManagerInterface;
use Me\CoreBundle\Models\Core;

class UserProvider extends FOSProvider {

/**
*
* @var ContainerInterface
*/
protected $container;


public function __construct(UserManagerInterface $userManager, ContainerInterface $container) {
parent::__construct($userManager);
$this->container = $container;
}

/**
* {@inheritDoc}
*/
public function loadUserByUsername($username)
{
$core = $this->container->get('me_core');
/* @var $core Core */

$user = $this->findUserBy(array(
'username'=>$username,
'domain_id'=>$core->getDomainMap()->getId(),
));

if (!$user) {
throw new UsernameNotFoundException(sprintf('Username "%s" does not exist.', $username));
}

return $user;
}

public function findUserBy(array $criteria) {
return $this->userManager->findUserBy($criteria);
}

}

我已使用以下内容配置了服务。

services:
me.security.authentication.userprovider:
class: Me\UserBundle\Security\UserProvider
arguments:
- @fos_user.user_manager
- @service_container

我的 security.yml 如下所示:

security:
providers:
me.security.authentication.userprovider:
id: fos_user.user_provider.username

encoders:
FOS\UserBundle\Model\UserInterface: sha512

firewalls:
main:
pattern: ^/
form_login:
provider: fos_userbundle
csrf_provider: form.csrf_provider
logout: true
anonymous: true

access_control:
- { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/_wdt, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/public, role: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin/, role: ROLE_ADMIN }
- { path: ^/, role: ROLE_USER }

role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: ROLE_ADMIN

当我尝试访问该网站时发生的情况是一个异常(exception)。 “ServiceNotFoundException:服务“security.authentication.manager”依赖于不存在的服务“security.user.provider.concrete.fos_userbundle”。

我的修改基于 This Cookbook Recipe

有什么想法吗?我完全被这个问题难住了。

最佳答案

我能够让它工作。结果我需要使“id”与我正在使用的服务的名称相同。注释行是 bundle 中附带的原始行。

security:
providers:
me.security.authentication.userprovider:
id: me.security.authentication.userprovider
#fos_userbundle:
#id: fos_user.user_provider.username

关于symfony - 扩展 FOS UserBundle 的 UserProvider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12516853/

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