我正在实施一个多租户应用程序,客户要求我遵循特定的数据模型。客户需要使用防护系统实现的两个单独的登录系统。
第一个用于登录客户。这里的困难在于需要将用户密码存储在客户的数据库中。为了实现这一点,我实现了防护系统,首先在“登录”数据库中查找用户名。从同一数据库中检索用户应用程序数据库的(加密)连接参数。使用这些参数,动态创建用户应用程序数据库连接('app'),并使用此应用程序数据库中的信息登录用户。在后续页面请求中,用户应用程序数据库使用每个页面加载上的触发器上的服务动态连接。到目前为止一切都很好。
第二个Guard系统用于登录后端以执行管理任务。此登录系统实际上更简单,并使用单个数据库'admin_login'来验证用户凭据。 (因此用户名,密码和所有其他用户属性都在一个数据库中)。成功登录第二个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 }
我在这里缺少什么?
答案 0 :(得分: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