2017-05-17 5 views
1

私は、顧客が特定のデータモデルに従うように要求するマルチテナントアプリケーションを実装しています。お客様は、ガードシステムを使用して実装している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 } 

私はここで何をしないのですか?

答えて

1

問題を解決しました!グーグルがグーグルで答えを見つけることができるように更新しました。

security.ymlファイルのprovidersセクションにmanager_nameプロパティがないために問題が発生しました。このプロパティは、プロバイダから特定のentity_managerへのマッピングを提供します。これらがなければ、Symfonyは最初の(またはデフォルトの)エンティティマネージャをとり、それは私のシナリオでは失敗します(明らかに)。

providers: 
    app: 
     entity: 
      class: AppBundle\Entity\App\User 
      property: username 
      manager_name: app 

    admin: 
     entity: 
      class: AppBundle\Entity\Login\Admin\AdminUser 
      property: login 
      manager_name: admin 

本のスパースドキュメントはここで見つけることができます:http://symfony.com/doc/current/security/entity_provider.html

関連する問題