在 prod 环境中使用自定义查询时,symfony 5+ 中无法运行

问题描述 投票:0回答:1

我正在开发一个使用 user@domain 进行登录的应用程序,其中一个实体用于域,另一个实体用于链接到该域的用户。该应用程序是开源的,因此您可以从 https://github.com/omgslinux/vmail/ 自由克隆。所有测试均在 debian 下进行。

我从 symfony 3.x 开始,这些功能在开发中以及部署到生产时都有效(并且仍然有效)。然后,当升级到 5.x 和 6.x 时,使用自定义查询登录的升级方式发生了变化。我对新的登录系统进行了必要的更改,在开发中一切正常,但我发现在部署到产品时,有一个 100% 可重现的奇怪行为,但我不知道为什么会发生。

问题是,如果我使用 id == 0 的域中的任何用户登录,一切正常,但如果域 id != 0,我将被重定向到登录屏幕,就像登录错误一样,但没有错误信息。如果我手动输入应该重定向的网址,我将被重定向回登录。我在主页中转储了 $this->getUser() ,并使用相同的凭据,而在 dev 中返回用户实体,在 prod 中返回 null。如果我在访问主页之前将查询转储到存储库中,查询将返回预期的记录。

如果我强制输入错误的密码,我可以在屏幕上看到登录错误。

我已经通过将 APP_ENV var 设置为“prod”,使用 apache 和 nginx 对此进行了测试。如果我将 APP_ENV 设置为“dev”,则一切正常,包括底部的调试栏。

我已经在另外两台服务器中复制了产品部分,并得到了完全相同的结果。

重现结果:默认的 git 分支适用于 symfony 3.x,因此您必须克隆 symfony62 分支以获取最新更改。安装后,创建一个新域,然后在该新域中创建一个用户,并尝试使用该新用户登录。

这是 security.yaml:

security:
    password_hashers:
      App\Entity\User:
        id: App\Utils\PassEncoder
    providers:
        app_vmail_users:
            entity:
              class: App\Entity\User
    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        main:
            lazy: true
            provider: app_vmail_users
            #logout_on_user_change: true
            form_login:
              login_path: login
              check_path: login
              username_parameter: _username
              password_parameter: _password
            logout:
              path: logout
              target: /

    access_control:
        - { path: ^/login, roles: ['PUBLIC_ACCESS'] }
        - { path: ^/admin, roles: ['ROLE_ADMIN'] }
        - { path: ^/manage, roles: ['ROLE_MANAGER'] }
        - { path: ^/user, roles: ['ROLE_USER'] }
    role_hierarchy:
        ROLE_ADMIN: [ROLE_MANAGER, ROLE_USER]
        ROLE_MANAGER: [ROLE_USER]

以及用户存储库类中的加载器函数:

    public function loadUserByIdentifier(string $username): ?UserInterface
    {
        $a=explode('@', $username);
        if (count($a) != 2) {
            return null;
        }
        $user=$a[0];
        $domain=$a[1];
        return $this->createQueryBuilder('u')
            ->leftJoin('u.domain', 'd')
            ->where('u.name = :user AND d.name = :domain')
            ->setParameter('user', $user)
            ->setParameter('domain', $domain)
            ->getQuery()
            ->getOneOrNullResult();
    }

如有任何帮助,我们将不胜感激。预先感谢。

php apache authentication symfony nginx
1个回答
0
投票

我找到了一种让它发挥作用的方法。通过保留独白默认值,我在产品中根本没有调试(

config/monolog.yaml
):

when@prod:
    monolog:
        handlers:
            main:
                type: fingers_crossed
                action_level: error
                handler: nested
                excluded_http_codes: [404, 405]
                buffer_size: 50 # How many messages should be saved? Prevent memory leaks
            nested:
                type: stream
                path: php://stderr
                level: debug
                formatter: monolog.formatter.json
            console:
                type: console
                process_psr_3_messages: false
                channels: ["!event", "!doctrine"]
            deprecation:
                type: stream
                channels: [deprecation]
                path: php://stderr

由于在开发中我可以调试应用程序,因此我将“main”部分替换为相应的“dev”部分:

                type: stream
                path: "%kernel.logs_dir%/%kernel.environment%.log"
                level: debug
                channels: ["!event"]

在不删除缓存的情况下,我发现我开始在路径指示的产品中记录日志,并且由于应用程序中没有任何更改并且它正在“工作”,所以我没有执行其他操作。然后,我想到删除prod缓存,允许自动重新生成。这样做之后...一切正常!!!

我通过恢复独白更改并完全删除产品缓存来重现这一点。结果是“旧的”故障又回来了,所以我撤消了最新的更改,删除了缓存,并从一开始就恢复了正常工作。

所以,我想知道:当使用自定义查询登录时,产品的默认独白默认值是否始终工作?这可能是一个错误吗?我将这个问题留给开发人员或其他任何人来检查。

© www.soinside.com 2019 - 2024. All rights reserved.