如何在Laravel 7中为MySQL创建专属新数据库及用户并存储信息
实现步骤
1. 准备当前系统的数据存储模型
首先在负责生成凭证的Laravel系统中,创建用于存储数据库用户信息的数据表和模型:
生成迁移文件
执行Artisan命令创建迁移:
php artisan make:migration create_database_users_table
编辑迁移文件,定义表结构:
use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; return new class extends Migration { public function up() { Schema::create('database_users', function (Blueprint $table) { $table->id(); $table->string('username')->unique(); $table->string('database_name')->unique(); $table->string('password'); $table->timestamps(); }); } public function down() { Schema::dropIfExists('database_users'); } };
执行迁移:
php artisan migrate
创建对应模型
生成DatabaseUser模型:
php artisan make:model DatabaseUser
编辑模型文件,允许批量赋值:
namespace App\Models; use Illuminate\Database\Eloquent\Model; class DatabaseUser extends Model { protected $fillable = ['username', 'database_name', 'password']; }
2. 自动生成凭证并创建专属数据库/用户
创建一个服务类封装核心逻辑,避免控制器代码冗余:
namespace App\Services; use App\Models\DatabaseUser; use Illuminate\Support\Facades\DB; use Illuminate\Support\Str; class CreateExclusiveDatabaseService { public function execute() { // 1. 生成符合格式的随机凭证 $username = Str::lower(Str::random(4)); $databaseName = ucfirst($username) . 'DB'; $password = $username . 'Db' . Str::random(3, 'numeric'); // 2. 创建数据库(以MySQL为例) DB::statement("CREATE DATABASE IF NOT EXISTS `{$databaseName}`"); // 3. 创建专属用户并授予仅访问该库的权限 DB::statement("CREATE USER IF NOT EXISTS '{$username}'@'%' IDENTIFIED BY '{$password}'"); DB::statement("GRANT ALL PRIVILEGES ON `{$databaseName}`.* TO '{$username}'@'%'"); DB::statement("FLUSH PRIVILEGES"); // 4. 将凭证存入当前系统数据库 return DatabaseUser::create([ 'username' => $username, 'database_name' => $databaseName, 'password' => $password, ]); } }
在控制器中调用服务
创建控制器方法触发逻辑:
namespace App\Http\Controllers; use App\Services\CreateExclusiveDatabaseService; use Illuminate\Http\JsonResponse; class DatabaseProvisionController extends Controller { public function create(CreateExclusiveDatabaseService $service): JsonResponse { $credentials = $service->execute(); return response()->json($credentials); } }
添加路由(routes/api.php):
Route::post('/provision-database', [DatabaseProvisionController::class, 'create'])->middleware('auth:sanctum');
3. 另一个Laravel系统访问数据的配置
方式1:动态加载连接(推荐)
通过API从凭证存储系统获取信息,动态配置数据库连接:
use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\DB; // 从凭证系统获取数据(需携带API token验证) $response = Http::withToken('YOUR_API_TOKEN') ->get('https://your-credential-system.com/api/database-users/{id}'); $dbConfig = $response->json(); // 动态注册数据库连接 config(['database.connections.exclusive_db' => [ 'driver' => 'mysql', 'host' => env('DB_HOST'), 'database' => $dbConfig['database_name'], 'username' => $dbConfig['username'], 'password' => $dbConfig['password'], 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', ]]); // 使用动态连接查询数据 $data = DB::connection('exclusive_db')->table('target_table')->get();
方式2:静态配置连接
若已提前获取凭证,可直接在config/database.php中添加固定连接:
'connections' => [ // ... 原有连接 'samDB' => [ 'driver' => 'mysql', 'host' => env('DB_HOST'), 'database' => 'samDB', 'username' => 'sam', 'password' => 'samDb123', 'charset' => 'utf8mb4', 'collation' => 'utf8mb4_unicode_ci', 'prefix' => '', ], ],
调用时指定连接:
$data = DB::connection('samDB')->table('target_table')->get();
关键注意事项
- 确保当前系统的数据库用户拥有
CREATE DATABASE和CREATE USER权限(如MySQL的root用户或授权后的专用用户)。 - 用户主机配置
@'%'允许远程访问,若仅需本地访问可改为@'localhost'。 - 密码生成逻辑可根据安全需求调整,例如加入特殊字符或使用
Hash::make(但数据库连接需明文密码,故需存储明文或加密后可解密的格式)。 - API访问必须添加身份验证(如Sanctum),防止凭证泄露。
内容的提问来源于stack exchange,提问作者Chameera
相关产品推荐
相关产品推荐

