7

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

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

我创建了一个 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

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

我的修改基于这个食谱食谱

有任何想法吗?我对此感到非常困惑。

4

1 回答 1

6

我能够让它工作。原来我需要使“id”与我正在使用的服务的名称相同。注释行是捆绑包中的原件。

security:
    providers:
        me.security.authentication.userprovider:
            id: me.security.authentication.userprovider
        #fos_userbundle:
            #id: fos_user.user_provider.username
于 2012-09-21T20:22:07.543 回答