萬盛學電腦網

 萬盛學電腦網 >> 數據庫 >> mysql教程 >> MySQL的存取權限系統

MySQL的存取權限系統

  看到很多網友提出關於MySQL登錄不上服務器的問題,包括有的是在PHP中調用MySQL時發生的不能登錄MySQL數據庫服務器的問題,以為是PHP出了問題。其實是MySQL權限的問題。

  MySQL的權限系統在MySQL的手冊中是很長的一章,我把它打印出來足足印了20多頁!這裡就將我對它的理解簡要地寫出來,希望能對剛剛接觸MySQL的同志有點幫助;有說得不對的地方,也請同志們指出。

  在我了解了MySQL的權限機制後,不由得不贊歎它的嚴密與巧妙;也許所有的數據庫系統都是如此罷,只是別的大型數據庫把權限做得不需超級管理員親自干預數據表而已。

  MySQL的權限保存在名為mysql的數據庫中,有user、db、host、tables_priv、columns_priv 等五個表。

  首先,限制用戶的登錄的,只有 user 表,其中最常用的是 user、host、password這三個字段。其他的select_priv、update_priv、…… 這些字段分別表示該用戶是否有select、update、……等權限,這些字段設置為'Y'表示該用戶擁有對應的權限,'N'表示用戶沒有對應的權限。注意,這裡指定的權限是全局的,一旦你在user表中給了一個用戶select或update權限,他就對這台服務器上任何數據庫、任何表擁有上述權限!其中當然包括mysql數據庫!!這意味著他可以通過更改user表裡的數據非法地獲取更大的權限!!!這是非常可怕的,所以建議除了給root用戶外,不要在user表中分配權限。特別的,你可以建立一個幾乎跟root擁有同樣權限的用戶(密碼可不要告訴別人喲!)在忘記了root密碼時就用得到了。在添加一個用戶時,如果不指定權限字段的值,它們的默認值都是'N',——也就是這個用戶什麼權限也沒有——你可以放心的在user表中添加用戶,因為即使他能登錄進來,卻什麼也干不了。

  還有一個應該注意的問題就是user表中的password字段。試想,既然root用戶可以浏覽mysql數據庫,可以看到user表的password字段,是不是就是看到了其他用戶的密碼呢?不是的!user表的password字段保存的是用password()函數加密了的用戶密碼,當用戶登錄時,服務器將收到的用戶輸入的密碼用password()函數加密,加密得到的字串與user表password字段如能匹配,則認為密碼正確。password()沒有逆運算,所以任何人無法從一個加密的字串得到密碼的明文。同時,如果你手工修改user表,別忘了在更新password字段時一定要用password()函數加密。例如,你要允許一位名為 bill 的用戶登錄你的服務器,你給他設定一個 12345 的密碼,則應該:

  insert into user (user,host,password) values ('bill','%',password('12345'));

  如果你直接

  insert into user (user,host,password) values ('bill','%','12345');

  的話,恐怕他登不上你的服務器,也會到奧索網上發帖子問的。

  注意,每當手工操作了跟權限有關的數據表以後,要執行一條 flush privileges 命令才能使其生效。

  下面的問題就是如何給用戶分配權限了。如果你要給一個用戶開一個數據庫,並把有關這個數據庫的所有或部分權限開放給他,這就用到了db表。db表的意義在於,當一個用戶請求一個查詢時,檢測該用戶對於他的查詢所針對的數據庫是否擁有進行該查詢操作的權限,有,則允許查詢;沒有,則進一步咨詢tables_priv表。db表的最常用字段是 user、db、和那一大堆有關權限的字段。user,不用說了,就是那個用戶的用戶名,跟user表中的對應;db,就是要分給他的數據庫名。然後就把要給他的權限相對應的權限字段設為'Y'。同樣,這些字段的值在不指定的時候默認是'N'。你也可以用GRANT/REVOKE命令給用戶分配權限,可以是這樣的:

  grant select,update,insert,delete,creater,alter,drop,index on bill.* to bill;

  這樣就把針對bill這個數據庫的幾乎所有的權限給了用戶bill。這裡沒有給的只是grant權限,關於這個權限,建議不要輕易給人,因為用戶有了grant權限,也就可以將權限分配給其他用戶。值得慶幸的是,擁有grant權限的用戶能而且只能將他自己已經擁有的權限分配給別人。

  使用GRANT/REVOKE命令更改了權限後,不須執行 flush privileges 命令就可以使更改生效。

  上面討論的是給一個用戶完全開放一個數據庫的問題,如果只想給一個用戶一個特定的表的權限,就是 tables_priv 表發揮作用的時候啦。這裡的關鍵性字段是user、db、table_name 。顯而易見的,要給一個用戶指定一個特定的數據庫中特定表的權限,三個關鍵要素就是:哪個用戶(user)、哪個數據庫(db)、哪個表(table_name)。它的機理跟db表是類似的,我不必再重復。唯一不同的是這裡用了一個SET類型的字段 table_priv 來指定用戶對這個表權限,SET的成員有 SELECT, UPDATE, INSERT, DELETE, ALTER, CREATE, DROP, GRANT, INDEX, REFERENCE 等,你可以選擇其中任意一個或幾個分配給用戶。

  在上述提及的幾個權限表中以及未提及的host表中,都有一個host字段,它用來區分來自不同主機的、用戶名可能相同的人,或者是給同一個用戶從不同的主機連接時給予不同的權限。這種用法不很常用,但為了安全起見,建議root用戶,如果不需要從遠程連接,請將他的host設為 localhost,其他的則可以設為 % ,即任何主機。

  對我有用(3) 對我沒用(3)

copyright © 萬盛學電腦網 all rights reserved