首页 > 解决方案 > 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 ONa901ce392dad4b90b1c6e175b07196a9 .* TOa901ce392dad4b90b1c6e175b07196a9@'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 ONa901ce392dad4b90b1c6e175b07196a9 .* TOa901ce392dad4b90b1c6e175b07196a9@'127.0.0.1'我不明白为什么要把所有的授权都给这个用户?

我试图dd()找出错误发生的位置,它是:

app(WebsiteRepository::class)->create($website);

标签: mysqllaravelmulti-tenant

解决方案


推荐阅读