2017-05-17 3 views
1

Ich implementiere eine Multi-Tenant-Anwendung, bei der der Kunde ein bestimmtes Datenmodell verwenden muss. Der Kunde benötigte zwei separate Login-Systeme, die ich mit dem Guard-System implementiere.Symfony 3.2 Multi-Tenant-Anwendung mit mehreren Guard-Einstiegspunkten

Die erste wird zum Anmelden von Kunden verwendet. Die Schwierigkeit besteht darin, dass die Benutzerkennwörter in der Kundendatenbank gespeichert werden müssen. Um dies zu erreichen, habe ich die Implementierung des Schutzsystems, um zuerst den Benutzernamen in der 'Login'-Datenbank nachzuschlagen. Aus derselben Datenbank werden die (verschlüsselten) Verbindungsparameter für die Benutzeranwendungsdatenbank abgerufen. Mit diesen Parametern wird die Verbindung der Benutzeranwendungsdatenbank dynamisch erstellt ('app') und der Benutzer wird mit den Informationen in dieser Anwendungsdatenbank angemeldet. Bei nachfolgenden Seitenanforderungen wird die Benutzeranwendungsdatenbank dynamisch über einen Dienst für Trigger bei jedem Seitenladen verbunden. So weit, ist es gut.

Das zweite Guard-System wird verwendet, um sich für Verwaltungsaufgaben am Backend anzumelden. Dieses Anmeldesystem ist eigentlich viel einfacher und verwendet eine einzige Datenbank 'admin_login', um die Anmeldeinformationen der Benutzer zu überprüfen. (Also sind Benutzername, Passwort und alle anderen Benutzereigenschaften in einer einzigen Datenbank). Das Problem tritt auf, nachdem Sie sich erfolgreich bei der 2. Guard-Implementierung angemeldet haben. Die Weiterleitung an die Backend-Homepage löst einen Fehler aus und ich kann keine Ursache dafür finden.

Die Fehlermeldung ist:

The class 'AppBundle\Entity\Login\Admin\AdminUser' was not found in the chain configured namespaces AppBundle\Entity\App 

Der Fehler auslöst, bevor jeder Code von dem entsprechenden Controller getroffen wird. Wenn ich das Konfigurationselement 'intercept_redirects' auf 'true' setze, kann ich sehen, dass der Benutzer mit Verwaltungsaufgaben vollständig autorisiert ist, bevor die Weiterleitung stattfindet.

Meine Lehre Konfiguration in 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 

Mein 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 } 

Was bin ich hier?

Antwort

1

Problem gelöst! Nur ein Update, damit jeder beim googlen die Antwort finden kann.

Das Problem wurde durch eine fehlende Eigenschaft manager_name im Abschnitt Provider der Datei security.yml verursacht. Diese Eigenschaft bietet eine Zuordnung von einem Provider zu einem bestimmten Entity_manager. Ohne diese nimmt Symfony den ersten (oder Standard) Entity Manager und das scheitert (offensichtlich) in meinem Szenario.

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 

Sparse Dokumentation dieser ist hier zu finden: http://symfony.com/doc/current/security/entity_provider.html

Verwandte Themen