Vấn đề: Tạo tài khoản database mới và cấp quyền SELECT, INSERT, UPDATE, DELETE, EXECUTE
Quy trình chuẩn
- Tạo database (nếu chưa có) với charset utf8mb4.
- Tạo user với mật khẩu.
- Cấp quyền cụ thể trên database đó.
- Kiểm tra quyền đã cấp.
1. Tạo database
CREATE DATABASE demo_app DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
Khuyên dùng utf8mb4 (hỗ trợ emoji, ký tự 4 byte) thay vì utf8 cũ.
2. Tạo user
CREATE USER 'John_123'@'%' IDENTIFIED BY '123456';
'John_123'– Tên user.'%'– Cho phép kết nối từ mọi host. Giới hạn an toàn hơn:'localhost'hoặc IP cụ thể.IDENTIFIED BY– Mật khẩu (MySQL 8.0+ mặc định caching_sha2_password).
3. Cấp quyền (GRANT)
GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON demo_app.* TO 'John_123'@'%';
- Gộp nhiều quyền trong một câu lệnh.
demo_app.*– Áp dụng cho tất cả bảng trong database demo_app.- Quyền
EXECUTEcho phép chạy Stored Procedure/Function.
4. Kiểm tra quyền
SHOW GRANTS FOR 'John_123'@'%';
+-----------------------------------------------------------------------------+
| Grants for John_123@% |
+-----------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO `John_123`@`%` |
| GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON `demo_app`.* TO `John_123`@`%` |
+-----------------------------------------------------------------------------+
Best practice bảo mật
- Original thenhest privilege – Chỉ cấp quyền cần thiết.
- Tách user cho app (read/write) và user cho admin (DDL).
- Dùng mật khẩu mạnh, thay đổi định kỳ.
- Hạn chế host:
'user'@'10.0.0.%'thay vì'%'. - MySQL 8.0+: Dùng
CREATE USER ... REQUIRE SSLcho kết nối mã hóa.
Thu hồi quyền (REVOKE)
REVOKE DELETE ON demo_app.* FROM 'John_123'@'%';