Laravel:用户“forge”@“localhost”的访问被拒绝(但应用程序中没有使用此类用户)

Grz*_*ski 6 laravel laravel-5

我有一个运行良好的 Laravel 应用程序,但由于某些奇怪的原因,日志文件中有很多奇怪的消息:

\n\n
\n

[2019-10-04 10:24:21] Production.ERROR: SQLSTATE[HY000] [1045] 用户\'forge\'@\'localhost\'访问被拒绝(使用密码:NO){“例外”:“ [object] (Doctrine\\DBAL\\Driver\\PDOException(code: 1045): SQLSTATE[HY000] [1045] 用户\'forge\'@\'localhost\' 的访问被拒绝(使用密码:NO) /var/www/html/pzw_prod/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:31,PDOException(代码:1045):SQLSTATE [HY000] [1045]用户\'forge的访问被拒绝\'@\'l ocalhost\'(使用密码:NO)位于 /var/www/html/pzw_prod/vendor/doctrine/dbal/lib/Doctrine/DBAL/Driver/PDOConnection.php:27)

\n
\n\n

问题是,我没有使用名为 的用户连接到数据库forge。我.env使用完全不同的登录名。而且,我再说一遍,一切正常:与数据库的通信按预期工作。数据读写成功。

\n\n

那么...为什么日志文件中出现此消息?

\n\n

更新:

\n\n

config(\'database\')

\n\n
$ php artisan tinker\nPsy Shell v0.9.9 (PHP 7.2.22 \xe2\x80\x94 cli) by Justin Hileman\n>>> config(\'database\')\n=> [\n     "default" => "mysql",\n     "connections" => [\n       "sqlite" => [\n         "driver" => "sqlite",\n         "url" => null,\n         "database" => /* CENSORED */,\n         "prefix" => "",\n         "foreign_key_constraints" => true,\n       ],\n       "mysql" => [\n         "driver" => "mysql",\n         "url" => null,\n         "host" => "127.0.0.1",\n         "port" => "3306",\n         "database" => /* CENSORED */,\n         "username" => "prod_pzw",\n         "password" => /* CENSORED */,\n         "unix_socket" => "",\n         "charset" => "utf8",\n         "collation" => "utf8_unicode_ci",\n         "prefix" => "",\n         "prefix_indexes" => true,\n         "strict" => true,\n         "engine" => null,\n         "options" => [],\n       ],\n       "pgsql" => [\n         "driver" => "pgsql",\n         "url" => null,\n         "host" => "127.0.0.1",\n         "port" => "3306",\n         "database" => /* CENSORED */,\n         "username" => "prod_pzw",\n         "password" => /* CENSORED */,\n         "charset" => "utf8",\n         "prefix" => "",\n         "prefix_indexes" => true,\n         "schema" => "public",\n         "sslmode" => "prefer",\n       ],\n       "sqlsrv" => [\n         "driver" => "sqlsrv",\n         "url" => null,\n         "host" => "127.0.0.1",\n         "port" => "3306",\n         "database" => /* CENSORED */,\n         "username" => "prod_pzw",\n         "password" => /* CENSORED */,\n         "charset" => "utf8",\n         "prefix" => "",\n         "prefix_indexes" => true,\n       ],\n     ],\n     "migrations" => "migrations",\n     "redis" => [\n       "client" => "predis",\n       "options" => [\n         "cluster" => "predis",\n         "prefix" => /* CENSORED */,\n       ],\n       "default" => [\n         "url" => null,\n         "host" => "127.0.0.1",\n         "password" => null,\n         "port" => "6379",\n         "database" => 0,\n       ],\n       "cache" => [\n         "url" => null,\n         "host" => "127.0.0.1",\n         "password" => null,\n         "port" => "6379",\n         "database" => 1,\n       ],\n     ],\n   ]\n
Run Code Online (Sandbox Code Playgroud)\n\n

更新2:

\n\n

看来“forge”是某种默认登录。似乎有时 Laravel 不使用来自 的值.env。我该如何调试这个?

\n\n
$ cat config/database.php | grep -B 5 forge\n        \'mysql\' => [\n            \'driver\' => \'mysql\',\n            \'url\' => env(\'DATABASE_URL\'),\n            \'host\' => env(\'DB_HOST\', \'127.0.0.1\'),\n            \'port\' => env(\'DB_PORT\', \'3306\'),\n            \'database\' => env(\'DB_DATABASE\', \'forge\'),\n            \'username\' => env(\'DB_USERNAME\', \'forge\'),\n--\n        \'pgsql\' => [\n            \'driver\' => \'pgsql\',\n            \'url\' => env(\'DATABASE_URL\'),\n            \'host\' => env(\'DB_HOST\', \'127.0.0.1\'),\n            \'port\' => env(\'DB_PORT\', \'5432\'),\n            \'database\' => env(\'DB_DATABASE\', \'forge\'),\n            \'username\' => env(\'DB_USERNAME\', \'forge\'),\n--\n        \'sqlsrv\' => [\n            \'driver\' => \'sqlsrv\',\n            \'url\' => env(\'DATABASE_URL\'),\n            \'host\' => env(\'DB_HOST\', \'localhost\'),\n            \'port\' => env(\'DB_PORT\', \'1433\'),\n            \'database\' => env(\'DB_DATABASE\', \'forge\'),\n            \'username\' => env(\'DB_USERNAME\', \'forge\'),\n
Run Code Online (Sandbox Code Playgroud)\n

Vik*_*iya 16

过去几天我遇到了同样的问题,我想我已经解决了:

由于某种原因,中的设置.env并不总是被使用,有时 Laravel 只会使用 和 中的默认config/app.php设置config/database.php

config/app.php:

// Change the 'SomeRandomString' to the generated key from your .env
'key' => env('APP_KEY', 'SomeRandomString'),
 
'cipher' => 'AES-256-CBC',
Run Code Online (Sandbox Code Playgroud)

config/database.php

'mysql' => [
    'driver'    => 'mysql',
    'host'      => env('DB_HOST', 'localhost'),
    'database'  => env('DB_DATABASE', 'forge'),
    'username'  => env('DB_USERNAME', 'forge'),
    'password'  => env('DB_PASSWORD', ''),
    'charset'   => 'utf8',
    'collation' => 'utf8_unicode_ci',
    'prefix'    => '',
    'strict'    => false,
],
Run Code Online (Sandbox Code Playgroud)

localhost,,,更改为您的实际设置。databaseusernamepassword.env

此示例适用于MySQL如果您使用其他数据库引擎,请改为更改这些变量。

可能有更好的解决方案(更安全?),但这就是迄今为止阻止错误出现的原因。

  • 情况似乎是这样。但为什么会发生这种情况呢?你知道如何调试这个吗?我想删除日志文件中的消息而不覆盖“database.php”中的默认值 (4认同)