1. 程式人生 > 資料庫 >MySQL使用者許可權驗證與管理方法詳解

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資料庫計有所幫助。