MySQL使用者與許可權管理

luashin發表於2016-01-08

(一)MySQL有哪些許可權
MySQL的許可權列表可以使用 show privileges 來檢視,主要的許可權資訊如下:


這裡我們根據作用域,把許可權分為3類:
1.MySQL服務管理許可權:用於管理MySQL伺服器的操作。這些許可權是全域性性的,授權範圍不能是特定的資料庫或物件。只能使用*.*方式授予,不能使用db.*或db.tb方式授權;
2.資料庫級別許可權:授權範圍可以是所有資料庫,也可以是單個資料庫下面的所有物件。可以使用*.*方式授予全部資料庫,也可以使用db.*授予單個資料庫;
3.物件級別許可權:授權範圍可以是所有資料庫,也可以是單個資料庫下面的所有物件,也可以是特定的物件。可以使用*.*方式授予全部資料庫,也可以使用db.*授予單個資料庫,還可以使用db.tb授予單個物件。

 

(二)MySQL許可權管理相關表
在mysql資料庫中包含了許可權相關的表,一共6個表,分別從不同維度記錄了MySQL使用者的許可權資訊
 user         :使用者賬號,全域性許可權和其它非許可權列
 db           :資料庫級別許可權
 tables_priv  :表級別許可權
 column_priv  :列級別許可權
 procs_priv   :儲存過程和函式的許可權
 proxies_priv :代理使用者許可權

 

有那麼多許可權表,許可權資訊是如何儲存的呢?通過測試,發現:
--當授權物件為 *.*  時,儲存在user表;
--當授權物件為 db.* 時,儲存在db表;
--當授權物件為 db.tb 時,儲存在tables_priv表;
--當授權物件為 某個表的某個列 時,儲存在column_priv表

 

我們不妨來驗證一下上面的結論:
測試1.當授予使用者user1 *.*許可權時,許可權資訊儲存在user表中,其它許可權表未儲存相關許可權資訊。

create user user1 identified by '123456';
grant update on *.* to user1;

mysql> select * from mysql.user a where a.user = 'user1' \G
*************************** 1. row ***************************
Host: %
User: user1
Select_priv: N
Insert_priv: N
Update_priv: Y                 
Delete_priv: N
Create_priv: N


mysql> select * from mysql.db a where a.user = 'user1';
Empty set (0.00 sec)

mysql> select * from mysql.tables_priv a where a.user = 'user1';
Empty set (0.00 sec)

mysql> select * from mysql.columns_priv a where a.user = 'user1';
Empty set (0.00 sec)

 測試2.授予使用者user1單個資料庫的許可權時,許可權資訊儲存在db表中,其它許可權表未儲存相關許可權資訊。

grant insert on lijiamandb.* to user1;

mysql> select * from mysql.user a where a.user = 'user1' \G
*************************** 1. row ***************************
Host: %
User: user1
Select_priv: N
Insert_priv: N
Update_priv: Y      //該許可權是上一步授予的,不用管
Delete_priv: N


mysql> select * from mysql.db a where a.user = 'user1' \G
*************************** 1. row ***************************
Host: %
Db: lijiamandb
User: user1
Select_priv: N
Insert_priv: Y                
...
Trigger_priv: N
1 row in set (0.00 sec)

mysql> select * from mysql.tables_priv a where a.user = 'user1';
Empty set (0.00 sec)

mysql> select * from mysql.columns_priv a where a.user = 'user1';
Empty set (0.00 sec)

測試3.授予使用者user1單個表的許可權時,許可權資訊儲存在tables_priv表中,其它許可權表未儲存相關許可權資訊。

grant delete on lijiamandb.t1 to user1;

mysql> select * from mysql.user a where a.user = 'user1' \G
*************************** 1. row ***************************
Host: %
User: user1
Select_priv: N
Insert_priv: N
Update_priv: Y
Delete_priv: N
Create_priv: N


mysql> select * from mysql.db a where a.user = 'user1' \G
*************************** 1. row ***************************
Host: %
Db: lijiamandb
User: user1
Select_priv: N
Insert_priv: Y
Update_priv: N
Delete_priv: N
Create_priv: N


mysql> select * from mysql.tables_priv a where a.user = 'user1';
+------+------------+-------+------------+----------------+---------------------+------------+-------------+
| Host | Db         | User  | Table_name | Grantor        | Timestamp           | Table_priv | Column_priv |
+------+------------+-------+------------+----------------+---------------------+------------+-------------+
| %    | lijiamandb | user1 | t1         | root@localhost | 0000-00-00 00:00:00 | Delete     |             |
+------+------------+-------+------------+----------------+---------------------+------------+-------------+
1 row in set (0.00 sec)

mysql> select * from mysql.columns_priv a where a.user = 'user1';
Empty set (0.00 sec)

 測試4.授予使用者user1單個列的許可權時,許可權資訊儲存在columns_priv表中,其它許可權表未儲存相關許可權資訊。

grant select(name) on lijiamandb.t1 to user1;

mysql> select * from mysql.user a where a.user = 'user1' \G
*************************** 1. row ***************************
Host: %
User: user1
Select_priv: N
Insert_priv: N
Update_priv: Y
Delete_priv: N
Create_priv: N
mysql> select * from mysql.db a where a.user = 'user1' \G
*************************** 1. row ***************************
Host: %
Db: lijiamandb
User: user1
Select_priv: N
Insert_priv: Y
Update_priv: N
Delete_priv: N
Create_priv: N


mysql> select * from mysql.tables_priv a where a.user = 'user1';
+------+------------+-------+------------+----------------+---------------------+------------+-------------+
| Host | Db         | User  | Table_name | Grantor        | Timestamp           | Table_priv | Column_priv |
+------+------------+-------+------------+----------------+---------------------+------------+-------------+
| %    | lijiamandb | user1 | t1         | root@localhost | 0000-00-00 00:00:00 | Delete| Select      |
+------+------------+-------+------------+----------------+---------------------+------------+-------------+
1 row in set (0.00 sec)


mysql> select * from mysql.columns_priv a where a.user = 'user1';
+------+------------+-------+------------+-------------+---------------------+-------------+
| Host | Db         | User  | Table_name | Column_name | Timestamp           | Column_priv |
+------+------------+-------+------------+-------------+---------------------+-------------+
| %    | lijiamandb | user1 | t1         | name        | 0000-00-00 00:00:00 | Select      |
+------+------------+-------+------------+-------------+---------------------+-------------+

 

(三)建立並授權、檢視、刪除賬戶

(3.1)建立賬戶

使用create user語句建立賬戶,建立賬戶的SQL語句如下:

CREATE USER `<user_name>`@`<host>` IDENTIFIED BY '<password>';

 建立賬戶的例子如下:

--建立一個只能從本地訪問MySQL的使用者user1,密碼是123456
CREATE USER `user1`@`localhost` IDENTIFIED BY '123456';

--建立一個從192。168.10.*網段訪問MySQL的使用者user2
CREATE USER `user2`@`192.168.10.*` IDENTIFIED BY '123456';

--建立一個可以從任意位置訪問MySQL的使用者user3
CREATE USER `user3`@`%` IDENTIFIED BY '123456';

 注意:這裡需留意一下賬戶使用者的區別,賬戶是使用者與登入主機的組合,格式為 `<user_name>`@`<host>` ,使用者為 `<user_name>` 。

 

(3.2)刪除賬戶

使用drop user語句刪除賬戶,刪除賬戶的SQL語句如下:

DROP USER `<user_name>`@`<host>`;

 刪除賬戶的例子如下:

DROP USER `user1`@`localhost`;

 

(3.3)檢視賬戶極其許可權資訊

檢視MySQL裡面有哪些賬戶,直接檢視mysql.user表即可

mysql> select user,host from mysql.user;
+------------------+--------------+
| user             | host         |
+------------------+--------------+
| lijiaman         | %            |
| root             | %            |
| user2            | %            |
| user2            | 192.168.10.* |
| mysql.infoschema | localhost    |
| mysql.session    | localhost    |
| mysql.sys        | localhost    |
+------------------+--------------+

 

 要檢視某個使用者的許可權資訊,使用 SHOW GRANTS 命令,語法如下

SHOW GRANTS FOR `user`@`host`;

 例如,檢視使用者lijiaman的許可權

mysql> SHOW GRANTS FOR `lijiaman`@`%` \G
*************************** 1. row ***************************
Grants for lijiaman@%: 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 `lijiaman`@`%`
*************************** 2. row ***************************
Grants for lijiaman@%: GRANT APPLICATION_PASSWORD_ADMIN,AUDIT_ADMIN,BACKUP_ADMIN,BINLOG_ADMIN,BINLOG_ENCRYPTION_ADMIN,CLONE_ADMIN,CONNECTION_ADMIN,ENCRYPTION_KEY_ADMIN,GROUP_REPLICATION_ADMIN,INNODB_REDO_LOG_ARCHIVE,INNODB_REDO_LOG_ENABLE,PERSIST_RO_VARIABLES_ADMIN,REPLICATION_APPLIER,REPLICATION_SLAVE_ADMIN,RESOURCE_GROUP_ADMIN,RESOURCE_GROUP_USER,ROLE_ADMIN,SERVICE_CONNECTION_ADMIN,SESSION_VARIABLES_ADMIN,SET_USER_ID,SHOW_ROUTINE,SYSTEM_USER,SYSTEM_VARIABLES_ADMIN,TABLE_ENCRYPTION_ADMIN,XA_RECOVER_ADMIN ON *.* TO `lijiaman`@`%`
2 rows in set (0.00 sec)

 

(3.4)授權、回收賬戶許可權

要授予某個使用者許可權,使用 GRANT 語句,語法如下:

GRANT <privilege> ON <db>.<table> TO <user>@<host>;

 例如,授予使用者user2對所有資料庫有select許可權

mysql> GRANT select ON *.* TO `user2`@`%`;

 


要回收某個賬戶的許可權,使用 REVOKE 語句,語法如下:

REVOKE <privilege> ON <db>.<table> FROM <user>@<host>;

 例如,回收user2對lijiamandb資料庫的select許可權

REVOKE select ON lijiamandb.* FROM `user2`@`%`;

 

 

【完】

相關文章