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?