私は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』存在しないサービスに依存している 『
上で人の変更をもと』。」何か案は?私はこれを徹底的に困惑している。
私はfirewalls/main/form_loginセクションのプロバイダを更新するのを忘れていたので、プロバイダの変更された名前を取得できました。これで、ログインプロセスは変更を加えず、指定したプロバイダが呼び出されていない場合とまったく同じように動作します。私はそれがコンストラクタでエコーと終了コマンドをドロップすることによって呼び出されていないことを確認することができました。 – Wpigott
私はそれを解決することができました。私は8時間私の質問に答えることができないので、私はそれをその時点で解決してマークし、それを解決する方法を投稿します。 – Wpigott