MySQL用戶與權限管理

(一)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`@`%`;

 

 

【完】

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章