mysql - SQLSTATE [42000]:语法错误或访问冲突:1044 拒绝用户 'ion'@'localhost' 访问数据库 'a901ce392dad4b90b1c6e175b07196a9'
问题描述
我创建了一个多租户数据库,问题是当我使用租户创建一个新数据库时,我收到以下错误:
SQLSTATE[42000]: Syntax error or access violation: 1044 Access denied for user 'ion'@'localhost' to database 'a901ce392dad4b90b1c6e175b07196a9' (SQL: GRANT ALL ON
a901ce392dad4b90b1c6e175b07196a9.* TO
a901ce392dad4b90b1c6e175b07196a9@'127.0.0.1')
我有以下控制器来创建新租户:
public function store(RegisterAuthRequest $request)
{
$name = $request->name;
$email = $request->email;
$password = $request->password;
if (Tenant::tenantExists($name)) {
return response()->json([
'success' => false,
'message' => "A tenant with name " . $name . " already exists."
]);
}
$tenant = Tenant::registerTenant($name, $email, $password);
$tenancy = app(Environment::class);
$tenancy->hostname(); // resolves $hostname as currently active hostname
$tenancy->website(); // resolves $website
$tenancy->tenant(); // resolves $website
//
$tenancy->identifyHostname(); // resets resolving $hostname by using the Request
// invite admin
$tenant->admin->notify(new TenantCreated($request->email, $request->password));
return response()->json([
'success' => true,
'message' => 'tenant with name ' . $tenant->hostname->fqdn . " created and Admin {$email} can log in using password {$password}"
],200);
}
这是我的租户模型:
public static function registerTenant($name, $email, $password): Tenant
{
// Convert all to lowercase
$connection = app(Connection::class)->systemName();
$name = strtolower($name);
$email = strtolower($email);
$website = new Website;
if($connection != 'default') $website->managed_by_database_connection = $connection;
app(WebsiteRepository::class)->create($website);
// associate the website with a hostname
$hostname = new Hostname;
$baseUrl = config('tenancy.hostname.default');
$hostname->fqdn = "{$name}.{$baseUrl}";
app(HostnameRepository::class)->attach($hostname, $website);
// make hostname current
app(Environment::class)->tenant($hostname->website);
// Make the registered user the default Admin of the site.
$admin = static::makeAdmin($name, $email, $password, $hostname);
return new Tenant($website, $hostname, $admin);
}
private static function makeAdmin($name, $email, $password, $hostname): User
{
$admin = new User;
$admin->name = $name;
$admin->email = $email;
$admin->password = Hash::make($password);
$admin->hostname()->associate($hostname);
$admin->job_title = 'admin';
$admin->birth_date = '1000-01-01';
$roleAdmin = Role::where('name', 'admin')->firstOrFail();
$admin->assignRole($roleAdmin);
$admin->save();
return $admin;
}
public static function tenantExists($name)
{
$name = $name . '.' . config('tenancy.hostname.default');
return Hostname::where('fqdn', $name)->exists();
}
我拥有 MySQL 中 ion@localhost 的所有权限:
+--------------------------------------------------+
| Grants for ion@localhost |
+--------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'ion'@'localhost' |
还有一件事,错误地说,
SQL: GRANT ALL ON
a901ce392dad4b90b1c6e175b07196a9.* TO
a901ce392dad4b90b1c6e175b07196a9@'127.0.0.1'
我不明白为什么要把所有的授权都给这个用户?
我试图dd()
找出错误发生的位置,它是:
app(WebsiteRepository::class)->create($website);
解决方案
推荐阅读
- c# - 隐式转换导致 Unity 中的 StackOverflowException
- javascript - 如何模拟使用在节点模块中导出的导入(ES6 typescript)进行单元测试的外部注入库
- javascript - (切换)功能未定义
- c++ - Conan.io 在编译步骤中或已经在结帐时
- node.js - 使用 mongoose 将过滤的 Schema 对象引用到另一个对象中
- ios - 分页模式下UIScrollView内部的多个UITextView交互问题
- java - java中响应代码为4xx时如何从REST API解析响应正文
- c - C中的星号金字塔
- c++ - 两个候选函数模板。在使一个参数成为引用后,选择不太专业的模板
- json - 无法从 JSON 解码 int 字段