私は、顧客が特定のデータモデルに従うように要求するマルチテナントアプリケーションを実装しています。お客様は、ガードシステムを使用して実装している2つの別個のログインシステムが必要でした。Symfony 3.2複数のGuardエントリポイントを持つマルチテナントアプリケーション
最初のものは、顧客にログインするために使用されます。ここでの難しさは、ユーザーのパスワードを顧客のデータベースに格納する必要があることです。これを実現するために、私は実装をガードシステムが最初に 'ログイン'データベースのユーザー名を検索する。その同じデータベースから、ユーザーアプリケーションデータベースの(暗号化された)接続パラメーターが検索されます。これらのパラメータを使用して、ユーザーアプリケーションデータベース接続が動的に作成され( 'app')、ユーザーはこのアプリケーションデータベースの情報を使用してログインします。後続のページ要求では、ユーザーアプリケーションデータベースは、各ページロードのトリガー上のサービスを使用して動的に接続されます。ここまでは順調ですね。
第2のGuardシステムは、管理タスク用のバックエンドにログインするために使用されます。このログインシステムは、実際にはるかに簡単で、単一のデータベース 'admin_login'を使用してユーザーの資格情報を確認します。 (したがって、ユーザー名、パスワード、および他のすべてのユーザープロパティは単一のデータベースにあります)。この問題は、第2 Guard実装に正常にログインした後に発生します。バックエンドのホームページに転送するとエラーが発生し、これを見つけることができません。
エラーメッセージがある:
The class 'AppBundle\Entity\Login\Admin\AdminUser' was not found in the chain configured namespaces AppBundle\Entity\App
エラーは、対応するコントローラからの任意のコードがヒットさ前トリガー。 'intercept_redirects'設定項目をtrueに設定すると、リダイレクトが行われる前に管理ユーザーが完全に承認されていることがわかります。
config.yml
# Doctrine Configuration
doctrine:
dbal:
default_connection: app # specify the connexion used by default
connections:
login:
driver: pdo_mysql
host: '%database_login_host%'
port: '%database_login_port%'
dbname: '%database_login_name%'
user: '%database_login_user%'
password: '%database_login_password%'
charset: utf8mb4
admin_login:
driver: pdo_mysql
host: '%database_admin_host%'
port: '%database_admin_port%'
dbname: '%database_admin_name%'
user: '%database_admin_user%'
password: '%database_admin_password%'
charset: utf8mb4
app:
driver: pdo_mysql
host: '%database_app_host%'
port: '%database_app_port%'
dbname: '%database_app_name%'
user: '%database_app_user%'
password: '%database_app_password%'
charset: utf8mb4
orm:
auto_generate_proxy_classes: "%kernel.debug%"
default_entity_manager: app # specify the EM used by default (when using console commands f.e)
entity_managers:
login:
connection: login
naming_strategy: doctrine.orm.naming_strategy.underscore
auto_mapping: false
mappings:
AppBundle :
type: annotation
dir: Entity/Login/Customer
prefix: AppBundle\Entity\Login\Customer
alias: Login
app:
connection: app
naming_strategy: doctrine.orm.naming_strategy.underscore
auto_mapping: false
mappings:
AppBundle :
type: annotation
dir: Entity/App
prefix: AppBundle\Entity\App
alias: App
filters:
customer_flt:
class: AppBundle\Security\CustomerFilter
admin:
connection: admin_login
naming_strategy: doctrine.orm.naming_strategy.underscore
auto_mapping: false
mappings:
AppBundle :
type: annotation
dir: Entity/Login/Admin
prefix: AppBundle\Entity\Login\Admin
alias: Admin
で私の教義構成
私のsecurity.yml
security:
encoders:
AppBundle\Entity\App\User:
algorithm: bcrypt
cost: 12
AppBundle\Entity\Login\Admin\AdminUser:
algorithm: bcrypt
cost: 12
role_hierarchy:
ROLE_SUPER_ADMIN: ROLE_ADMIN
ROLE_ADMIN: ROLE_USER
# http://symfony.com/doc/current/security.html#b-configuring-how-users-are-loaded
providers:
app:
entity:
class: AppBundle\Entity\App\User
property: username
admin:
entity:
class: AppBundle\Entity\Login\Admin\AdminUser
property: login
firewalls:
# disables authentication for assets and the profiler, adapt it according to your needs
dev:
pattern: ^/(_(profiler|wdt)|css|images|js)/
security: false
main:
pattern: ^/app
anonymous: ~
guard:
authenticators:
- app.security.login_form_authenticator
logout:
path: /app/logout
target:/
provider: app
admin:
pattern: ^/admin
anonymous: ~
guard:
authenticators:
- backend.security.login_form_authenticator
logout:
path: /admin/logout
target:/
provider: admin
access_control:
- { path: ^/admin/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/admin, roles: ROLE_SUPER_ADMIN }
- { path: ^/app/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
- { path: ^/app, roles: ROLE_USER }
私はここで何をしないのですか?