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

2cmtqfgy  于 2023-01-18  发布在  其他
关注(0)|答案(3)|浏览(217)

我有一个Laravel应用程序,运行良好,但由于一些奇怪的原因,日志文件中有很多奇怪的消息:
[2019 - 10 - 04 10:24:21]生产错误:SQLSTATE [HY000][1045]用户"forge'@" localhost"的访问被拒绝(使用密码:否){"异常":"[对象](Doctrine\DBAL\驱动程序\PDOException(代码:1045):SQLSTATE [HY000][1045]用户'forge'@' localhost'的访问权限被拒绝(使用密码:否),网址为/var/www/html/pzw_prod/供应商/教义/dbal/lib/教义/DBAL/驱动程序/PDO连接。php:31,PDO异常(代码:1045):SQLSTATE [HY000][1045]用户'forge'@' l ocalhost'的访问被拒绝(使用密码:否),位于/var/www/html/pzw_prod/供应商/学说/dbal/lib/学说/数据库应用程序/驱动程序/PDF连接。
问题是,我没有使用名为forge的用户连接到数据库。我的.env使用完全不同的登录名。而且,我重复一遍,一切正常:与数据库的通信按预期工作。数据正在成功读取和写入。
那...为什么日志文件里有这条消息
更新:
config('database')

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

更新2:
看起来'forge'是某种默认登录。看起来有时候Laravel没有使用.env中的值。我该如何调试这个?

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

tzxcd3kk1#

过去几天我遇到了同样的问题,我想我解决了它:
由于某种原因,.env中的设置并不总是被使用,偶尔Laravel只会使用config/app.phpconfig/database.php中的默认设置。
config/app.php

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

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,
],

localhostdatabaseusernamepassword更改为.env中的实际设置。
此示例适用于MySQL。如果您使用其他数据库引擎,请改为使用这些变量。
可能有一个更好的解决方案(更安全?),但这是到目前为止阻止错误出现的原因。

f2uvfpb9

f2uvfpb92#

在一个多线程的Web服务器中,两个PHP示例共享相同的环境变量,这是一个问题,因为进程A可能会关闭并在进程B运行时将其ENV变量设置为null,那么当进程B请求ENV变量时,它将返回null,这就是为什么env('DB_DATABASE','forge')有时会导致forge,而其他时候会导致正确的ENV。
更多信息请点击这里,这里和这里
一种解决方案是停止运行线程化Web服务器(即使您使用线程安全PHP might run functions that are not thread safe进行编译)。
但快速简单地解决问题的方法是运行以下命令:

php artisan config:cache

这将缓存ENV和config,从而避免了这个问题(当配置被缓存时,laravel将不会调用getenv/putenv).缺点是您必须在更改环境变量或配置时运行此命令.
我发现的另一个解决方案是将这一行放在bootstrap/app.php文件中:

\Illuminate\Support\Env::disablePutenv();
esbemjvw

esbemjvw3#

另一种解决方案是:在我的例子中,.env文件对于php用户来说是不可读的,所以把.env文件改为公共只读就解决了这个问题(chmod 664)。

相关问题