MySQL使用者許可權驗證與管理方法詳解
本文例項講述了MySQL使用者許可權驗證與管理方法。分享給大家供大家參考,具體如下:
一、Mysql許可權分兩階段驗證
1. 伺服器檢查是否允許連線:使用者名稱、密碼,主機地址。
2. 檢查每一個請求是否有許可權實施。
二、Mysql許可權列表
許可權 | 許可權級別 | 許可權說明 |
create | 資料庫、表或索引 | 建立資料庫、表或索引許可權 |
drop | 資料庫或表 | 刪除資料庫或表許可權 |
grant option | 資料庫、表或儲存的程式 | 賦予許可權選項 |
references | 資料庫或表 | 外來鍵許可權 |
alter | 表 | 更改表,比如新增欄位、索引、修改欄位等 |
delete | 表 | 刪除資料許可權 |
index | 表 | 索引許可權 |
insert | 表 | 插入許可權 |
select | 表 | 查詢許可權 |
update | 表 | 更新許可權 |
create view | 檢視 | 建立檢視許可權 |
show view | 檢視 | 檢視檢視許可權 |
alter routine | 儲存過程 | 更改儲存過程許可權 |
create routine | 儲存過程 | 建立儲存過程許可權 |
execute | 儲存過程 | 執行儲存過程許可權 |
file | 伺服器主機上的檔案訪問 | 檔案訪問許可權 |
create temporary tables | 伺服器管理 | 建立臨時表許可權 |
lock tables | 伺服器管理 | 鎖表許可權 |
create user | 伺服器管理 | 建立使用者許可權 |
proccess | 伺服器管理 | 檢視程序許可權 |
reload | 伺服器管理 | 執行flush-hosts,flush-logs,flush-privileges,flush-status,flush-tables,flush-threads,refresh,reload等命令的許可權 |
replication client | 伺服器管理 | 複製許可權 |
replication slave | 伺服器管理 | 複製許可權 |
show databases | 伺服器管理 | 檢視資料庫許可權 |
shutdown | 伺服器管理 | 關閉資料庫許可權 |
super | 伺服器管理 | 執行kill執行緒許可權 |
三、Mysql使用者許可權管理操作
1. 許可權查詢:
(1)檢視mysql的所有使用者及其許可權:
select * from mysql.user\G;
(格式化顯示)
(2)檢視當前mysql使用者許可權:
show grants;
(3)檢視某個使用者的許可權:
show grants for 使用者名稱@主機;
示例:
show grants for root@localhost;
2. Mysql使用者建立:
方法一:使用create user命令建立。
create user '使用者名稱'@'主機' identified by '密碼';
示例:
create user 'wjt'@'localhost' identified by 'wujuntian';
方法二:直接向資料表mysql.user中插入一條使用者記錄。
示例:
複製程式碼 程式碼如下:insert into mysql.user set user='wujuntian',host='localhost',password=password('123123');
注意:
使用方法二一定要記得要執行flush privileges重新整理許可權。其次,mysql5.7以後,mysql.user表的password欄位已被authentication_string代替,所以應將“password”改為“authentication_string”,密碼一定要使用password函式加密。
3. Mysql使用者刪除:
drop user '使用者名稱'@'主機';
4. Mysql使用者許可權授予:
剛建立的使用者預設是沒有許可權的,需要使用grant指令進行許可權的授予。
grant指令完整格式:
grant 許可權列表 on 資料庫名.資料表名 to '使用者名稱'@'主機' identified by '密碼' with grant option;
示例:
grant all privileges on *.* to 'wjt'@'localhost' identified by "wujuntian" with grant option;
可使用“*”表示所有資料庫或所有資料表,“%”表示任何主機地址。
可以使用grant重複給使用者新增許可權,進行許可權疊加。
with grant option:這個選項表示該使用者可以將自己擁有的許可權授權給別人。
記得授權後一定要重新整理許可權:
flush privileges;
5. Mysql使用者許可權回收:
revoke指令格式:
revoke 許可權列表 on 資料庫名.資料表名 from 使用者名稱@主機;
示例:
revoke select on test.user from wjt@localhost;
注意:
其實GRANT語句在執行的時候,如果許可權表中不存在目標賬號,則建立賬號;如果已經存在,則執行許可權的新增。
usage許可權不能被回收,也就是說,REVOKE使用者許可權並不能刪除使用者。
6. 對賬戶重新命名:
rename user '舊使用者名稱'@'舊主機' to '新使用者名稱'@'新主機';
示例:
rename user 'wujuntian'@'localhost' to 'ajun'@'localhost';
7. Mysql使用者密碼修改:
方法一:使用set password命令。
set password for '使用者名稱'@'主機' = password('新密碼');
示例:
set password for 'root'@'localhost' = password('123456');
方法二:修改mysql.user表中的password(或authentication_string)欄位。
示例:
複製程式碼 程式碼如下:update mysql.user set password=password('123123') where user='root' and host='localhost';
注意:
此方法一定要執行“flush privileges;”指令重新整理許可權,否則密碼修改無法生效。Mysql5.7以後應將“password”改為“authentication_string”。
方法三:使用grant指令在授權時修改密碼:
grant select on 資料庫名.資料表名 to 使用者名稱@主機 identified by '新密碼' with grant option;
示例:
複製程式碼 程式碼如下:grant select on test.user to ajun@localhost identified by '111111' with grant option;
方法四:執行mysqladmin指令碼檔案。
該檔案一般在mysql安裝目錄下的bin目錄中。進入該目錄,根據一下兩種具體情況輸入命令(只有root使用者有這個許可權)。
(1)使用者尚無密碼:
mysqladmin -u 使用者名稱 password 新密碼;
(2)使用者已有密碼:
mysqladmin -u 使用者名稱 -p password 新密碼;
(回車後會提示輸入舊密碼,輸入之後即可修改成功。)
注意:
更改密碼時候一定要使用PASSWORD函式(mysqladmin 和GRANT 兩種方式不用寫,會自動加上)。
8. 忘記密碼登入mysql:
方法一:
先停止正在執行的Mysql服務,在命令列視窗進入mysql安裝目錄下的bin目錄,在-skip-grant-tables引數下執行mysqld檔案(Linux系統執行mysqld_safe檔案更安全):
mysqld --skip-grant-tables
這樣可以跳過Mysql的訪問控制,在控制檯以管理員的身份進入mysql資料庫。另外再開啟一個命令列視窗,進入mysql安裝目錄下的bin目錄,直接輸入:mysql,回車,即可登入mysql,然後就可以重新設定密碼了(注意:此時“Mysql使用者密碼修改”中的四種方法只有第二種方法能使用!)。設定成功後退出,重啟Mysql服務。
方法二:修改mysql配置檔案my.ini。
其實原理和方法一一樣,都是利用Mysql提供的--skip-grant-tables引數來跳過Mysql的訪問控制。開啟mysql配置檔案my.ini,在'[mysqld]'下加入“skip-grant-tables”,儲存,重啟Mysql服務,然後就可以不需密碼登入mysql進行密碼修改了。
Mysql中的“mysql”資料庫儲存著所有Mysql使用者的許可權資訊資料表。當Mysql啟動時,所有的許可權表內容都被讀進記憶體中,進行許可權判斷時直接使用記憶體中的內容進行判斷。用grant、revoke或set password對許可權表進行的修改會立即被伺服器注意到,GRANT操作的本質就是修改許可權表後進行許可權的重新整理。但是如果手工修改許可權表,例如使用insert、update、delete等操作許可權表的話,應該執行一個flush privileges命令,該命令會使伺服器重新讀取許可權表內容到記憶體,從而使修改生效。如果不執行該命令,必須重啟mysql服務才能生效。所以,最好使用grant、revoke或set password對許可權表進操作,可以省去執行flush privileges命令的麻煩,而且如果忘了執行這個命令的話你會很抓狂。。。
不僅如此,刪除使用者、重新命名使用者最好也分別使用drop user、rename user命令進行操作,而不要使用delete、update命令進行操作。前者不但會對mysql.user資料表進行操作,同時也會更新其他許可權表的記錄,而後者只會對mysql.user表的資料進行操作,這樣會出現很多問題,因為使用者的許可權資訊不僅僅存在於mysql.user表中。比如你使用delete刪除了mysql.user表中的一個使用者,但是沒有操作其他許可權資料表的話,那麼其他許可權資料表例如tables_priv中關於該使用者的許可權記錄還存在著,下次如果想使用create user命令建立相同名稱的使用者會失敗,只能使用insert into指令向mysql.user表中插入記錄,或者先把其他許可權資料表中與該使用者名稱相關的記錄刪除。使用update命令重新命名使用者也會出現很大問題,重新命名後用戶失去了很多的許可權,而其他許可權表中關於原使用者名稱的記錄則成了沒用的記錄,除非你對每一個許可權表都進行相同的更新操作,但這很麻煩。所以,使用drop user、rename user吧,一個命令就可以讓系統自動幫你完成所有事情,何樂而不為呢!
Mysql許可權檢查:
mysql 先檢查對大範圍是否有許可權,如果沒有再到小範圍裡去檢查。比如:先檢查對這個資料庫是否有select許可權,如果有,就允許執行。如果沒有,再檢查對錶是否有select許可權,一直到最細粒度,也沒有許可權,就拒絕執行。因此,粒度控制越細,許可權校驗的步驟越多,效能越差。
更多關於MySQL相關內容感興趣的讀者可檢視本站專題:《MySQL查詢技巧大全》、《MySQL事務操作技巧彙總》、《MySQL儲存過程技巧大全》、《MySQL資料庫鎖相關技巧彙總》及《MySQL常用函式大彙總》
希望本文所述對大家MySQL資料庫計有所幫助。