【问题标题】:Symfony 3.2 Multi tenant application with multiple Guard entry pointsSymfony 3.2 具有多个 Guard 入口点的多租户应用程序
【发布时间】:2017-05-17 08:44:24
【问题描述】:

我正在实施一个多租户应用程序,客户要求我遵循特定的数据模型。客户需要我使用警卫系统实施的两个单独的登录系统。

第一个用于登录客户。这里的困难是需要将用户密码存储在客户的数据库中。为此,我实施了警卫系统,以首先在“登录”数据库中查找用户名。从同一个数据库中检索用户应用程序数据库的(加密的)连接参数。使用这些参数,动态创建用户应用程序数据库连接(“app”),并使用此应用程序数据库中的信息登录用户。在随后的页面请求中,用户应用程序数据库在每个页面加载时使用触发器上的服务动态连接。到目前为止一切顺利。

第二个Guard系统用于登录后台进行管理任务。这个登录系统实际上要简单得多,它使用单个数据库“admin_login”来验证用户凭据。 (因此用户名、密码和所有其他用户属性都在一个数据库中)。成功登录 2nd 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 }

我在这里错过了什么?

【问题讨论】:

    标签: symfony symfony-3.2


    【解决方案1】:

    问题解决了!只是一个更新,以便每个人在谷歌搜索时都能找到答案。

    该问题是由 security.yml 文件的 providers 部分中缺少 manager_name 属性引起的。此属性提供从提供者到特定实体管理器的映射。如果没有这些 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

    【讨论】:

      猜你喜欢
      • 2016-06-08
      • 2013-03-24
      • 1970-01-01
      • 1970-01-01
      • 2015-12-16
      • 2014-02-10
      • 1970-01-01
      • 2013-09-13
      • 1970-01-01
      相关资源
      最近更新 更多