天天看點

MySql的使用者權限

MySQL資料庫中的表與其他任何關系表沒有差別,都可以通過典型的SQL指令修改其結構和資料。可以使用GRANT和REVOKE指令。通過這些指令,可以建立和禁用使用者,可以線上授予和撤回使用者通路權限。在5.0版本中增加了兩個新指令:CREATE USER和DROP USER。進而能更容易地增加新使用者、删除和重命名使用者,還增加了第三個指令RENAME USER用于重命名現有的使用者。

CREATE USER用于建立新的MySQL賬戶。要使用CREATE USER語句,您必須擁有mysql資料庫的全局CREATE USER權限,或擁有INSERT權限。對于每個賬戶,CREATE USER會在沒有權限的mysql.user表中建立一條新記錄。如果賬戶已經存在,則出現錯誤。使用自選的IDENTIFIED BY子句,'可以為賬戶設定一個密碼。user和密碼的設定方法與GRANT語句一樣。其指令的原型如下:

CREATE USER user [IDENTIFIED BY [PASSWORD 'PASSWORD'] [,user [IDENTIFIED BY [PASSWORD'PASSWORD']]……

如果存在一個或是多個賬戶被閑置,應當考慮将其删除,確定不會用于可能的違法活動。利用DROP USER指令就能很容易地從權限表中删除使用者的所有資訊,即來自所有授權表的賬戶權限記錄。DROP USER指令原型如下:

DROP USER user [,user] ……

ps"DROP USER不能自動關閉任何打開的使用者對話;而且,如果使用者有打開的對話,此時取消使用者,則指令不會生效,直到使用者對話被關閉後才生效。一旦對話被關閉,使用者也被取消,此使用者再次試圖登入時将會失敗。

RENAMEUSER語句用于對原有MySQL賬戶進行重命名。RENAMEUSER語句的指令原型如下:

RENAME USER old_user TO new_user [,old_user TO new_user] ……

ps:如果舊賬戶不存在或者新賬戶已存在,則會出現錯誤。

GRANT和REVOKE指令用來管理通路權限,也可以用來建立和删除使用者,但在MySQL5.0.2中可以利用CREATE USER和DROP USER指令更容易地實作這些任務。GRANT和REVOKE指令對于誰可以操作伺服器及其内容的各個方面提供了多程度的控制,從誰可以關閉伺服器,到誰可以修改特定表字段中的資訊都能控制。

MySql的使用者權限
MySql的使用者權限

如果授權表擁有含有mixed-case資料庫或表名稱的權限記錄,并且lower_case_table_names系統變量已設定,則不能使用REVOKE撤銷權限,必須直接操縱授權表。(當lower_case_table_names已設定時,GRANT将不會建立此類記錄,但是此類記錄可能已經在設定變量之前被建立了。)

授予的權限可以分為多個層級:

全局層級适用于一個給定伺服器中的所有資料庫,這些權限存儲在mysql.user表中。GRANT ALL ON *.*和REVOKE ALL ON *.*隻授予和撤銷全局權限。

資料庫層級适用于一個給定資料庫中的所有目标,這些權限存儲在mysql.db和mysql.host表中。GRANT ALL ON db_name .*和REVOKE ALL ON db_name .*隻授予和撤銷資料庫權限。

表層級适用于一個給定表中的所有列,這些權限存儲在mysql.tables_priv表中。GRANT ALL ON db_name.tbl_name和REVOKE ALL ON db_name.tbl_name隻授予和撤銷表權限。

列層級适用于一個給定表中的單一列,這些權限存儲在mysql.columns_priv表中。當使用REVOKE時,您必須指定與被授權列相同的列。

子程式層級,CREATE ROUTINE, ALTER ROUTINE, EXECUTE和GRANT權限适用于已存儲的子程式,這些權限可以被授予為全局層級和資料庫層級;而且,除了CREATE ROUTINE外,這些權限可以被授予為子程式層級,并存儲在mysql.procs_priv表中。

ps:當使用者使用GRANT和REVOKE指令更改使用者權限後,退出MySQL系統,使用者使用新賬戶名登入MySQL的時候,可能會因為沒有重新整理使用者授權表而導緻登入錯誤。這是因為在使用者設定完賬号後,隻有重新加載授權表才能使之前設定的授權表生效。使用FLUSH PRIVILEGES指令可以重載授權表。另外,需要注意的是,隻有如“root”這樣擁有全部權限的使用者才可以執行此指令。當使用者重載授權表後,退出MySQL後,使用新建立的使用者名即可正常登入MySQL。

MySQL伺服器啟動的時候以及使用GRANT和REVOKE語句的時候,伺服器會自動讀取grant表。但是,既然我們知道這些權限儲存在什麼地方以及它們是如何儲存的,就可以手動修改它們。當手動更新它們的時候,MySQL伺服器将不會注意到它們已經被修改了。

我們必須向伺服器指出已經對權限進行了修改,有3種方法可以實作了這個任務。可以在MySQL指令提示符下(必須以管理者的身份登入進入)鍵入如下指令:

flush privileges;

mysqladmin flush-privileges

mysqladmin reload

此後,當使用者下次再連接配接的時候,系統将檢查全局級别權限;當下一個指令被執行時,将檢查資料庫級别的權限;而表級别和列級别權限将在使用者下次請求的時候被檢查。

(1)可以用mysqladmin指令在指令行指定密碼:

mysqladmin -u user_name -h host_name password "newpwd"

<code>mysqladmin -u root </code><code>password</code> <code>"newpass"</code>

<code>mysqladmin -u root </code><code>password</code> <code>oldpass </code><code>"newpass"</code>

mysqladmin指令重設伺服器為host_name,且使用者名為user_name的使用者的密碼,新密碼為“newpwd”。

(2)通過set password指令設定使用者的密碼:

set password for 'jeffrey'@'localhost'=password('biscuit');

隻有以root使用者(可以更新mysql資料庫的使用者)身份登入,才可以更改其他使用者的密碼。如果你沒有以匿名使用者連接配接,省略for子句便可以更改自己的密碼:

set password=password('biscuit');

(3)在全局級别下使用GRANT USAGE語句(在*.*)指定某個賬戶的密碼,而不影響賬戶目前的權限:

GRANT USAGE ON *.* TO 'jeffrey'@'localhost' IDENTIFIED BY 'biscuit';

(4)在建立新賬戶時建立密碼,要為password列提供一個具體值:

mysql -uroot -p mysql  --制定use mysql資料庫

INSERT INTO user(Host, User, Password)VALUES('localhost','jeffrey',PASSWORD('biscuit'));

FLUSH PRIVILEGES;

(5)更改已有賬戶的密碼,要應用UPDATE語句來設定password列值:

mysql -uroot -p mysql

UPDATE user SET Password=PASSWORD('bagel')WHERE Host='localhost' AND User='francis';

ps:

當使用SET PASSWORD、INSERT或者UPDATE指定賬戶的密碼時,必須用PASSWORD()函數對它進行加密。(唯一的特例是如果密碼為空,則不需要使用PASSWORD())。之是以使用PASSWORD()是因為user表以加密方式儲存密碼,而不是明文。如果采用沒有進行加密的方式設定密碼,連接配接使用的密碼值将被加密,并同儲存在user表中的密碼進行比較。但是,儲存的值為明文,是以比較将失敗,伺服器拒絕連接配接。

如果使用GRANT……IDENTIFIED BY語句或mysqladmin password指令設定密碼,它們均會自動加密密碼。在這種情況下,不需要使用PASSWORD()函數對密碼進行加密。

(1)在管理級别,切忌不能将mysql.user表的通路權限授予任何非管理賬戶。

(2)采用下面的指令模式來連接配接伺服器,以此來隐藏你的密碼。指令如下:

mysql -uroot -p db_name

Enter password:********

“*”字元指定輸入密碼的地方,輸入的密碼是不可見的。因為它對其他使用者不可見,與在指令行上指定它相比,這樣進入你的密碼更安全。

(3)如果想要從非互動式方式下運作一個腳本調用一個用戶端,就沒有從終端輸入密碼的機會。其最安全的方法是讓用戶端程式提示輸入密碼或在适當保護的選項檔案中指定密碼。