MySQL用戶權(quán)限驗(yàn)證與管理方法詳解
本文實(shí)例講述了MySQL用戶權(quán)限驗(yàn)證與管理方法。分享給大家供大家參考,具體如下:
一、Mysql權(quán)限分兩階段驗(yàn)證
1. 服務(wù)器檢查是否允許連接:用戶名、密碼,主機(jī)地址。
2. 檢查每一個(gè)請(qǐng)求是否有權(quán)限實(shí)施。
二、Mysql權(quán)限列表
| 權(quán)限 | 權(quán)限級(jí)別 | 權(quán)限說(shuō)明 |
| create | 數(shù)據(jù)庫(kù)、表或索引 | 創(chuàng)建數(shù)據(jù)庫(kù)、表或索引權(quán)限 |
| drop | 數(shù)據(jù)庫(kù)或表 | 刪除數(shù)據(jù)庫(kù)或表權(quán)限 |
| grant option | 數(shù)據(jù)庫(kù)、表或保存的程序 | 賦予權(quán)限選項(xiàng) |
| references | 數(shù)據(jù)庫(kù)或表 | 外鍵權(quán)限 |
| alter | 表 | 更改表,比如添加字段、索引、修改字段等 |
| delete | 表 | 刪除數(shù)據(jù)權(quán)限 |
| index | 表 | 索引權(quán)限 |
| insert | 表 | 插入權(quán)限 |
| select | 表 | 查詢(xún)權(quán)限 |
| update | 表 | 更新權(quán)限 |
| create view | 視圖 | 創(chuàng)建視圖權(quán)限 |
| show view | 視圖 | 查看視圖權(quán)限 |
| alter routine | 存儲(chǔ)過(guò)程 | 更改存儲(chǔ)過(guò)程權(quán)限 |
| create routine | 存儲(chǔ)過(guò)程 | 創(chuàng)建存儲(chǔ)過(guò)程權(quán)限 |
| execute | 存儲(chǔ)過(guò)程 | 執(zhí)行存儲(chǔ)過(guò)程權(quán)限 |
| file | 服務(wù)器主機(jī)上的文件訪問(wèn) | 文件訪問(wèn)權(quán)限 |
| create temporary tables | 服務(wù)器管理 | 創(chuàng)建臨時(shí)表權(quán)限 |
| lock tables | 服務(wù)器管理 | 鎖表權(quán)限 |
| create user | 服務(wù)器管理 | 創(chuàng)建用戶權(quán)限 |
| proccess | 服務(wù)器管理 | 查看進(jìn)程權(quán)限 |
| reload | 服務(wù)器管理 | 執(zhí)行flush-hosts, flush-logs, flush-privileges, flush-status, flush-tables, flush-threads, refresh, reload等命令的權(quán)限 |
| replication client | 服務(wù)器管理 | 復(fù)制權(quán)限 |
| replication slave | 服務(wù)器管理 | 復(fù)制權(quán)限 |
| show databases | 服務(wù)器管理 | 查看數(shù)據(jù)庫(kù)權(quán)限 |
| shutdown | 服務(wù)器管理 | 關(guān)閉數(shù)據(jù)庫(kù)權(quán)限 |
| super | 服務(wù)器管理 | 執(zhí)行kill線程權(quán)限 |
三、Mysql用戶權(quán)限管理操作
1. 權(quán)限查詢(xún):
(1)查看mysql的所有用戶及其權(quán)限:
select * from mysql.user\G;
(格式化顯示)
(2)查看當(dāng)前mysql用戶權(quán)限:
show grants;
(3)查看某個(gè)用戶的權(quán)限:
show grants for 用戶名@主機(jī);
示例:
show grants for root@localhost;
2. Mysql用戶創(chuàng)建:
方法一:使用create user命令創(chuàng)建。
create user '用戶名'@'主機(jī)' identified by '密碼';
示例:
create user 'wjt'@'localhost' identified by 'wujuntian';
方法二:直接向數(shù)據(jù)表mysql.user中插入一條用戶記錄。
示例:
注意:
使用方法二一定要記得要執(zhí)行flush privileges刷新權(quán)限。其次,mysql5.7以后,mysql.user表的password字段已被authentication_string代替,所以應(yīng)將“password”改為“authentication_string”,密碼一定要使用password函數(shù)加密。
3. Mysql用戶刪除:
drop user '用戶名'@'主機(jī)';
4. Mysql用戶權(quán)限授予:
剛創(chuàng)建的用戶默認(rèn)是沒(méi)有權(quán)限的,需要使用grant指令進(jìn)行權(quán)限的授予。
grant指令完整格式:
grant 權(quán)限列表 on 數(shù)據(jù)庫(kù)名.數(shù)據(jù)表名 to '用戶名'@'主機(jī)' identified by '密碼' with grant option;
示例:
grant all privileges on *.* to 'wjt'@'localhost' identified by "wujuntian" with grant option;
可使用“*”表示所有數(shù)據(jù)庫(kù)或所有數(shù)據(jù)表,“%”表示任何主機(jī)地址。
可以使用grant重復(fù)給用戶添加權(quán)限,進(jìn)行權(quán)限疊加。
with grant option:這個(gè)選項(xiàng)表示該用戶可以將自己擁有的權(quán)限授權(quán)給別人。
記得授權(quán)后一定要刷新權(quán)限:
flush privileges;
5. Mysql用戶權(quán)限回收:
revoke指令格式:
revoke 權(quán)限列表 on 數(shù)據(jù)庫(kù)名.數(shù)據(jù)表名 from 用戶名@主機(jī);
示例:
revoke select on test.user from wjt@localhost;
注意:
其實(shí)GRANT語(yǔ)句在執(zhí)行的時(shí)候,如果權(quán)限表中不存在目標(biāo)賬號(hào),則創(chuàng)建賬號(hào);如果已經(jīng)存在,則執(zhí)行權(quán)限的新增。
usage權(quán)限不能被回收,也就是說(shuō),REVOKE用戶權(quán)限并不能刪除用戶。
6. 對(duì)賬戶重命名:
rename user '舊用戶名'@'舊主機(jī)' to '新用戶名'@'新主機(jī)';
示例:
rename user 'wujuntian'@'localhost' to 'ajun'@'localhost';
7. Mysql用戶密碼修改:
方法一:使用set password命令。
set password for '用戶名'@'主機(jī)' = password('新密碼');
示例:
set password for 'root'@'localhost' = password('123456');
方法二:修改mysql.user表中的password(或authentication_string)字段。
示例:
注意:
此方法一定要執(zhí)行“flush privileges;”指令刷新權(quán)限,否則密碼修改無(wú)法生效。Mysql5.7以后應(yīng)將“password”改為“authentication_string”。
方法三:使用grant指令在授權(quán)時(shí)修改密碼:
grant select on 數(shù)據(jù)庫(kù)名.數(shù)據(jù)表名 to 用戶名@主機(jī) identified by '新密碼' with grant option;
示例:
方法四:運(yùn)行mysqladmin腳本文件。
該文件一般在mysql安裝目錄下的bin目錄中。進(jìn)入該目錄,根據(jù)一下兩種具體情況輸入命令(只有root用戶有這個(gè)權(quán)限)。
(1)用戶尚無(wú)密碼:
mysqladmin -u 用戶名 password 新密碼;
(2)用戶已有密碼:
mysqladmin -u 用戶名 -p password 新密碼;
(回車(chē)后會(huì)提示輸入舊密碼,輸入之后即可修改成功。)
注意:
更改密碼時(shí)候一定要使用PASSWORD函數(shù)(mysqladmin 和GRANT 兩種方式不用寫(xiě),會(huì)自動(dòng)加上)。
8. 忘記密碼登錄mysql:
方法一:
先停止正在運(yùn)行的Mysql服務(wù),在命令行窗口進(jìn)入mysql安裝目錄下的bin目錄,在-skip-grant-tables參數(shù)下運(yùn)行mysqld文件(Linux系統(tǒng)運(yùn)行mysqld_safe文件更安全):
mysqld --skip-grant-tables
這樣可以跳過(guò)Mysql的訪問(wèn)控制,在控制臺(tái)以管理員的身份進(jìn)入mysql數(shù)據(jù)庫(kù)。另外再開(kāi)啟一個(gè)命令行窗口,進(jìn)入mysql安裝目錄下的bin目錄,直接輸入:mysql,回車(chē),即可登錄mysql,然后就可以重新設(shè)置密碼了(注意:此時(shí)“Mysql用戶密碼修改”中的四種方法只有第二種方法能使用?。?。設(shè)置成功后退出,重啟Mysql服務(wù)。
方法二:修改mysql配置文件my.ini。
其實(shí)原理和方法一一樣,都是利用Mysql提供的--skip-grant-tables參數(shù)來(lái)跳過(guò)Mysql的訪問(wèn)控制。打開(kāi)mysql配置文件my.ini,在'[mysqld]'下加入“skip-grant-tables”,保存,重啟Mysql服務(wù),然后就可以不需密碼登錄mysql進(jìn)行密碼修改了。
Mysql中的“mysql”數(shù)據(jù)庫(kù)存儲(chǔ)著所有Mysql用戶的權(quán)限信息數(shù)據(jù)表。當(dāng)Mysql啟動(dòng)時(shí),所有的權(quán)限表內(nèi)容都被讀進(jìn)內(nèi)存中,進(jìn)行權(quán)限判斷時(shí)直接使用內(nèi)存中的內(nèi)容進(jìn)行判斷。用grant、revoke或set password對(duì)權(quán)限表進(jìn)行的修改會(huì)立即被服務(wù)器注意到,GRANT操作的本質(zhì)就是修改權(quán)限表后進(jìn)行權(quán)限的刷新。但是如果手工修改權(quán)限表,例如使用insert、update、delete等操作權(quán)限表的話,應(yīng)該執(zhí)行一個(gè)flush privileges命令,該命令會(huì)使服務(wù)器重新讀取權(quán)限表內(nèi)容到內(nèi)存,從而使修改生效。如果不執(zhí)行該命令,必須重啟mysql服務(wù)才能生效。所以,最好使用grant、revoke或set password對(duì)權(quán)限表進(jìn)操作,可以省去執(zhí)行flush privileges命令的麻煩,而且如果忘了執(zhí)行這個(gè)命令的話你會(huì)很抓狂。。。
不僅如此,刪除用戶、重命名用戶最好也分別使用drop user、rename user命令進(jìn)行操作,而不要使用delete、update命令進(jìn)行操作。前者不但會(huì)對(duì)mysql.user數(shù)據(jù)表進(jìn)行操作,同時(shí)也會(huì)更新其他權(quán)限表的記錄,而后者只會(huì)對(duì)mysql.user表的數(shù)據(jù)進(jìn)行操作,這樣會(huì)出現(xiàn)很多問(wèn)題,因?yàn)橛脩舻臋?quán)限信息不僅僅存在于mysql.user表中。比如你使用delete刪除了mysql.user表中的一個(gè)用戶,但是沒(méi)有操作其他權(quán)限數(shù)據(jù)表的話,那么其他權(quán)限數(shù)據(jù)表例如tables_priv中關(guān)于該用戶的權(quán)限記錄還存在著,下次如果想使用create user命令創(chuàng)建相同名稱(chēng)的用戶會(huì)失敗,只能使用insert into指令向mysql.user表中插入記錄,或者先把其他權(quán)限數(shù)據(jù)表中與該用戶名相關(guān)的記錄刪除。使用update命令重命名用戶也會(huì)出現(xiàn)很大問(wèn)題,重命名后用戶失去了很多的權(quán)限,而其他權(quán)限表中關(guān)于原用戶名的記錄則成了沒(méi)用的記錄,除非你對(duì)每一個(gè)權(quán)限表都進(jìn)行相同的更新操作,但這很麻煩。所以,使用drop user、rename user吧,一個(gè)命令就可以讓系統(tǒng)自動(dòng)幫你完成所有事情,何樂(lè)而不為呢!
Mysql權(quán)限檢查:
mysql 先檢查對(duì)大范圍是否有權(quán)限,如果沒(méi)有再到小范圍里去檢查。比如:先檢查對(duì)這個(gè)數(shù)據(jù)庫(kù)是否有select權(quán)限,如果有,就允許執(zhí)行。如果沒(méi)有,再檢查對(duì)表是否有select權(quán)限,一直到最細(xì)粒度,也沒(méi)有權(quán)限,就拒絕執(zhí)行。因此,粒度控制越細(xì),權(quán)限校驗(yàn)的步驟越多,性能越差。
更多關(guān)于MySQL相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《MySQL查詢(xún)技巧大全》、《MySQL事務(wù)操作技巧匯總》、《MySQL存儲(chǔ)過(guò)程技巧大全》、《MySQL數(shù)據(jù)庫(kù)鎖相關(guān)技巧匯總》及《MySQL常用函數(shù)大匯總》
希望本文所述對(duì)大家MySQL數(shù)據(jù)庫(kù)計(jì)有所幫助。
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。
關(guān)注官方微信