我正在使用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“。”
我的修改基于This Cookbook Recipe
有什么想法吗?我对此非常感到难过。
答案 0 :(得分:6)
我能够让它发挥作用。结果我需要使“id”与我正在使用的服务名称相同。注释行是捆绑包附带的原件。
security:
providers:
me.security.authentication.userprovider:
id: me.security.authentication.userprovider
#fos_userbundle:
#id: fos_user.user_provider.username