程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> 詳解MySQL中的存取權限

詳解MySQL中的存取權限

編輯:MySQL綜合教程

詳解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,其他的則可以設為 % ,即任何主機。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved