Laravel sailのmysqlに権限を付与してphpMyAdminからDB操作を許可するコマンドを紹介

Laravelを開発する際にDockerを用いてLaravel sailを使う方は非常に多いでしょう。

その際にphpMyAdminも併せてインストールをして、Web上から簡単にデータベースの追加・削除などを行い、色々とテストを行おうかと考えた時。

sailアカウントにデータベースを操作する権限が付与されておらず困ったことがありましたので、その解決方法を今回紹介します。

目次

phpMyAdminで操作不可

データベースの権限がない

phpMyAdminにログインをして、データベースの項目を見てみましょう。

操作権限が付与されているならば、既存のデータベースを削除できるチェックボックスがデータベースの名前横に表示されるのですが見当たりません。

下記の操作を行って、データベースの作成・削除が出来るようにしてみましょう。

mysqlの確認

docker-compose.ymlのmysqlの確認を先ずしておきましょう。

mysql:
    image: 'mysql/mysql-server:8.0'
    ports:
        - '${FORWARD_DB_PORT:-3306}:3306'
    environment:
        MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
        MYSQL_ROOT_HOST: '%'
        MYSQL_DATABASE: '${DB_DATABASE}'
        MYSQL_USER: '${DB_USERNAME}'
        MYSQL_PASSWORD: '${DB_PASSWORD}'
        MYSQL_ALLOW_EMPTY_PASSWORD: 1
    volumes:
        - 'sail-mysql:/var/lib/mysql'
        - './docker/8.2/my.cnf:/etc/my.cnf'
        - './docker/mysql/create-testing-database.sh:/docker-entrypoint-initdb.d/10-create-testing-database.sh'
    networks:
        - sail
    healthcheck:
        test:
            - CMD
            - mysqladmin
            - ping
            - '-p${DB_PASSWORD}'
        retries: 3
        timeout: 5s

laravelのバージョンや私が少しカスタマイズした部分もあるので、表記が違う部分もあるでしょう。

違っていても、さして問題はありませんので気にしないで下さい。

今回見るところはmysqlにログインするためのIDとPASSを確認する必要があります。

environment:
    MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}'
    MYSQL_ROOT_HOST: '%'
    MYSQL_DATABASE: '${DB_DATABASE}'
    MYSQL_USER: '${DB_USERNAME}'
    MYSQL_PASSWORD: '${DB_PASSWORD}'
    MYSQL_ALLOW_EMPTY_PASSWORD: 1

environmentを見てみると変数で指定されています。

.envファイルの設定項目を見てみましょう。

DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=test
DB_USERNAME=sail
DB_PASSWORD=password

DB_DATABASEはlaravelをインストールした時のプロジェクト名になるため、各々違った名前になっています。

DB_USERNAMEDB_PASSWORDをここでは確認し、次のmysqlに進みましょう。

rootユーザーでmysqlにログイン

先程確認したDB_USERNAMEのsailに権限を付与するにはrootでmysqlにログインする必要があります。

sail exec mysql mysql -uroot -ppassword

上記のコマンドで以下のようにログインできます。

owner@PC:~/test$ sail exec mysql mysql -uroot -ppassword
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.32 MySQL Community Server - GPL

Copyright (c) 2000, 2023, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>

sailユーザーの権限確認

現在のsailに付与されている権限を確認してみましょう。

SHOW GRANTS FOR 'sail'@'%';

以下のように現在の権限が確認できます。

mysql> SHOW GRANTS FOR 'sail'@'%';
+----------------------------------------------------+
| Grants for sail@%                                  |
+----------------------------------------------------+
| GRANT USAGE ON *.* TO `sail`@`%`                   |
| GRANT ALL PRIVILEGES ON `test`.* TO `sail`@`%`     |
| GRANT ALL PRIVILEGES ON `testing%`.* TO `sail`@`%` |
+----------------------------------------------------+
3 rows in set (0.00 sec)
コマンドの解説

'sail'@'%'@前半はユーザー名、後半はホスト名です。

sailユーザーに全権限付与

phpMyAdminで操作するために手っ取り早く全権限をsailユーザーに付与します。

GRANT ALL ON *.* TO 'sail'@'%';
詳細解説
GRANT [権限] ON [データベース].[テーブル] TO '[ユーザー名]'@'[ホスト名]';
  • [権限]は付与する権限(例:SELECT, INSERT, UPDATE, DELETE, ALLなど)を指定します。
  • [データベース][テーブル]は、権限を付与するデータベースとテーブルを指定します。すべてのデータベースやテーブルに対して権限を付与する場合は、*.*を使用します。
  • 'ユーザー名'@'ホスト名'は、権限を付与するユーザーを指定します。

無事権限が付与できた場合の表示は以下になります。

mysql> GRANT ALL ON *.* TO 'sail'@'%';
Query OK, 0 rows affected (0.03 sec)
テスト環境のみでお使い下さい

上記のコマンドはセキュリティがガバガバなのでローカルなどテスト環境のみでお使い下さい。

本番環境では適切に権限を付与する必要があり、上記のコマンドを使うとセキュリティが著しく落ちて危険ですので使わないで下さい。

sailユーザーの権限を再確認

実際に付与されているか権限を再確認してみましょう。

SHOW GRANTS FOR 'sail'@'%';

確認すると以下のような表示が確認できました。

mysql> SHOW GRANTS FOR 'sail'@'%';
+------------------------------------------------------------------------------+
| Grants for sail@% |
+------------------------------------------------------------------------------+
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, RELOAD, SHUTDOWN, PROCESS,
 FILE, REFERENCES, INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY TABLES,
 LOCK TABLES, EXECUTE, REPLICATION SLAVE, REPLICATION CLIENT, CREATE VIEW,
 SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER,
 CREATE TABLESPACE, CREATE ROLE, DROP ROLE ON *.* TO `sail`@`%` |
| GRANT APPLICATION_PASSWORD_ADMIN,AUDIT_ABORT_EXEMPT,AUDIT_ADMIN,
AUTHENTICATION_POLICY_ADMIN,BACKUP_ADMIN,BINLOG_ADMIN,BINLOG_ENCRYPTION_ADMIN,
CLONE_ADMIN,CONNECTION_ADMIN,ENCRYPTION_KEY_ADMIN,FIREWALL_EXEMPT,
FLUSH_OPTIMIZER_COSTS,FLUSH_STATUS,FLUSH_TABLES,FLUSH_USER_RESOURCES,
GROUP_REPLICATION_ADMIN,GROUP_REPLICATION_STREAM,INNODB_REDO_LOG_ARCHIVE,
INNODB_REDO_LOG_ENABLE,PASSWORDLESS_USER_ADMIN,PERSIST_RO_VARIABLES_ADMIN,
REPLICATION_APPLIER,REPLICATION_SLAVE_ADMIN,RESOURCE_GROUP_ADMIN,
RESOURCE_GROUP_USER,ROLE_ADMIN,SENSITIVE_VARIABLES_OBSERVER,
SERVICE_CONNECTION_ADMIN,SESSION_VARIABLES_ADMIN,SET_USER_ID,SHOW_ROUTINE,
SYSTEM_USER,SYSTEM_VARIABLES_ADMIN,TABLE_ENCRYPTION_ADMIN,
XA_RECOVER_ADMIN ON *.* TO `sail`@`%` |
| GRANT ALL PRIVILEGES ON `test`.* TO `sail`@`%` |
| GRANT ALL PRIVILEGES ON `testing%`.* TO `sail`@`%` |
+------------------------------------------------------------------------------+
4 rows in set (0.00 sec)

phpMyAdminでの権限確認

データベースが操作可能になっている

操作権限が問題なく付与されたので、phpMyAdminから既存のデータベースを削除できるチェックボックスが表示される様になりました。

データベースの新規作成も正常に行なえる様になっていますので、データベースをガシガシ使い捨てながらローカル開発を行っていきましょう。

権限を削除し元の状態にする方法

権限を増やしすぎて元の状態にしたい。初期化したいと考えた時の修正方法です。

手順としてはsailの権限を全て削除した後、以前付与されていたデータベースへの権限を個別に付与(修正)していく形となります。

sailの権限を全て削除

REVOKE ALL ON *.* FROM 'sail'@'%';

個別にデータベースの権限付与

GRANT ALL PRIVILEGES ON test.* TO 'sail'@'%';

testは権限を付与したいデータベースの名前に変えて下さい。

一連の流れを実行した作業例は以下となります。

mysql> REVOKE ALL ON *.* FROM 'sail'@'%';
Query OK, 0 rows affected (0.03 sec)


mysql> SHOW GRANTS FOR 'sail'@'%';
+----------------------------------+
| Grants for sail@%                |
+----------------------------------+
| GRANT USAGE ON *.* TO `sail`@`%` |
+----------------------------------+
1 row in set (0.00 sec)


mysql> GRANT ALL PRIVILEGES ON test.* TO 'sail'@'%';
Query OK, 0 rows affected (0.01 sec)


mysql> GRANT ALL PRIVILEGES ON testing.* TO 'sail'@'%';
Query OK, 0 rows affected (0.03 sec)


mysql> SHOW GRANTS FOR 'sail'@'%';
+---------------------------------------------------+
| Grants for sail@%                                 |
+---------------------------------------------------+
| GRANT USAGE ON *.* TO `sail`@`%`                  |
| GRANT ALL PRIVILEGES ON `test`.* TO `sail`@`%`    |
| GRANT ALL PRIVILEGES ON `testing`.* TO `sail`@`%` |
+---------------------------------------------------+
3 rows in set (0.00 sec)

SHOW GRANTSで権限を確認した時、初期状態と同じ表記になっていればOKです。

コマンドのみでデータベースを編集する方法

phpMyAdminでデータベースを編集するなら上記の説明で事足りるのですが、コマンドのみで操作をしてみたい。本番環境の練習のためCLIで済ましたいという方のために簡単な操作を紹介しておきます。

データベースの一覧を表示

まず現在のデータベースの一覧を確認してみましょう。

SHOW DATABASES;

現在作成されているデータベース一覧を取得できます。

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
| testing            |
+--------------------+
6 rows in set (0.00 sec)

データベースを新規作成

CREATE DATABASE new_db;

new_dbは作りたいデータベースの名前に変えて下さい。

作成後、データベースの一覧を再取得してみると、新規に追加されているのが確認できます。

mysql> CREATE DATABASE new_db;
Query OK, 1 row affected (0.07 sec)

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| new_db             |
| performance_schema |
| sys                |
| test               |
| testing            |
+--------------------+
7 rows in set (0.00 sec)

sailユーザーに新規作成したDBのフル権限を付与

データベースを新規作成しただけでは、sailユーザーには先程作成したデータベースの操作権限が無いため、プログラムから操作を行おうとしてもエラーが出て何も出来ません。

新たにsailユーザーに先ほど作成したデータベースへの権限を付与してみましょう。

GRANT ALL PRIVILEGES ON new_db.* TO 'sail'@'%';

new_dbは権限を付与したいデータベースの名前に変えて下さい。

権限を付与前、権限を付与、権限を付与後の実行例が以下です。

mysql> SHOW GRANTS FOR 'sail'@'%';
+----------------------------------------------------+
| Grants for sail@%                                  |
+----------------------------------------------------+
| GRANT USAGE ON *.* TO `sail`@`%`                   |
| GRANT ALL PRIVILEGES ON `test`.* TO `sail`@`%`     |
| GRANT ALL PRIVILEGES ON `testing%`.* TO `sail`@`%` |
+----------------------------------------------------+
3 rows in set (0.00 sec)



mysql> GRANT ALL PRIVILEGES ON new_db.* TO 'sail'@'%';
Query OK, 0 rows affected (0.04 sec)



mysql> SHOW GRANTS FOR 'sail'@'%';
+----------------------------------------------------+
| Grants for sail@%                                  |
+----------------------------------------------------+
| GRANT USAGE ON *.* TO `sail`@`%`                   |
| GRANT ALL PRIVILEGES ON `test`.* TO `sail`@`%`     |
| GRANT ALL PRIVILEGES ON `new_db`.* TO `sail`@`%`   |
| GRANT ALL PRIVILEGES ON `testing%`.* TO `sail`@`%` |
+----------------------------------------------------+
4 rows in set (0.01 sec)

データベース削除

やっぱりデータベースを作ったけど削除してやり直したい時は以下のコマンドを使います。

DROP DATABASE new_db;

new_dbは削除したいデータベースの名前に変えて下さい。

削除前、データベースを削除、削除後のデータベース一覧取得の実行例が以下です。

mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| new_db             |
| performance_schema |
| sys                |
| test               |
| testing            |
+--------------------+
7 rows in set (0.00 sec)


mysql> DROP DATABASE new_db;
Query OK, 0 rows affected (0.13 sec)


mysql> SHOW DATABASES;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
| test               |
| testing            |
+--------------------+
6 rows in set (0.00 sec)

sailユーザーから削除したDBの権限削除

データベースを削除してもsailに付与した権限は一緒に削除はされませんので以下のコマンドで権限も削除しましょう。

REVOKE ALL PRIVILEGES ON new_db.* FROM 'sail'@'%';

new_dbは権限を削除したいデータベースの名前に変えて下さい。

削除前、権限を削除、削除後のsailユーザーの権限取得の実行例が以下です。

mysql> SHOW GRANTS FOR 'sail'@'%';
+----------------------------------------------------+
| Grants for sail@%                                  |
+----------------------------------------------------+
| GRANT USAGE ON *.* TO `sail`@`%`                   |
| GRANT ALL PRIVILEGES ON `test`.* TO `sail`@`%`     |
| GRANT ALL PRIVILEGES ON `new_db`.* TO `sail`@`%`   |
| GRANT ALL PRIVILEGES ON `testing%`.* TO `sail`@`%` |
+----------------------------------------------------+
4 rows in set (0.00 sec)


mysql> REVOKE ALL PRIVILEGES ON new_db.* FROM 'sail'@'%';
Query OK, 0 rows affected (0.05 sec)


mysql> SHOW GRANTS FOR 'sail'@'%';
+----------------------------------------------------+
| Grants for sail@%                                  |
+----------------------------------------------------+
| GRANT USAGE ON *.* TO `sail`@`%`                   |
| GRANT ALL PRIVILEGES ON `test`.* TO `sail`@`%`     |
| GRANT ALL PRIVILEGES ON `testing%`.* TO `sail`@`%` |
+----------------------------------------------------+
3 rows in set (0.00 sec)

あとがき

権限を付与した後sail php artisan migrateを行う場合、必ずデータベースを手動で予め作成して下さい。

全権付与したので問題なくデータベースも作成されるかな?とマイグレーションを叩いても、データベースが存在しないとエラーが出て怒られます。

データベースを予めphpMyAdminで作るなり、直接コマンドを叩いて作成するなりしてからlaravelのコマンドを叩きましょう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

このサイトはreCAPTCHAによって保護されており、Googleのプライバシーポリシー利用規約が適用されます。

reCAPTCHAの認証時間が切れたため、ページを再読み込みしてください。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

目次