權限管理
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 | 解析 |
---|---|---|
myweb.wang | pps | pps,從myweb.wang連接 |
% | pps | pps,從任何主機連接 |
% | ” | 任何用戶,從任何主機連接 |
122.164.35.127 | pps | pps,從122.164.35.127連接 |
122.164.35.% | pps | pps,從122.164.35.類型子網的任何主機連接 |
查看用戶權限
對于上面創建的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 權限用于登錄,不能進行任何操作。
刪除權限
使用grant新增權限,使用revoke進行權限回收。當然回收權限,也可以直接對user、db、tables_priv和columns_priv表進行操作。但是usage權限是沒法收回的。
如回收test對所有數據庫的讀寫權限:
revoke select ,insert on . from test@127.0.0.1;
修改密碼
1.使用mysqladmin
2.使用set password for test@127.0.0.1 =password(‘isayhello’);
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中權限
權限 ? ? ? ? ? ? ? ? |
權限級別 ? ? ? ? ? ? ? ? |
權限說明 ? ? ? ? ? ? ? ? |
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 |
服務器管理 |
創建用戶權限 |
PROCESS |
服務器管理 |
查看進程權限 |
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的權限如何分布,就是針對表可以設置什么權限,針對列可以設置什么權限等等,這個可以從官方文檔中的一個表來說明:
權限分布 |
可能的設置的權限 |
表權限 |
‘Select’, ‘Insert’, ‘Update’, ‘Delete’, ‘Create’, ‘Drop’, ‘Grant’, ‘References’, ‘Index’, ‘Alter’ |
列權限 |
‘Select’, ‘Insert’, ‘Update’, ‘References’ |
過程權限 |
‘Execute’, ‘Alter Routine’, ‘Grant’ |
?以上就是MySQL中權限管理的詳圖介紹的內容,更多相關內容請關注PHP中文網(www.php.cn)!