2012-09-20 11 views
7

私はSymfony2を使用してサイトを構築しています。これは複数のドメインが同じサーバーにマップされるホワイトラベルタイプのサイトになります。したがって、coolsite.customer1.comとaservice.customer2.comは同じサイトにマップされますが、エンドユーザーとは異なるようにする必要があります。私はすでにドメインを解決し、ユニークな設定をサービスとしてロードしています。FOS用UserProviderを拡張するUserBundle

domain1のユーザーがdomain2にもログインできるという点を除いて、FOS UserBundleを設定してカスタムユーザー(domain_idが格納されている)で実行すると、registration、loginなどは正常に動作します。これは、FOS UserBundleで期待されています。バンドルに変更を加えて、割り当てられているドメイン上のユーザーのみを認証するようにする必要があります。

FOSで元のuserProviderを拡張し、ドメインを確認するloadUserByUsernameメソッドをオーバーライドしたuserProviderを作成しました。下記を参照してください:

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

上で人の変更をもと』。」何か案は?私はこれを徹底的に困惑している。

+1

私はfirewalls/main/form_loginセクションのプロバイダを更新するのを忘れていたので、プロバイダの変更された名前を取得できました。これで、ログインプロセスは変更を加えず、指定したプロバイダが呼び出されていない場合とまったく同じように動作します。私はそれがコンストラクタでエコーと終了コマンドをドロップすることによって呼び出されていないことを確認することができました。 – Wpigott

+0

私はそれを解決することができました。私は8時間私の質問に答えることができないので、私はそれをその時点で解決してマークし、それを解決する方法を投稿します。 – Wpigott

答えて

6

私はそれを働かせることができました。私は、 "id"を私が使っていたサービスの名前と同じにする必要があったことが分かります。コメント行は、バンドルに付属しているオリジナルです。

security: 
    providers: 
     me.security.authentication.userprovider: 
      id: me.security.authentication.userprovider 
     #fos_userbundle: 
      #id: fos_user.user_provider.username 
関連する問題