MySQL權限系統透過下面兩個階段進行認證:
#對連線的使用者進行身分認證,合法的使用者通過認證,不合法的使用者拒絕連線。
對通過認證的合法使用者授予對應的權限,使用者可以透過再這些權限範圍內對資料庫做對應的操作。
在權限存取過程中,主要涉及到mysql資料庫下user表和db表。 user表的資料結構如下:
db表資料結構如下:
表的說明:其中包含使用者列、權限列、安全性列和資源控制列。用的最頻繁的是使用者列和權限列,權限分為普通權限和管理權限。普通權限使用者資料庫的操作如select_priv、insert_priv等。管理權限主要用來管理資料庫的操作,例如process_priv、super_priv等。
用戶進行連線的時候,權限表的存取過程:
先從user表中的host、user和password這三個欄位判斷連線的ip、用戶名以及密碼是否存在表中,如果存在,則通過驗證,否則拒絕連線。
經過驗證之後,依照下列權限表的順序得到資料庫權限:user->db->tables->priv->columns_priv。全域權限,覆蓋局部權限。例如一個使用者在user表中擁有選擇權限,那麼他將對所有資料中的所有資料表所有的欄位都有選擇權限。
權限查找詳細描述:當使用者通過權限認證之後,進行權限分配時候,按照user->db->tables_priv->columns_priv的順序進行權限分配,即先檢查權限表user,如果user表中對應的權限為Y,此時使用者對應所有的資料庫權限為Y,將不再檢查db、tables_priv、columns_priv;如果為N,則到db表中進行查找使用者對於特定資料庫權限,如果得到db中的Y權限,則不在查找,否則檢查tables_priv,看該資料庫對應的特定表權限,如果為Y,則不在查找,否則檢查columns_priv表,查看對應的特定列權限。這一點對於我們授予使用者權限很重要。
建立用戶,可以使用grant語法建立或直接操作user表。
方法一:
直接操作use表
insert into user(Host
,User
,Password
) values(“127.0.0.1 ”,”test”,password(“51testit”));
方法二:
格式CREATE USER 'username'@'host' IDENTIFIED BY 'password';
eg:CREATE USER 'test'@ '127.0.0.1' IDENTIFIED BY '51testit';
建立之後,登入如下:
MySQL加密方式: MYSQL323加密中產生的是16位元字串,而在MySQLSHA1中生存的是41位字串,其中是不加入實際的密碼運算中,透過觀察在很多用戶中都攜帶了”“,在實際破解過程中去掉”*”,也就是說MySQLSHA1加密的密碼的實際位數是40位。
Host欄位描述
Host值可以是主機名稱或IP號,或是locahost代表本機。
可以再host列值前面使用通配符”%”和”_”,”%”代表匹配任何主機,空的Host值等於”%”。如”%.myweb.com”,匹配所有mysql.com網域的所有主機。案例如下:
Host | User | 解析 |
---|---|---|
pps | pps,從myweb.wang連接 | |
pps | pps,從任何主機連接 | |
」 | 任何用戶,從任何主機連接 | |
pps | pps,從122.164.35.127連接 |
對於上面建立的test,我沒有進行任何授權操作,當我使用test使用者去操作資料庫時候,發現:
##沒有資料庫操作權限,怎樣才能查看使用者擁有的權限呢?
查看權限
方法一:
show grants for test@127.0.0.1;
方法二:
查看user表中記錄的權限。
select * from mysql.user where user='test' and host='127.0.0.1' \G;
grant [privilege1|privilege2|all privileges] on dbName|
.tableName 或 to user@hostName ; 當給test使用者授予xxpt選擇權限時:
grant select On xxpt. * to test.127.0.0.1;
db表發生了變化,新增加一筆記錄。但是user表並沒有改變。如下:
此時,可以使用test用戶進行資料查詢操作,但不能進行增、刪、改。於是授予其關於xxpt資料庫的所有權限。
grant all privileges on xxpt.* to test@127.0.0.1;
使用者test權限如下:
此時可以更新資料
#管理權限sueper、process、file授予
grant sueper,process,file On
. to 'test'@'127.0.0.1'; 語句中on後面只能是
. 備註:usage 權限用於登錄,不能進行任何操作。
如回收test對所有資料庫的讀寫權限:
revoke select ,insert on
. from test@127.0.0.1;##修改密碼
3.透過grant usage
grant usage on
.
to 'test '@'127.0.0.1' identified by 'isayhello'; 4.直接修改user表update user set Password=password(“newpassword”) where
***;補充mysql中權限
權限
|
權限等級
|
權限說明
|
#資料庫、表或索引 | 建立資料庫、表格或索引權限 | |
#資料庫或資料表 | 刪除資料庫或表格權限 | |
#資料庫、資料表或已儲存的程式 | 賦予權限選項 | |
資料庫或表格 |
| |
#表 | 變更表,例如新增欄位、索引等 | |
##刪除資料權限 |
||
INDEX |
#表 |
|
索引權限 | INSERT |
|
已插入權限 | SELECT |
|
#查詢權限 | ######################################################################################################################################################################### ############UPDATE############表### | 更新權限 |
CREATE VIEW |
##」檢視##CREATE VIEW | ##」檢視 |
SHOW VIEW |
檢視 |
|
##檢視檢視權限 |
ALTER ROUTINE | 預存程序 |
更改預存程序權限 |
CREATE ROUTINE | 預存程序 |
建立預存程序權限 |
EXECUTE | 預存程序 |
執行儲存程序權限 |
FILE | #伺服器主機上的檔案存取 |
#檔案存取權 |
CREATE TEMPORARY TABLES | 伺服器管理 |
#建立臨時表格權限 |
LOCK TABLES | 伺服器管理 |
鎖定表權限 |
CREATE USER | 伺服器管理 |
##建立使用者權限 | PROCESS |
|
#查看程式權限 |
RELOAD |
# ## |
執行flush-hosts, flush-logs, flush-privileges, flush-status, flush-tables, flush-threads, refresh, reload等指令的權限 | REPLICATION CLIENT | |
複製權限 | ##REPLICATION SLAVE | 伺服器管理 |
##複製權限 | SHOW DATABASES | 伺服器管理 |
查看資料庫權限 | SHUTDOWN | 伺服器管理 |
#關閉資料庫權限 | ##SUPER |
伺服器管理 |
權限分佈 |
|
表格權限 |
|
列權限 |
|
程式權限 |