【Mysql】數據控制語言(DCL)——Grant授權和Revote回收授權

數據控制,也就是分配權限
主要包括

  • 用戶管理
  • 權限分配

開始學習數據控制之前,先了解mysql中的授權表和權限設置。

一、mysql中的授權表

mysql授權表一共涉及到5個表,分別是user、db、host、tables_priv和columns_priv。
這5張表的內容和用途如下:

表名 功能
user表 列出可以連接服務器的用戶及其口令,並且它指定他們有哪種全局(超級用戶)權限。在user表啓用的任何權限均是全局權限,並適用於所有數據庫。例如,如果你啓用了DELETE權限,在這裏列出的用戶可以從任何表中刪除記錄,所以在你這樣做之前要認真考慮。
db表 db表列出數據庫,而用戶有權限訪問它們。在這裏指定的權限適用於一個數據庫中的所有表
host表 host表與db表結合使用在一個較好層次上控制特定主機對數據庫的訪問權限,這可能比單獨使用db好些。這個表不受GRANT和REVOKE語句的影響,所以,你可能發覺你根本不是用它。
tables_priv表 tables_priv表指定表級權限,在這裏指定的一個權限適用於一個表的所有列。
columns_priv columns_priv表指定列級權限。這裏指定的權限適用於一個表的特定列。

二、mysql中的權限

三、用戶管理

創建用戶

create user ‘用戶名’@’允許其登錄的地址’ identified by ‘密碼’;

  • 創建的用戶需同時指定該用戶可以在哪個地址進行登錄,“%”代表“任何地址”
  • 用戶創建之後,自動在mysql的user表中添加了一條記錄,但該用戶還沒有權限

修改用戶密碼

修改自己密碼: set password = password(‘新密碼’);

修改他人密碼(必須有修改權限):
set  password  for  ‘用戶名’@’允許其登錄的地址’  = password(‘新密碼’);

刪除用戶

drop user ‘用戶名’@’允許其登錄的地址’;

四、權限分配

增加權限

grant 權限名1, 權限名2, ... on 數據庫名.對象名 to ‘用戶名’@’允許其登錄的地址’ identified by ‘密碼’;

  • 權限名就是:‘select’,‘update’, ‘delete’等等,ALL/all privileges代表“所有權限”
    *.*表示所有數據中的所有對象
    某數據庫名.*表示該數據庫中的所有對象
  • identified by ‘密碼’用於給一個用戶在此時修改密碼,不寫就不修改密碼
  • 該語句也可以創建用戶(如果不存在),此時identified by '密碼’必須寫
eg.
mysql> grant all on *.* to wang@'192.168.1.150' identified by "password";           //all等同於all privilege,其中的privileges可以省略
mysql> grant all privileges on *.* to wang@'192.168.1.%' identified by "123456";    //192.168.1.%表示一個網段
mysql> grant insert,select on testdb.* to wang@'%' identified by "123456";
mysql> flush privileges;      //授權之後,需要手動更新權限表

查詢權限

  1. 查詢當前用戶的權限
mysql> show grants;
+----------------------------------------------------------------------------------------------------------------------------------------+
| Grants for root@localhost                                                                                                              |
+----------------------------------------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' WITH GRANT OPTION |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION                                                                           |
+----------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
  1. 查詢指定用戶下的權限
mysql> show grants for wang@'192.168.1.%';           //可以在select user,host,password from mysql.user執行結果中找對應的權限用戶信息
+---------------------------------------------------------------------------------------------------------------+
| Grants for [email protected].%                                                                                   |
+---------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'wang'@'192.168.1.%' IDENTIFIED BY PASSWORD '*678E2A46B8C71291A3915F92736C080819AD76DF' |
| GRANT SELECT, INSERT ON `testdb`.* TO 'wang'@'192.168.1.%'                    |
+---------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

刪除權限

revoke 權限名1,權限名2, .... on 數據庫名.對象名 from ‘用戶名’@’允許其登錄的地址’;
表示從某個用戶身上“取消”某些權限(也許還保留了其他權限)

eg.
mysql> revoke create on test.test from 'user1'@'%';
mysql> flush privileges;

刷新權限

權限更改後,手動刷新權限

mysql> flush privileges;

注意事項

  • grant, revoke用戶權限後,該用戶只有重新連接MySQL數據庫,權限才能生效
  • 如果想讓授權的用戶,也可以將這些權限grant給其他用戶,那麼授權時需添加選項 “with grant option”
    如下設置後,那麼這個wang用戶連接mysql後也可以將這些權限授予其他用戶
mysql> grant insert,select on testdb.* to wang@'%' identified by "123456" with grant option;
  • 如果給用戶設置的權限過大,既可以用revoke取消權限,也可以使用grant重新賦權,覆蓋之前的密碼
    不過,grant授權後的密碼是密文形式保存的,如果記不住之前授權時的密碼,那麼怎樣保證覆蓋後的權限跟之前的權限一致?
    grant授權操作中其實不僅可以設置明文密碼,也可以設置密文密碼,如下:
1)grant 權限列表 on 庫.表.* to 用戶名@'ip' identified by "明文密碼"
2)grant 權限列表 on 庫.表.* to 用戶名@'ip' identified by password "密文密碼"

也就是說:
在grant重置權限的時候可以用查看的密文密碼當做新的密碼,然後去覆蓋之前的權限,這就保證了修改前後的密碼一致!

mysql> show grants for wang@'192.168.1.%';
+---------------------------------------------------------------------------------------------------------------+
| Grants for [email protected].%                                                                                   |
+---------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'wang'@'192.168.1.%' IDENTIFIED BY PASSWORD '*678E2A46B8C71291A3915F9S736C080819AD76DD' |
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ALTER ON `testdb`.* TO 'wang'@'192.168.1.%'                    |
+---------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
 
mysql> grant alter,select on testdb.* to wang@'192.168.1.%' identified by password '*678E2A46B8C71291A3915F9S736C080819AD76DD';
Query OK, 0 rows affected (0.00 sec)
 
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
 
mysql> show grants for wang@'192.168.1.%';
+---------------------------------------------------------------------------------------------------------------+
| Grants for [email protected].%                                                                                   |
+---------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'wang'@'192.168.1.%' IDENTIFIED BY PASSWORD '*678E2A46B8C71291A3915F9S736C080819AD76DD' |
| GRANT SELECT, ALTER ON `testdb`.* TO 'wang'@'192.168.1.%'                                                    |
+---------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)

通常開發同事在讓運維同事開通mysql權限時,他們會在自己本地mysql裏生成一個密文密碼,然後把這個密文密碼給運維同事,運維同事在用這個密文密碼進行授權,
那麼授權的密碼就只有開發同事自己知道了,其他人都不知道!比較安全的一種做法~

參考:
MySQL 操作命令梳理(4)-- grant授權和revoke回收權限

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