Створіть нового користувача в MySQL та надайте йому повний доступ до однієї бази даних


628

Я хочу створити нового користувача в MySQL і надати йому повний доступ лише до однієї бази даних, скажімо dbTest, що я створюю за допомогою команди типу create database dbTest;. Які би були команди MySQL для цього?

Відповіді:


829

Спробуйте це створити користувача:

CREATE USER 'user'@'hostname';

Спробуйте це, щоб надати йому доступ до бази даних dbTest:

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

Якщо ви використовуєте код / ​​сайт, що отримує доступ до MySQL на одній машині, ім'я хоста буде localhost.

Тепер, зламайте.

GRANT - Це команда, яка використовується для створення користувачів та надання прав на бази даних, таблиці тощо.

ALL PRIVILEGES- Це говорить про те, що користувач матиме всі стандартні привілеї. Це не включає привілей використовувати команду GRANT.

dbtest.*- Це інструкція MySQL щодо застосування цих прав для використання у всій базі даних dbtest. Ви можете замінити * на конкретні назви таблиць або зберігати підпрограми, якщо бажаєте.

TO 'user'@'hostname'- "user" - це ім'я користувача облікового запису користувача, який ви створюєте. Примітка. У вас повинні бути єдині лапки. 'ім'я хоста' повідомляє MySQL, з якими хостами користувач може підключитися. Якщо ви хочете лише з тієї ж машини, використовуйтеlocalhost

IDENTIFIED BY 'password' - Як ви здогадалися, це встановлює пароль для цього користувача.


82
Якщо ви дозволяєте доступ до мережі та хочете з'єднання з будь-якого хоста, ви можете змінити "ім'я хоста" на "%". Наприклад, ... TO 'dbuser' @ '%' IDENTIFIED ... '%' - це підстановка хостів.
physicsmichael

17
Не забувайте стирати привілеї під час роботи над користувачами та таблицями! :-)
corsiKa

31
Це працювало для мене: CREATE USER 'user1' @ 'localhost' ІДЕНТИФІКОВАНО ПО «пароль»; НАДАЙТЕ ВСІ ПРИВІЛЕГИ НА db_database1. * Для 'user1' @ 'localhost' ІДЕНТИФІКОВАНО ВІД "пароль"; ПРИГОТОВЛЕННЯ ПРИМІТКИ;
Мохамад Факих

4
@DanMcGrath: Чи ІДЕНТИФІКОВАНО за допомогою пункту "пароль" обов'язковим, якщо користувач вже існує та має пароль?
nanosoft

8
Використання GRANT для створення нового користувача буде видалено в майбутніх випусках MySQL (це застаріло на момент написання цього запису). Надалі це потрібно буде робити з двома дзвінками, СТВОРИТИ КОРИСТУВАЧ, а потім ВИДАЛИТИ
Даррен Фелтон

325

Синтаксис

Щоб створити користувача в MySQL / MariaDB 5.7.6 і вище, використовуйте CREATE USERсинтаксис :

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

потім, щоб надати весь доступ до бази даних (наприклад my_db), використовуйте GRANTсинтаксис , наприклад

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

Де ALL( priv_type ) може бути замінений на певній привілеї , такі як SELECT, INSERT, UPDATE, ALTER, і т.д.

Потім для запуску нещодавно призначених дозволів запустіть:

FLUSH PRIVILEGES;

Виконання

Для запуску над командами потрібно запустити mysqlкоманди та ввести їх у підказку, а потім вийти за quitкомандою або Ctrl- D.

Для запуску з оболонки використовуйте -eпараметр (замініть SELECT 1однією з вищевказаних команд):

$ mysql -e "SELECT 1"

або надрукувати виписку зі стандартного вводу:

$ echo "FOO STATEMENT" | mysql

Якщо вам заборонено доступ до вище, вкажіть -u(для користувача) та -p(для пароля) параметри або для довгострокового доступу встановіть свої дані ~/.my.cnf, наприклад,

[client]
user=root
password=root

Інтеграція оболонок

Для людей, не знайомих з синтаксисом MySQL, ось зручні функції оболонок, які легко запам'ятовувати та використовувати (щоб їх використовувати, потрібно завантажувати функції оболонки, включені далі).

Ось приклад:

$ 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

Щоб використовувати вищезазначені команди, вам потрібно скопіювати та вставити наступні функції у свій файл rc (наприклад .bash_profile) та перезавантажити оболонку чи джерело файлу. У цьому випадку просто введіть 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'"
}

Примітка. Якщо ви віддаєте перевагу не залишати слідів (наприклад, паролів) у вашій історії Bash, перевірте: Як запобігти появі команд у історії башів?


1
Чи потрібно створювати користувача та надавати привілеї окремо? Я виявив, що команда grant, здається, створює самого користувача, принаймні дивлячись у таблицю mysql.user, це виглядає саме так.
Тім

@CreativityKills працюватиме з паролем, якщо ви додасте їх до свого, ~/.my.cnfяк було запропоновано вище.
kenorb

залишати сліди пароля в історії оболонки - не чудова ідея
dmirkitanov

@dmirkitanov Ви можете запобігти цьому, додавши пробіл, див. Як запобігти появі команд у історії башів?
kenorb

58

Створення користувача та надання всіх привілеїв у базі даних.

Увійдіть у MySQL:

mysql -u root

Тепер створіть та надайте

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

Анонімний користувач (лише для локального тестування)

Крім того, якщо ви просто хочете надати повний необмежений доступ до бази даних (наприклад, на локальній машині для тестового примірника, ви можете надати доступ анонімному користувачеві, наприклад:

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

Бережись

Це добре для небажаних даних у розробці. Не роби цього з тим, що тебе хвилює.


3
Ви можете створити такого анонімного користувача, але не потрібно! Немає вагомих причин мати користувача з повними привілеями та паролем, але це може цілком зруйнувати день / рік / бізнес / роботу одного дня, якщо хтось отримає доступ до вашого сервера, у кого цього не повинно бути. Навіщо робити щось інше простішим для них?
Люк Двоюрідний

2
Якщо хтось отримав віддалений доступ до моєї книги, я маю більше хвилюватися, ніж вміст моєї бази розробок. Слід повторити, це лише для локального тестування, не робіть цього з реальними даними.
суперлюмінація

4
Точно, не дивлячись на вміст вашої бази даних розробників, про всі ці інші речі. У вашій базі даних розроблених (можливо, будуть) фрагменти даних живих баз даних (наприклад, для реплікації помилки), які слід докласти всіх зусиль, щоб захистити їх. Просто не потрібно мати доступ до бази даних без пароля. Це навіть не економить час. Не варто потенційних клопотів.
Люк Двоюрідний

1
Можливо, У моєму випадку це непотрібні дані, я буду ризикувати.
суперлюмінація

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

ігноруйте -p варіант, якщо користувач mysql не має пароля або просто натисніть кнопку "[Enter]", щоб перейти. рядки, оточені фігурними дужками, потрібно замінити фактичними значеннями.


13

Ви можете створювати нових користувачів за допомогою оператора CREATE USER та надавати їм права за допомогою GRANT .


СТВОРИТИ КОРИСТУВАЧ "jeffrey" @ "localhost" ІДЕНТИФІКОВАНО "mypass";
cgl

6

Мені це спрацювало.

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

де

  • спонсор: ім'я користувача
  • 1234: пароль спонсора
  • тест: 'спонсор бази даних' має право доступу до

2

Команда нижче працює, якщо ви хочете створити нового користувача, надайте йому весь доступ до певної бази даних (не до всіх баз даних у вашому Mysql) у вашому localhost.

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

Це надасть всі привілеї до однієї бази даних test_database(у вашому випадку dbTest) тому користувачеві у localhost.

Перевірте, які дозволи над цим командою видано вказаному користувачу, виконавши команду нижче.

SHOW GRANTS FOR 'user'@'localhost'

На всякий випадок, якщо ви хочете обмежити доступ користувача лише до однієї єдиної таблиці

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

Помилка синтаксису та помилка друку у першому рядку, "PRIVILEGES ON 'test_datase" "не повинен мати лапок, після нього має бути". * ", Наприклад, test_datase. *, А друкарський помилок має бути" test_database ".
Бреттінс

0

Якщо hostчастина опущена, вона за замовчуванням використовується символом підстановки %, дозволяючи всім хостам.

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'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.