Tạo người dùng mới trong MySQL và cấp cho nó toàn quyền truy cập vào một cơ sở dữ liệu


628

Tôi muốn tạo một người dùng mới trong MySQL và chỉ cung cấp cho nó toàn quyền truy cập vào một cơ sở dữ liệu dbTestmà tôi tạo bằng một lệnh như thế nào create database dbTest;. Điều gì sẽ là các lệnh MySQL để làm điều đó?

Câu trả lời:


829

Hãy thử điều này để tạo người dùng:

CREATE USER 'user'@'hostname';

Hãy thử điều này để cung cấp cho nó quyền truy cập vào cơ sở dữ liệu dbTest:

GRANT ALL PRIVILEGES ON dbTest.* To 'user'@'hostname' IDENTIFIED BY 'password';

Nếu bạn đang chạy mã / trang web truy cập MySQL trên cùng một máy, tên máy chủ sẽ là localhost.

Bây giờ, sự đổ vỡ.

GRANT - Đây là lệnh được sử dụng để tạo người dùng và cấp quyền cho cơ sở dữ liệu, bảng, v.v.

ALL PRIVILEGES- Điều này cho nó biết người dùng sẽ có tất cả các đặc quyền tiêu chuẩn. Tuy nhiên, điều này không bao gồm đặc quyền sử dụng lệnh GRANT.

dbtest.*- Hướng dẫn này MySQL áp dụng các quyền này để sử dụng trong toàn bộ cơ sở dữ liệu dbtest. Bạn có thể thay thế * bằng tên bảng cụ thể hoặc lưu các thói quen nếu bạn muốn.

TO 'user'@'hostname'- 'người dùng' là tên người dùng của tài khoản người dùng bạn đang tạo. Lưu ý: Bạn phải có dấu ngoặc đơn trong đó. 'tên máy chủ' cho MySQL biết máy chủ nào người dùng có thể kết nối từ đó. Nếu bạn chỉ muốn nó từ cùng một máy, hãy sử dụnglocalhost

IDENTIFIED BY 'password' - Như bạn đã đoán, điều này đặt mật khẩu cho người dùng đó.


82
Nếu bạn cho phép truy cập mạng và muốn kết nối từ bất kỳ máy chủ nào, bạn có thể thay đổi 'tên máy chủ' thành '%'. Ví dụ: ... ĐẾN 'dbuser' @ '%' XÁC NHẬN ... '%' là ký tự đại diện.
vật lý

17
Đừng quên xóa đặc quyền khi bạn đang làm việc trên người dùng và bảng! :-)
corsiKa

31
Điều này làm việc cho tôi: TẠO NGƯỜI DÙNG 'user1' @ 'localhost' được xác định bởi 'mật khẩu'; CẤP TẤT CẢ CÁC ƯU ĐÃI TRÊN db_database1. * Để 'user1' @ 'localhost' được xác định bởi 'mật khẩu'; QUYỀN RIÊNG TƯ;
Mohamad Fakih

4
@DanMcGrath: Điều khoản được xác định bởi mệnh đề 'mật khẩu' là bắt buộc, nếu người dùng đã tồn tại và có mật khẩu?
nanosoft

8
Sử dụng GRANT để tạo một người dùng mới sẽ bị xóa trong các bản phát hành tương lai của MySQL (nó không được chấp nhận tại thời điểm viết bài này). Trong tương lai, nó sẽ phải được thực hiện với hai cuộc gọi, TẠO NGƯỜI DÙNG rồi CẤP.
Darren Felton

325

Cú pháp

Để tạo người dùng trong MySQL / MariaDB 5.7.6 trở lên, hãy sử dụng CREATE USERcú pháp :

CREATE USER 'new_user'@'localhost' IDENTIFIED BY 'new_password';

sau đó để cấp tất cả quyền truy cập vào cơ sở dữ liệu (ví dụ my_db), sử dụng GRANTCú pháp , ví dụ:

GRANT ALL ON my_db.* TO 'new_user'@'localhost';

Nơi ALL( priv_type ) có thể được thay thế bằng cụ đặc quyền như SELECT, INSERT, UPDATE, ALTERvv

Sau đó, để tải lại quyền mới được chỉ định chạy:

FLUSH PRIVILEGES;

Thi công

Để chạy các lệnh trên, bạn cần chạy mysqllệnh và nhập chúng vào dấu nhắc, sau đó đăng xuất bằng quitlệnh hoặc Ctrl- D.

Để chạy từ shell, sử dụng -etham số (thay thế SELECT 1bằng một trong các lệnh trên):

$ mysql -e "SELECT 1"

hoặc in câu lệnh từ đầu vào tiêu chuẩn:

$ echo "FOO STATEMENT" | mysql

Nếu bạn có quyền truy cập bị từ chối ở trên, hãy chỉ định tham số -u(cho người dùng) và -p(cho mật khẩu) hoặc để truy cập dài hạn, hãy đặt thông tin đăng nhập của bạn ~/.my.cnf, vd

[client]
user=root
password=root

Tích hợp vỏ

Đối với những người không quen thuộc với cú pháp MySQL, đây là các hàm shell tiện dụng, dễ nhớ và dễ sử dụng (để sử dụng chúng, bạn cần tải các hàm shell đi kèm xuống).

Đây là ví dụ:

$ mysql-create-user admin mypass
| CREATE USER 'admin'@'localhost' IDENTIFIED BY 'mypass'

$ mysql-create-db foo
| CREATE DATABASE IF NOT EXISTS foo

$ mysql-grant-db admin foo
| GRANT ALL ON foo.* TO 'admin'@'localhost'
| FLUSH PRIVILEGES

$ mysql-show-grants admin
| SHOW GRANTS FOR 'admin'@'localhost'
| Grants for admin@localhost                                                                                   
| GRANT USAGE ON *.* TO 'admin'@'localhost' IDENTIFIED BY PASSWORD '*6C8989366EAF75BB670AD8EA7A7FC1176A95CEF4' |
| GRANT ALL PRIVILEGES ON `foo`.* TO 'admin'@'localhost'

$ mysql-drop-user admin
| DROP USER 'admin'@'localhost'

$ mysql-drop-db foo
| DROP DATABASE IF EXISTS foo

Để sử dụng các lệnh trên, bạn cần sao chép và dán các chức năng sau vào tệp RC của mình (ví dụ .bash_profile) và tải lại trình bao của bạn hoặc nguồn tệp. Trong trường hợp này chỉ cần gõ source .bash_profile:

# Create user in MySQL/MariaDB.
mysql-create-user() {
  [ -z "$2" ] && { echo "Usage: mysql-create-user (user) (password)"; return; }
  mysql -ve "CREATE USER '$1'@'localhost' IDENTIFIED BY '$2'"
}

# Delete user from MySQL/MariaDB
mysql-drop-user() {
  [ -z "$1" ] && { echo "Usage: mysql-drop-user (user)"; return; }
  mysql -ve "DROP USER '$1'@'localhost';"
}

# Create new database in MySQL/MariaDB.
mysql-create-db() {
  [ -z "$1" ] && { echo "Usage: mysql-create-db (db_name)"; return; }
  mysql -ve "CREATE DATABASE IF NOT EXISTS $1"
}

# Drop database in MySQL/MariaDB.
mysql-drop-db() {
  [ -z "$1" ] && { echo "Usage: mysql-drop-db (db_name)"; return; }
  mysql -ve "DROP DATABASE IF EXISTS $1"
}

# Grant all permissions for user for given database.
mysql-grant-db() {
  [ -z "$2" ] && { echo "Usage: mysql-grand-db (user) (database)"; return; }
  mysql -ve "GRANT ALL ON $2.* TO '$1'@'localhost'"
  mysql -ve "FLUSH PRIVILEGES"
}

# Show current user permissions.
mysql-show-grants() {
  [ -z "$1" ] && { echo "Usage: mysql-show-grants (user)"; return; }
  mysql -ve "SHOW GRANTS FOR '$1'@'localhost'"
}

Lưu ý: Nếu bạn không muốn để lại dấu vết (như mật khẩu) trong lịch sử Bash của mình, hãy kiểm tra: Làm thế nào để ngăn các lệnh hiển thị trong lịch sử bash?


1
Bạn có cần tạo người dùng và cấp đặc quyền riêng biệt? Tôi đã thấy rằng lệnh Grant dường như tự tạo người dùng, ít nhất là nhìn vào bảng mysql.user, nó trông như vậy.
Tim

@CreativityKills Sẽ hoạt động với mật khẩu nếu bạn thêm chúng vào ~/.my.cnfnhư được đề xuất ở trên.
kenorb

để lại dấu vết của mật khẩu trong lịch sử vỏ không phải là một ý tưởng tuyệt vời
dmirkitanov

@dmirkitanov Bạn có thể ngăn chặn điều đó bằng cách thêm một khoảng trắng, xem: Làm thế nào để ngăn chặn các lệnh hiển thị trong lịch sử bash?
kenorb

58

Để tạo người dùng và cấp tất cả các đặc quyền trên cơ sở dữ liệu.

Đăng nhập vào MySQL:

mysql -u root

Bây giờ tạo và cấp

GRANT ALL PRIVILEGES ON dbTest.* To 'user'@'hostname' IDENTIFIED BY 'password';

Người dùng ẩn danh (chỉ dành cho thử nghiệm cục bộ)

Cách khác, nếu bạn chỉ muốn cấp quyền truy cập đầy đủ không hạn chế vào cơ sở dữ liệu (ví dụ: trên máy cục bộ của bạn để lấy ví dụ kiểm tra, bạn có thể cấp quyền truy cập cho người dùng ẩn danh, như vậy:

GRANT ALL PRIVILEGES ON dbTest.* To ''@'hostname'

Hãy nhận biết

Điều này là tốt cho dữ liệu rác trong phát triển. Đừng làm điều này với bất cứ điều gì bạn quan tâm.


3
Bạn có thể tạo một người dùng ẩn danh như thế, nhưng đừng! Không có lý do chính đáng để có một người dùng có đầy đủ đặc quyền và không có mật khẩu, nhưng điều đó có thể làm hỏng cả ngày / năm / doanh nghiệp / công việc của bạn một ngày nào đó nếu ai đó có quyền truy cập vào máy chủ của bạn không nên có. Tại sao làm bất cứ điều gì khác dễ dàng hơn cho họ?
Luke anh em họ

2
Nếu ai đó đã đạt được quyền truy cập từ xa vào macbook của tôi, tôi có nhiều điều phải lo lắng hơn là nội dung của cơ sở dữ liệu phát triển của tôi. Tôi nên lặp lại, cái này chỉ dành cho thử nghiệm cục bộ, đừng làm điều này với dữ liệu thực.
siêu sáng

4
Chính xác, với tất cả những điều khác phải lo lắng, đừng lo lắng về nội dung của cơ sở dữ liệu dev của bạn. Cơ sở dữ liệu dev của bạn có thể (có thể sẽ) có các đoạn dữ liệu cơ sở dữ liệu trực tiếp (ví dụ để sao chép lỗi) mà mọi nỗ lực cần được thực hiện để giữ an toàn. Đơn giản là không cần phải có quyền truy cập cơ sở dữ liệu mà không cần mật khẩu. Nó thậm chí không tiết kiệm thời gian. Không đáng để gặp rắc rối tiềm năng.
Luke Cousins

1
Có lẽ. Trong trường hợp của tôi, đó là dữ liệu rác, tôi sẽ gặp rủi ro.
siêu sáng

17
$ mysql -u root -p -e "grant all privileges on dbTest.* to
`{user}`@`{host}` identified by '{long-password}'; flush privileges;"

bỏ qua tùy chọn -p , nếu người dùng mysql không có mật khẩu hoặc chỉ cần nhấn nút "[Enter]" để bỏ qua. chuỗi được bao quanh bằng dấu ngoặc nhọn cần được thay thế bằng giá trị thực.


13

Bạn có thể tạo người dùng mới bằng cách sử dụng câu lệnh CREATE USER và trao quyền cho họ bằng GRANT .


TẠO NGƯỜI DÙNG 'jeffrey' @ 'localhost' được xác định bởi 'mypass';
cgl

6

Đối với tôi điều này đã làm việc.

CREATE USER 'spowner'@'localhost' IDENTIFIED BY '1234'; 
GRANT ALL PRIVILEGES ON test.* To 'spowner'@'localhost'; 
FLUSH PRIVILEGES;

Ở đâu

  • spowner: tên người dùng
  • 1234: mật khẩu của chủ sở hữu
  • kiểm tra: cơ sở dữ liệu 'spowner' có quyền truy cập vào

2

Lệnh dưới đây sẽ hoạt động nếu bạn muốn tạo một người dùng mới cung cấp cho anh ta tất cả quyền truy cập vào một cơ sở dữ liệu cụ thể (không phải tất cả các cơ sở dữ liệu trong Mysql của bạn) trên localhost của bạn.

GRANT ALL PRIVILEGES ON test_database.* TO 'user'@'localhost' IDENTIFIED BY 'password';

Điều này sẽ cấp tất cả các đặc quyền cho một cơ sở dữ liệu test_database(trong trường hợp của bạn dbTest) cho người dùng đó trên localhost.

Kiểm tra những quyền mà lệnh trên đã cấp cho người dùng đó bằng cách chạy lệnh bên dưới.

SHOW GRANTS FOR 'user'@'localhost'

Chỉ trong trường hợp, nếu bạn muốn giới hạn quyền truy cập của người dùng chỉ vào một bảng duy nhất

GRANT ALL ON mydb.table_name TO 'someuser'@'host';

Lỗi cú pháp & lỗi đánh máy trong dòng đầu tiên của bạn, "RIÊNG TƯ TRÊN 'test_datase'" không nên có dấu ngoặc kép, nên có ". *" Sau nó, ví dụ: test_datase. *, Và là một lỗi đánh máy, nên là "test_database ".
Brettins

0

Trong trường hợp hostphần bị bỏ qua, nó mặc định là ký hiệu đại diện %, cho phép tất cả các máy chủ.

CREATE USER 'service-api';

GRANT ALL PRIVILEGES ON the_db.* TO 'service-api' IDENTIFIED BY 'the_password'

SELECT * FROM mysql.user;
SHOW GRANTS FOR 'service-api'
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.