數據控制,也就是分配權限
主要包括
- 用戶管理
- 權限分配
開始學習數據控制之前,先了解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; //授權之後,需要手動更新權限表
查詢權限
- 查詢當前用戶的權限
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)
- 查詢指定用戶下的權限
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裏生成一個密文密碼,然後把這個密文密碼給運維同事,運維同事在用這個密文密碼進行授權,
那麼授權的密碼就只有開發同事自己知道了,其他人都不知道!比較安全的一種做法~