Spring的控制反轉(IoC)容器 (三)
MySQL許可權工作原理
使用者識別方式
MySQL為了安全性考慮,採⽤主機名+⽤戶名來判斷⼀個⽤戶的⾝份,因為在互聯⽹中很難通過⽤戶名來判斷⼀個⽤戶的⾝份,但是我們可以通過IP或者主機名判斷⼀臺機器,某個⽤戶通過這個機器過來的,我們可以識別為⼀個⽤戶,所以MySQL中採⽤⽤戶名+主機名來識別⽤戶的⾝份。當⼀個⽤戶對MySQL傳送指令的時候,MySQL就是通過⽤戶名和來源(主機)來斷定⽤戶的許可權。
許可權驗證方式
- 階段1:連線資料庫,此時MySQL會根據你的⽤戶名及你的來源(IP或者主機名稱)判斷是否有許可權連線
- 階段2:對MySQL伺服器發起請求操作,如CREATE TABLE、SELECT、DELETE、UPDATE、CREATE INDEX等操作,此時MySQL會判斷你是否有許可權操作這些指令
許可權生效時間
⽤戶及許可權資訊放在庫名為mysql的庫中,MySQL啟動時,這些內容被讀進記憶體並且從此時⽣效,所以如果通過直接操作這些表來修改⽤戶及許可權資訊的,需要重啟MySQL或者執⾏FLUSH PRIVILEDGE;才可以⽣效。⽤戶登入之後,MySQL會和當前⽤戶之間建立⼀個連線,此時⽤戶相關的許可權資訊都儲存在這個連線中,存放在記憶體中,此時如果有其他地⽅修改了當前⽤戶的許可權,這些變更的許可權會在下⼀次登入時才會⽣效。
建立和刪除使用者及管理使用者許可權
使用者資訊儲存在mysql資料庫下的user表中,表中User欄位表示使用者名稱,Host欄位表示主機名,authcation_string欄位表示登入密碼。
-
檢視MySQL中所有使用者資訊
-
通過CREATE USER建立
CREATE USER常用語法如下,詳細語法可通過help CREATE USER命令檢視。
CREATE USER <使用者名稱>[@<主機名>] IDENTIFIED BY '<密碼>';
示例:
-
修改使用者密碼
-
通過SET PASSWORD 指令修改
SET PASSWORD指令語法如下
SET PASSWORD [FOR <使用者名稱@主機名>] auth_option [REPLACE '<當前密碼>'] [RETAIN CURRENT PASSWORD];
其中auth_option: { = '<密碼>'| TO RANDOM}
2. #### 通過操縱user表修改
注: 通過表修改需要FLUSH PRIVILEDGES或者重新登入才生效
-
檢視使用者許可權
通過SHOW GRANTS命令檢視,命令語法如下:
SHOW GRANTS [FOR <使用者名稱@主機名>];
示例:
-
授予使用者許可權
使用GRANT命令來給使用者授權,該命令常用語法如下,具體語法可使用help GRANT檢視
GRANT priv_type[(<欄位列表>)] [,priv_type[(<欄位列表>)]]... ON priv_level TO <使用者>[,<使用者>]...
priv_type:{ALL |SELECT | INSERT | UPDATE | DELETE | CREATE | DROP | ALTER | 其他許可權型別可檢視手冊}
priv_level: { *| *.* | db_name.* | db_name.tbl_name | tbl_name | db_name.routine_name}
示例:
-
撤銷使用者許可權
使用REVOKE命令來給使用者授權,該命令常用語法如下,具體語法可使用help GRANT檢視
REVOKE priv_type[(<欄位列表>)] [,priv_type[(<欄位列表>)]]...ON priv_level FROM <使用者>[,<使用者>]...
-
刪除使用者
1. 通過DEOP USER 刪除使用者
DROP USER常用語法如下,詳細語法可通過help DROP USER命令檢視。
DROP USER <使用者名稱>[@<主機名>]
示例:
2. 通過操縱user表刪除使用者
示例:
注: 通過表修改需要FLUSH PRIVILEDGES或者重新登入才生效
授權原則說明
- 只授予能滿⾜需要的最⼩許可權,防⽌⽤戶⼲壞事,⽐如⽤戶只是需要查詢,那就只給
SELECT許可權就可以了,不要給⽤戶賦予UPDATE、INSERT或者DELETE許可權 - 建立⽤戶的時候限制⽤戶的登入主機,⼀般是限制成指定IP或者內⽹IP段
- 初始化資料庫的時候刪除沒有密碼的⽤戶,安裝完資料庫的時候會⾃動建立⼀些⽤
戶,這些⽤戶預設沒有密碼 - 為每個⽤戶設定滿⾜密碼複雜度的密碼
- 定期清理不需要的⽤戶,回收許可權或者刪除⽤戶