Laravel迁移需要以特别高的权限运行,因为它们执行DDL操作。我想以命名用户的身份运行迁移,而无需在任何地方存储密码。这将需要在从命令行运行迁移时提示用户输入密码。我找不到任何通过连接配置实现这一点的方法。如何在运行Laravel 5迁移时提示输入数据库密码
有没有办法通过连接配置实现这一点?
如果没有,是否有办法用顶层的自定义代码薄层来执行迁移,以自定义的方式建立数据库连接?例如编写一个执行提示的脚本/工匠命令,连接到数据库,然后将其余部分委托给Laravel的现有迁移代码?
Laravel迁移需要以特别高的权限运行,因为它们执行DDL操作。我想以命名用户的身份运行迁移,而无需在任何地方存储密码。这将需要在从命令行运行迁移时提示用户输入密码。我找不到任何通过连接配置实现这一点的方法。如何在运行Laravel 5迁移时提示输入数据库密码
有没有办法通过连接配置实现这一点?
如果没有,是否有办法用顶层的自定义代码薄层来执行迁移,以自定义的方式建立数据库连接?例如编写一个执行提示的脚本/工匠命令,连接到数据库,然后将其余部分委托给Laravel的现有迁移代码?
如果你的要求是只要求数据库凭据的用户才能运行迁移,那么这可以很容易地通过,要求适当凭据的另一个命令中包裹artisan migrate
命令来实现的。所以,下面的步骤应该足够了:
1.创建新的命令:
artisan make:console MigratePrivilegedCommand --command="migrate:privileged"
2.添加必要的代码来处理用户输入并运行新的命令类的迁移:
class MigratePrivilegedCommand extends Command
{
protected $signature = 'migrate:privileged';
protected $description = 'Run migrations as a priviledged database user.';
public function __construct()
{
parent::__construct();
}
public function handle()
{
// Set the username and password for the
// database connection from user input
config([
'database.connections.mysql.username' => $this->ask('What is your username?'),
'database.connections.mysql.password' => $this->secret('What is your password?')
]);
// Call the migrate command and you're done
$this->call('migrate');
}
}
注册在App\Console\Kernel.php
新的命令:
protected $commands = [
...
\App\Console\Commands\MigratePrivilegedCommand::class,
];
现在你可以运行需要这个权限的数据库凭据迁移:
php artisan migrate:privileged
好的。但如果该用户只使用'php artisan migration'命令呢? –
@AlexeyMezenin然后,迁移将失败,因为缺省配置的数据库连接用户缺少数据库特权。 – Bogdan
仍然不明白。有默认的mysql(例如)设置,如果没有这些默认设置,应用程序将无法工作。这些默认值由'migrate'命令使用。用户仍然可以访问'migrate'命令。那么,为什么用户不能只使用'migrate'命令呢? –
您可以在配置文件中设置不带任何密码的自定义连接,并通过CLI命令传递密码以运行迁移。
在database.php中配置
'connection_without_password' => [
'driver' => 'mysql',
'host' => 'hostname,
'database' => 'database',
'username' => '$username',
'password' => '$password',
'charset' => 'utf8',
'collation' => 'utf8_unicode_ci',
'prefix' => '',
'strict' => false,
],
Schema类包括连接名称的选项。
Schema::connection('connection_without_password')->create('users', function ($table) {
$table->increments('id');
});
所以,你想用从'配置/ database.php'已经配置的连接,但指定不同的数据库用户和密码从控制台运行迁移? – Bogdan