MySQL用戶權限驗證與管理方法詳解
本文實例講述了MySQL用戶權限驗證與管理方法。分享給大家供大家參考,具體如下:
一、Mysql權限分兩階段驗證
1. 服務器檢查是否允許連接:用戶名、密碼,主機地址。
2. 檢查每一個請求是否有權限實施。
二、Mysql權限列表
權限 | 權限級別 | 權限說明 |
create | 數(shù)據(jù)庫、表或索引 | 創(chuàng)建數(shù)據(jù)庫、表或索引權限 |
drop | 數(shù)據(jù)庫或表 | 刪除數(shù)據(jù)庫或表權限 |
grant option | 數(shù)據(jù)庫、表或保存的程序 | 賦予權限選項 |
references | 數(shù)據(jù)庫或表 | 外鍵權限 |
alter | 表 | 更改表,比如添加字段、索引、修改字段等 |
delete | 表 | 刪除數(shù)據(jù)權限 |
index | 表 | 索引權限 |
insert | 表 | 插入權限 |
select | 表 | 查詢權限 |
update | 表 | 更新權限 |
create view | 視圖 | 創(chuàng)建視圖權限 |
show view | 視圖 | 查看視圖權限 |
alter routine | 存儲過程 | 更改存儲過程權限 |
create routine | 存儲過程 | 創(chuàng)建存儲過程權限 |
execute | 存儲過程 | 執(zhí)行存儲過程權限 |
file | 服務器主機上的文件訪問 | 文件訪問權限 |
create temporary tables | 服務器管理 | 創(chuàng)建臨時表權限 |
lock tables | 服務器管理 | 鎖表權限 |
create user | 服務器管理 | 創(chuàng)建用戶權限 |
proccess | 服務器管理 | 查看進程權限 |
reload | 服務器管理 | 執(zhí)行flush-hosts, flush-logs, flush-privileges, flush-status, flush-tables, flush-threads, refresh, reload等命令的權限 |
replication client | 服務器管理 | 復制權限 |
replication slave | 服務器管理 | 復制權限 |
show databases | 服務器管理 | 查看數(shù)據(jù)庫權限 |
shutdown | 服務器管理 | 關閉數(shù)據(jù)庫權限 |
super | 服務器管理 | 執(zhí)行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用戶創(chuàng)建:
方法一:使用create user命令創(chuàng)建。
create user '用戶名'@'主機' identified by '密碼';
示例:
create user 'wjt'@'localhost' identified by 'wujuntian';
方法二:直接向數(shù)據(jù)表mysql.user中插入一條用戶記錄。
示例:
注意:
使用方法二一定要記得要執(zhí)行flush privileges刷新權限。其次,mysql5.7以后,mysql.user表的password字段已被authentication_string代替,所以應將“password”改為“authentication_string”,密碼一定要使用password函數(shù)加密。
3. Mysql用戶刪除:
drop user '用戶名'@'主機';
4. Mysql用戶權限授予:
剛創(chuàng)建的用戶默認是沒有權限的,需要使用grant指令進行權限的授予。
grant指令完整格式:
grant 權限列表 on 數(shù)據(jù)庫名.數(shù)據(jù)表名 to '用戶名'@'主機' identified by '密碼' with grant option;
示例:
grant all privileges on *.* to 'wjt'@'localhost' identified by "wujuntian" with grant option;
可使用“*”表示所有數(shù)據(jù)庫或所有數(shù)據(jù)表,“%”表示任何主機地址。
可以使用grant重復給用戶添加權限,進行權限疊加。
with grant option:這個選項表示該用戶可以將自己擁有的權限授權給別人。
記得授權后一定要刷新權限:
flush privileges;
5. Mysql用戶權限回收:
revoke指令格式:
revoke 權限列表 on 數(shù)據(jù)庫名.數(shù)據(jù)表名 from 用戶名@主機;
示例:
revoke select on test.user from wjt@localhost;
注意:
其實GRANT語句在執(zhí)行的時候,如果權限表中不存在目標賬號,則創(chuàng)建賬號;如果已經(jīng)存在,則執(zhí)行權限的新增。
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)字段。
示例:
注意:
此方法一定要執(zhí)行“flush privileges;”指令刷新權限,否則密碼修改無法生效。Mysql5.7以后應將“password”改為“authentication_string”。
方法三:使用grant指令在授權時修改密碼:
grant select on 數(shù)據(jù)庫名.數(shù)據(jù)表名 to 用戶名@主機 identified by '新密碼' with grant option;
示例:
方法四:運行mysqladmin腳本文件。
該文件一般在mysql安裝目錄下的bin目錄中。進入該目錄,根據(jù)一下兩種具體情況輸入命令(只有root用戶有這個權限)。
(1)用戶尚無密碼:
mysqladmin -u 用戶名 password 新密碼;
(2)用戶已有密碼:
mysqladmin -u 用戶名 -p password 新密碼;
(回車后會提示輸入舊密碼,輸入之后即可修改成功。)
注意:
更改密碼時候一定要使用PASSWORD函數(shù)(mysqladmin 和GRANT 兩種方式不用寫,會自動加上)。
8. 忘記密碼登錄mysql:
方法一:
先停止正在運行的Mysql服務,在命令行窗口進入mysql安裝目錄下的bin目錄,在-skip-grant-tables參數(shù)下運行mysqld文件(Linux系統(tǒng)運行mysqld_safe文件更安全):
mysqld --skip-grant-tables
這樣可以跳過Mysql的訪問控制,在控制臺以管理員的身份進入mysql數(shù)據(jù)庫。另外再開啟一個命令行窗口,進入mysql安裝目錄下的bin目錄,直接輸入:mysql,回車,即可登錄mysql,然后就可以重新設置密碼了(注意:此時“Mysql用戶密碼修改”中的四種方法只有第二種方法能使用!)。設置成功后退出,重啟Mysql服務。
方法二:修改mysql配置文件my.ini。
其實原理和方法一一樣,都是利用Mysql提供的--skip-grant-tables參數(shù)來跳過Mysql的訪問控制。打開mysql配置文件my.ini,在'[mysqld]'下加入“skip-grant-tables”,保存,重啟Mysql服務,然后就可以不需密碼登錄mysql進行密碼修改了。
Mysql中的“mysql”數(shù)據(jù)庫存儲著所有Mysql用戶的權限信息數(shù)據(jù)表。當Mysql啟動時,所有的權限表內容都被讀進內存中,進行權限判斷時直接使用內存中的內容進行判斷。用grant、revoke或set password對權限表進行的修改會立即被服務器注意到,GRANT操作的本質就是修改權限表后進行權限的刷新。但是如果手工修改權限表,例如使用insert、update、delete等操作權限表的話,應該執(zhí)行一個flush privileges命令,該命令會使服務器重新讀取權限表內容到內存,從而使修改生效。如果不執(zhí)行該命令,必須重啟mysql服務才能生效。所以,最好使用grant、revoke或set password對權限表進操作,可以省去執(zhí)行flush privileges命令的麻煩,而且如果忘了執(zhí)行這個命令的話你會很抓狂。。。
不僅如此,刪除用戶、重命名用戶最好也分別使用drop user、rename user命令進行操作,而不要使用delete、update命令進行操作。前者不但會對mysql.user數(shù)據(jù)表進行操作,同時也會更新其他權限表的記錄,而后者只會對mysql.user表的數(shù)據(jù)進行操作,這樣會出現(xiàn)很多問題,因為用戶的權限信息不僅僅存在于mysql.user表中。比如你使用delete刪除了mysql.user表中的一個用戶,但是沒有操作其他權限數(shù)據(jù)表的話,那么其他權限數(shù)據(jù)表例如tables_priv中關于該用戶的權限記錄還存在著,下次如果想使用create user命令創(chuàng)建相同名稱的用戶會失敗,只能使用insert into指令向mysql.user表中插入記錄,或者先把其他權限數(shù)據(jù)表中與該用戶名相關的記錄刪除。使用update命令重命名用戶也會出現(xiàn)很大問題,重命名后用戶失去了很多的權限,而其他權限表中關于原用戶名的記錄則成了沒用的記錄,除非你對每一個權限表都進行相同的更新操作,但這很麻煩。所以,使用drop user、rename user吧,一個命令就可以讓系統(tǒng)自動幫你完成所有事情,何樂而不為呢!
Mysql權限檢查:
mysql 先檢查對大范圍是否有權限,如果沒有再到小范圍里去檢查。比如:先檢查對這個數(shù)據(jù)庫是否有select權限,如果有,就允許執(zhí)行。如果沒有,再檢查對表是否有select權限,一直到最細粒度,也沒有權限,就拒絕執(zhí)行。因此,粒度控制越細,權限校驗的步驟越多,性能越差。
更多關于MySQL相關內容感興趣的讀者可查看本站專題:《MySQL查詢技巧大全》、《MySQL事務操作技巧匯總》、《MySQL存儲過程技巧大全》、《MySQL數(shù)據(jù)庫鎖相關技巧匯總》及《MySQL常用函數(shù)大匯總》
希望本文所述對大家MySQL數(shù)據(jù)庫計有所幫助。
相關文章
mysql+Spring數(shù)據(jù)庫隔離級別與性能分析
數(shù)據(jù)庫隔離級別與Spring配置事務的聯(lián)系及性能影響,以下是個人理解,如果有瑕疵請及時指正2014-05-05一文帶你永久擺脫Mysql時區(qū)錯誤問題(idea數(shù)據(jù)庫可視化插件配置)
在MySQL啟動時會檢查當前系統(tǒng)的時區(qū)并根據(jù)系統(tǒng)時區(qū)設置全局參數(shù)system_time_zone的值,下面這篇文章主要給大家介紹了關于如何永久擺脫Mysql時區(qū)錯誤問題(idea數(shù)據(jù)庫可視化插件配置)的相關資料,需要的朋友可以參考下2022-08-08Mysql表數(shù)據(jù)比較大情況下修改添加字段的方法實例
最近遇到的一個問題,需要在一張1800萬數(shù)據(jù)量的表中添加加一個字段,所以這篇文章主要給大家介紹了關于Mysql表數(shù)據(jù)比較大情況下修改添加字段的方法,需要的朋友可以參考下2022-06-06MySQL存儲引擎簡介及MyISAM和InnoDB的區(qū)別
這篇文章主要介紹了MySQL存儲引擎簡介及MyISAM和InnoDB的區(qū)別,重點介紹了MyISAM 和 InnoDB的區(qū)別,需要的朋友可以參考下2014-05-05Windows下MySQL?8.0.29?安裝和刪除圖文教程
這篇文章主要為大家詳細介紹了Windows下MySQL?8.0.29?安裝和刪除圖文教程,文中安裝步驟介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-07-07