《Mysql入門數(shù)據(jù)庫(kù)的用戶帳號(hào)管理基礎(chǔ)知識(shí)》要點(diǎn):
本文介紹了Mysql入門數(shù)據(jù)庫(kù)的用戶帳號(hào)管理基礎(chǔ)知識(shí),希望對(duì)您有用。如果有疑問,可以聯(lián)系我們。
MySQL管理員應(yīng)該知道怎樣通過指定哪些用戶可連接到服務(wù)器、從哪里進(jìn)行連接,以及在連接時(shí)做什么,來(lái)設(shè)置MySQL用戶賬號(hào).MySQL3.22.11引入了兩個(gè)更容易進(jìn)行這項(xiàng)工作的語(yǔ)句:GRANT?語(yǔ)句創(chuàng)建MySQL用戶并指定其權(quán)限,REVOKE?語(yǔ)句刪除權(quán)限.這兩個(gè)語(yǔ)句充當(dāng)mysql數(shù)據(jù)庫(kù)中的授權(quán)表的前端,并提供直接操縱這些表內(nèi)容的可選擇的方法.GRANT?和REVOKE?語(yǔ)句影響以下四個(gè)表:?
授權(quán)表?內(nèi)容
user?可連接到服務(wù)器的用戶和他們擁有的任何全局特權(quán)
db?數(shù)據(jù)庫(kù)級(jí)的特權(quán)
tables?_?priv?表級(jí)特權(quán)
c?o?l?um?n?s?_?priv?列級(jí)特權(quán)
還有第五個(gè)授權(quán)表(?host),但它不受GRANT?或REVOKE的影響.
當(dāng)您為某個(gè)用戶發(fā)布GRANT?語(yǔ)句時(shí),應(yīng)在user表中為該用戶創(chuàng)建一個(gè)項(xiàng).如果該語(yǔ)句指定了所有全局特權(quán)(管理權(quán)限或用于所有數(shù)據(jù)庫(kù)的權(quán)限),則這些指定也被記錄在user表中.如果指定了數(shù)據(jù)庫(kù)、表或列的權(quán)限,它們將記錄在db、tables_priv?和columns_priv表中.
???????使用GRANT?和REVOKE語(yǔ)句比直接修改授權(quán)表更容易.但是,建議您最好通過閱讀第12章來(lái)補(bǔ)充本章的內(nèi)容,第12章中詳細(xì)討論了授權(quán)表.這些表非常重要,作為一位管理員應(yīng)該了解這些表是怎樣在GRANT?和REVOKE?語(yǔ)句級(jí)上工作的.
????????本節(jié)下面的部分將討論如何設(shè)置MySQL用戶的賬號(hào)和授權(quán),還將介紹如何取消權(quán)限以及從授權(quán)表中刪除全部用戶,并且將考慮一個(gè)困擾許多新的MySQL管理員的難題.
????????您還要考慮使用mysqlaccess?和mysql_setpermission?腳本,它們是MySQL分發(fā)包的組成部分.這些是Perl?的腳本,它們提供了設(shè)置用戶賬號(hào)的GRANT?語(yǔ)句的代用品.mysql_setpermission?需要具有DBI?的支持環(huán)境.
創(chuàng)建新用戶和授權(quán)
GRANT?語(yǔ)句的語(yǔ)法如下:
GRANT?privileges?(columns)?
ON?what?
TO?user?IDENTIFIEDBY?"password"?
WITH?GRANT?OPTION?
要使用該語(yǔ)句,需要填寫以下部分:
privileges?分配給用戶的權(quán)限.下表列出了可在GRANT?語(yǔ)句中使用的權(quán)限說(shuō)明符:
權(quán)限說(shuō)明符權(quán)限允許的操作
上表顯示的第一組權(quán)限說(shuō)明符適用于數(shù)據(jù)庫(kù)、表和列.第二組說(shuō)明符是管理特權(quán).通常,這些權(quán)限的授予相當(dāng)保守,因?yàn)樗鼈儠?huì)影響服務(wù)器的操作(例如,?SHUTDOWN?特權(quán)不是按每天來(lái)分發(fā)的權(quán)限).第三組說(shuō)明符是特殊的.ALL的意思是“所有的權(quán)限”,而USAGE?的意思是“無(wú)權(quán)限”─即創(chuàng)建用戶,但不授予任何的權(quán)限.?
columns?權(quán)限適用的列.這是可選的,只來(lái)設(shè)置列專有的權(quán)限.如果命名多于一個(gè)列,則用逗號(hào)分開.
what?權(quán)限應(yīng)用的級(jí)別.權(quán)限可以是全局的(適用于所有數(shù)據(jù)庫(kù)和所有的表)、數(shù)據(jù)庫(kù)專有的(適用于某個(gè)數(shù)據(jù)庫(kù)中的所有表),或表專有的.可以通過指定一個(gè)C?O?L?U?M?N?S子句將權(quán)限授予特定的列.
????????user?使用權(quán)限的用戶.它由用戶名和主機(jī)名組成.在MySQL中,不僅指定誰(shuí)進(jìn)行連接,還要指定從哪里連接.它允許您擁有兩個(gè)帶有相同名字的、從不同位置連接的用戶.MySQL允許在它們之間進(jìn)行區(qū)別并相互獨(dú)立地分配權(quán)限.?
MySQL的用戶名就是您在連接到服務(wù)器時(shí)指定的名字.該名字與您的UNIX?注冊(cè)名或Windows?名的沒有必然連系.缺省設(shè)置時(shí),客戶機(jī)程序?qū)⑹褂媚?cè)的名字作為MySQL的用戶名(如果您不明確指定一個(gè)名字的話),但這只是一個(gè)約定.有關(guān)將root作為可以操作一切MySQL的超級(jí)用戶名也是這樣,就是一種約定.您也可以在授權(quán)表中將此名修改成nobody,然后作為nobody?用戶進(jìn)行連接,以執(zhí)行需要超級(jí)用戶特權(quán)的操作.
password?分配給該用戶的口令.這是可選的.如果您不給新用戶指定IDENTIFIEDBY子句,該用戶不分配口令(是非安全的).對(duì)于已有的用戶,任何指定的口令將替代舊口令.如果不指定新口令,用戶的舊口令仍然保持不變.當(dāng)您確實(shí)要使用ID?E?N?T?I?F?I?E?DBY?時(shí),該口令串應(yīng)該是直接量,GRANT?將對(duì)口令進(jìn)行編碼.當(dāng)用SET?PA?S?S?W?O?R?D語(yǔ)句時(shí),不要使用PASSWORD()?函數(shù).?
WITH?GRANT?OPTION?子句是可選的.如果包含該子句,該用戶可以將GRANT?語(yǔ)句授予的任何權(quán)限授予其他的用戶.可以使用該子句將授權(quán)的能力授予其他的用戶.?
用戶名、口令以及數(shù)據(jù)庫(kù)和表的名稱在授權(quán)表項(xiàng)中是區(qū)分大小寫的,而主機(jī)名和列名則不是.
通過查詢某些問題,通常可以推斷出所需的GRANT?語(yǔ)句的類型:?
????????誰(shuí)可以進(jìn)行連接,從哪里連接??
????????用戶應(yīng)具有什么級(jí)別的權(quán)限,這些權(quán)限適用于什么??
????????允許用戶管理權(quán)限嗎?
?
讓我們來(lái)提問這些問題,同時(shí)看一些利用GRANT?語(yǔ)句設(shè)置MySQL用戶賬號(hào)的例子.?
1.?誰(shuí)可以進(jìn)行連接,從哪里連接?
您可以允許用戶在特定的主機(jī)或涉及范圍很寬的一組主機(jī)中進(jìn)行連接.在一個(gè)極端,如果知道用戶將僅從那個(gè)主機(jī)中進(jìn)行連接,則可限定對(duì)單個(gè)主機(jī)的訪問:?
GRANT?ALL?ON?samp_db.*?TO?boris@localhost?IDENTFIEDBY?"ruby"?
GRANT?ALL?ON?samp_db.*?TO?fred@ares.mars.net?IDENTFIEDBY?"quartz"?
(符號(hào)samp_db.*?含義是“在samp_db?數(shù)據(jù)庫(kù)中的所有表”)在另一個(gè)極端,您可能會(huì)有一個(gè)用戶m?a?x,他周游世界并需要能夠從世界各地的主機(jī)中進(jìn)行連接.在這種情況下,無(wú)論他從哪里連接您都將允許:
GRANT?ALL?ON?samp_db.*?TO?max@%?IDENTFIEDBY?"diamond"?
‘%'字符起通配符的作用,與LIKE模式匹配的含義相同,在上個(gè)語(yǔ)句中,它的意思是“任何主機(jī)”.如果您根本不給出主機(jī)名部分,則它與指定“?%”的含義相同.因此,?max和max@%是等價(jià)的.這是設(shè)置一個(gè)用戶最容易的方法,但安全性最小.?
要想采取妥協(xié)的辦法,可允許用戶在一組有限的主機(jī)中進(jìn)行連接.例如,要使mary?從snake.net?域的任何主機(jī)中進(jìn)行連接,可使用%.snake.net?主機(jī)說(shuō)明符:
GRANT?ALL?ON?samp_db.*?TO?mary@%.snake.net?IDENTFIEDBY?"topaz"?
該用戶標(biāo)識(shí)符的主機(jī)部分可用IP?地址而不是主機(jī)名給出(如果愿意的話).可以指定一個(gè)直接的IP?地址或包含模式字符的地址.同樣,自MySQL3.23?起,可以用一個(gè)網(wǎng)絡(luò)掩碼來(lái)指定IP?號(hào),網(wǎng)絡(luò)掩碼表明了用于該網(wǎng)絡(luò)號(hào)的二進(jìn)制位數(shù):
GRANT?ALL?ON?samp_db.*?TO?joe@192.168.0.3?IDENTIFIEDBY?"water"?
GRANT?ALL?ON?samp_db.*?TO?ardis@192.168.128.%?IDENTIFIEDBY?"snow"?
GRANT?ALL?ON?samp_db.*?TO?rex@192.168.128.0/17?IDENTIFIEDBY?"ice"?
第一條語(yǔ)句指明用戶可進(jìn)行連接的特定的主機(jī).第二條語(yǔ)句指定129.168.128?Class?C?子網(wǎng)的IP?模式.在第三條語(yǔ)句中,?192.168.128.0/17?指定一個(gè)17?位二進(jìn)制的網(wǎng)絡(luò)號(hào),并將任何主機(jī)與其IP?地址的前17?個(gè)二進(jìn)制位中的192.168.128.0/17?進(jìn)行匹配.
如果MySQL抱怨您指定的用戶值,則可能需要使用引號(hào)(但對(duì)用戶名和主機(jī)名分別加引號(hào)):?
GRANT?ALL?ON?samp_db.president?TO?"my?friend"@"boa.snake.net"
?
2.?用戶應(yīng)具有什么級(jí)別的權(quán)限,這些權(quán)限適用于什么?
您可授予不同級(jí)別的權(quán)限.全局權(quán)限的功能最強(qiáng),因?yàn)樗鼈冞m用于任何數(shù)據(jù)庫(kù).為了使ethel?成為可以進(jìn)行一切操作的超級(jí)用戶(其中包括可以對(duì)其他用戶授權(quán)),發(fā)布下列語(yǔ)句:?
GRANT?ALL?ON?*.*?TO?ethel@localhost?IDENTIFIEDBY?"coffee"?
WITH?GRANT?OPTION?
ON?子句中*.*?說(shuō)明符的意思是“所有數(shù)據(jù)庫(kù),所有的表”,為保險(xiǎn)起見,我們已經(jīng)指定ethel?只能從本地主機(jī)中連接.限制超級(jí)用戶從哪些主機(jī)上進(jìn)行連接通常是明智的做法,因?yàn)樗拗谱×似渌脩魧?duì)口令進(jìn)行試探.
有些權(quán)限(?F?I?L?E、P?R?O?C?E?S?S、RELOAD?和S?H?U?T?D?O?W?N)是管理權(quán)限,只能用NO?*.*?全局權(quán)限說(shuō)明符來(lái)授予.如果希望的話,也可以不用授予數(shù)據(jù)庫(kù)級(jí)的權(quán)限來(lái)授予這些權(quán)限.例如,下列語(yǔ)句建立了一個(gè)flush?用戶,它除了發(fā)布FLUSH語(yǔ)句外不做其他任何事情.在管理腳本中這可能是有用的,因?yàn)樾枰谶@些腳本中執(zhí)行諸如在日志文件循環(huán)期間刷新日志的操作:
GRANT?RELOAD?ON?*.*?TO?flush@localhost?IDENTIFIEDBY?"flushpass"?
通常授予管理權(quán)限應(yīng)該是保守的,因?yàn)榫哂羞@些權(quán)限的用戶可能影響服務(wù)器的操作.?
數(shù)據(jù)庫(kù)級(jí)的權(quán)限適用于特定數(shù)據(jù)庫(kù)中的所有表.這些權(quán)限使用ON?db_name.*?子句進(jìn)行授予:
GRANT?ALL?ON?samp_db.*?TO?bill@racer.snake.net?IDENTIFIEDBY?"rock"?
GRANT?SELECT?ON?menagerie.*?TO?ro_user@%?IDENTIFIEDBY?"dirt"?
第一條語(yǔ)句將bill?的所有權(quán)限授予samp_db?數(shù)據(jù)庫(kù)的任何表.第二條語(yǔ)句創(chuàng)建一個(gè)限制訪問的用戶r?o?_?user(只讀用戶),它可以訪問menagerie?數(shù)據(jù)庫(kù)的所有表,但只能讀取.也就是說(shuō),該用戶只能發(fā)布SELECT?語(yǔ)句.
怎樣在授權(quán)表項(xiàng)中指定本地主機(jī)名?
如果您使用服務(wù)器的主機(jī)名而非localhost,通常存在從該服務(wù)器主機(jī)連接的問題.這可能是由于在授權(quán)表中指定名字的方法和名字分解器例程(?name?reslover?routine)向程序報(bào)告名字的方法之間的錯(cuò)誤匹配.如果分解器報(bào)告了一個(gè)非限定的名字(如p?i?t?-?v?i?per),但授權(quán)表包含了具有全限定的名字的項(xiàng)(如p?i?t?-?v?i?per.?s?n?a?k?e?.?n?e?t,反之亦然),則發(fā)生錯(cuò)誤匹配.
為了確定這種情況是否正在系統(tǒng)中發(fā)生,可試著用-h?選項(xiàng)連接到本地服務(wù)器,該選項(xiàng)指定了主機(jī)的名字.然后查看服務(wù)器的常規(guī)日志文件.它是怎樣報(bào)告主機(jī)名的?是以非限定形式還是限定形式?不論它是哪種形式,都將告訴您在發(fā)布GRANT?語(yǔ)句時(shí)需要怎樣指定用戶說(shuō)明符的主機(jī)名部分.?
可以同時(shí)列出許多被授予的單個(gè)權(quán)限.例如,如果想讓用戶能讀取和修改已有表的內(nèi)容,但又不允許創(chuàng)建新表或刪除表,可按如下授權(quán):?
GRANT?SELECT,INSERT,DELETE,UPDATE?ON?samp_db.*?TO?jennie@%?
IDENTIFIEDBY?"boron"?
對(duì)于更小粒度(?f?i?n?e?-?g?r?a?i?n?e?d)的訪問控制,可以在單個(gè)表上授權(quán),甚至在表的單個(gè)列上授權(quán).當(dāng)存在要對(duì)用戶隱藏的表時(shí),或者,當(dāng)只允許用戶修改特定列時(shí),列專有的權(quán)限是有用的.假定歷史同盟會(huì)中有一些志愿者利用您作為同盟會(huì)秘書應(yīng)履行的職責(zé)來(lái)幫助您工作.這是一個(gè)好消息,但您決定首先給新的助手授予對(duì)member?表只讀的權(quán)限(該表中包含了會(huì)員資格的信息),然后再對(duì)他們?cè)黾邮谟柙摫淼膃xpiration?列的列專有UPDATE權(quán)限.也就是說(shuō),您的助手可以在人們更新其會(huì)員資格時(shí)進(jìn)行更改
第一條語(yǔ)句授予對(duì)整個(gè)member?表的讀訪問權(quán)并設(shè)置口令.第二條語(yǔ)句增加UPDATE權(quán)限,但只是對(duì)expiration?列.此時(shí)不必要再指定口令,因?yàn)樵诘谝粭l語(yǔ)句中已經(jīng)完成了.?
截止日期的工作.設(shè)置此MySQL用戶的語(yǔ)句如下:
如果想要為多個(gè)列授予列專有的權(quán)限,可指定一個(gè)列清單,并用逗號(hào)將這些列分隔.例如,為了給assistant?用戶增加對(duì)member?表地址列的UPDATE權(quán)限,可以使用下列語(yǔ)句.新的權(quán)限將被增加到對(duì)該用戶來(lái)說(shuō)已經(jīng)存在的所有列上:?
GRANT?UPDATE?(street,city,state,zip)?ON?samp_db.member?
TO?assistant@localhost?
通常,不要給用戶授予比實(shí)際需要更大的權(quán)限.但是,當(dāng)您想要使用戶能夠創(chuàng)建存儲(chǔ)中間結(jié)果的臨時(shí)表,而又不允許用戶在包含有他們不能修改的數(shù)據(jù)的數(shù)據(jù)庫(kù)中這樣做時(shí),就有了要在數(shù)據(jù)庫(kù)上授予相當(dāng)多的許可權(quán)限的理由.您可以建立一個(gè)單獨(dú)的數(shù)據(jù)庫(kù)(筆者稱它為t?m?p)并授予用戶該數(shù)據(jù)庫(kù)的所有權(quán)限.例如,如果想要mars.net?域的主機(jī)中的任何用戶都能夠使用tmp?數(shù)據(jù)庫(kù),可發(fā)布下列GRANT語(yǔ)句:
GRANT?ALL?ON?tmp.*?TO?""@%.mars.net?
在完成這些之后,用戶可使用tmp.tbl_name?格式的名字創(chuàng)建和引用tmp?數(shù)據(jù)庫(kù)中的表(用戶說(shuō)明符中的“”?創(chuàng)建一個(gè)匿名用戶項(xiàng),任何用戶都與空白用戶名相匹配).?
3.?允許用戶管理權(quán)限嗎
通過授予數(shù)據(jù)庫(kù)所有者數(shù)據(jù)庫(kù)的所有權(quán)限并在操作時(shí)指定WITH?GRANT?OPTION,可以允許數(shù)據(jù)庫(kù)所有者控制對(duì)該數(shù)據(jù)庫(kù)的訪問.例如,如果要讓alicia?能在big.corp.com?域的所有主機(jī)中進(jìn)行連接并管理sales?數(shù)據(jù)庫(kù)中所有表的權(quán)限,應(yīng)使用下列GRANT語(yǔ)句:?
實(shí)際上,WITH?GRANT?OPTION?子句允許將訪問的權(quán)利授予給另一個(gè)用戶.要知道,具有GRANT?權(quán)限的兩個(gè)用戶可以相互授予自己的權(quán)限.如果只給一個(gè)用戶授予SELECT?權(quán)限而給另一個(gè)用戶除SELECT?外還授予了GRANT?和其他的權(quán)限,則第二個(gè)用戶可以使第一個(gè)用戶“強(qiáng)大”起來(lái).
取消權(quán)限和刪除用戶
為了收回某個(gè)用戶的權(quán)限,可使用REVOKE?語(yǔ)句.除了要用FROM?替換TO?并且沒有IDENTIFIEDBY?或WITH?GRANT?OPTION?子句外,REVOKE?的語(yǔ)法與GRANT?語(yǔ)句非常相似:?
REVOKE?privileges?(columns)?ON?what?FROM?user?
user?部分必須與您想要取消其權(quán)限的用戶的原始GRANT?語(yǔ)句的user?部分相匹配.priv?i?l?e?g?e?s?部分不需要匹配,您可用GRANT?語(yǔ)句授權(quán),然后用REVOKE?語(yǔ)句取消其中的一部分.REVOKE?語(yǔ)句只刪除權(quán)限,不刪除用戶.用戶的項(xiàng)仍然保留在user?表中,即使您取消了該用戶的所有權(quán)限也是如此.這意味著該用戶仍然可連接到服務(wù)器上.要想刪除整個(gè)用戶,必須用DELETE?語(yǔ)句將該用戶的記錄從user?表中直接刪除:
DELETE?語(yǔ)句刪除該用戶的項(xiàng),?FLUSH?語(yǔ)句告訴服務(wù)器重新加載授權(quán)表(當(dāng)使用GRANT?或REVOKE?語(yǔ)句,而不是直接修改授權(quán)表時(shí),這些表將自動(dòng)重新加載).?
一個(gè)權(quán)限難題,第一部分
下面是一個(gè)在MySQL郵件清單中反復(fù)出現(xiàn)的情況:一位新的MySQL管理員給某用戶增加一個(gè)項(xiàng),使用了主機(jī)名部分,該部分是用一個(gè)模式來(lái)指定的.例如:?
GRANT?ALL?ON?samp_db.*?TO?fred@%.snake.net?IDENTIFIEDBY?"cocoa"?
這里的意圖是允許用戶fred?從snake.net?域的所有主機(jī)中進(jìn)行連接,并且具有對(duì)samp_db?數(shù)據(jù)庫(kù)的所有權(quán)限.事實(shí)上,?fred?能夠從那些主機(jī)中連接(除了服務(wù)器主機(jī)本身外).當(dāng)fred?試著從服務(wù)器主機(jī)中進(jìn)行連接時(shí),該企圖以“訪問被拒絕”的消息而告失敗.即使用戶指定了正確的口令也是如此.
如果授權(quán)表中包含了由mysql_install_db?安裝腳本安裝的缺省項(xiàng),這種情況也會(huì)發(fā)生.其原因是,當(dāng)服務(wù)器驗(yàn)證fred?連接的企圖時(shí),一個(gè)匿名用戶項(xiàng)(?anonymous-user?entry)比f(wàn)red?項(xiàng)優(yōu)先.匿名用戶項(xiàng)要求該用戶不用口令來(lái)連接,并且一個(gè)口令錯(cuò)誤匹配發(fā)生.?
該問題的另一個(gè)背景將在第12章“權(quán)限難題,第二部分”中給出.目前,只要說(shuō)修正此問題的方法是從user?表中刪除匿名用戶項(xiàng)就足夠了,我們不能用R?E?V?O?K?E,因?yàn)樵撁钪粍h除權(quán)限.要想完全擺脫這些匿名項(xiàng),執(zhí)行如下操作:
?%?mysql-uroot?mysql?mysql>?DELETE?FROM?user?where?User="";?
mysql>FLUSH?PRIVILEGES;?
現(xiàn)在,當(dāng)fred?試圖從本地主機(jī)連接時(shí)成功了.
維易PHP培訓(xùn)學(xué)院每天發(fā)布《Mysql入門數(shù)據(jù)庫(kù)的用戶帳號(hào)管理基礎(chǔ)知識(shí)》等實(shí)戰(zhàn)技能,PHP、MYSQL、LINUX、APP、JS,CSS全面培養(yǎng)人才。
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.snjht.com/jiaocheng/8099.html