我正在开发一个使用 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();
}
如有任何帮助,我们将不胜感激。预先感谢。
我找到了一种让它发挥作用的方法。通过保留独白默认值,我在产品中根本没有调试(
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缓存,允许自动重新生成。这样做之后...一切正常!!!
我通过恢复独白更改并完全删除产品缓存来重现这一点。结果是“旧的”故障又回来了,所以我撤消了最新的更改,删除了缓存,并从一开始就恢复了正常工作。
所以,我想知道:当使用自定义查询登录时,产品的默认独白默认值是否始终工作?这可能是一个错误吗?我将这个问题留给开发人员或其他任何人来检查。