- LAMP網站開發黃金組合Linux+Apache+MySQL+PHP
- 楊明華等編著
- 1539字
- 2018-12-29 19:23:42
6.1 賬戶管理
用戶擁有一個登錄賬號是使用MySQL的基礎,本節就將介紹如何設置MySQL用戶賬號及其權限。
6.1.1 創建新賬號
首先來看如何新建一個MySQL用戶賬號,以及授予其權限。MySQL可以使用GRANT命令語句來完成這一功能:
GRANT privileges [(columns)] ON what TO user IDENTIFIED BY "password" WITH GRANT OPTION
參數說明:
● privileges:分配給用戶的權限。表6-1列出了可在GRANT語句中使用的權限,及其代表的意義:
表6-1 GRANT命令可授予的用戶權限列表

● columns:所授予權限所適用的列,可選,用來設置列級專有權限。如果多于一個列,則可用逗號將其分開。
● what:所授予權限的應用范圍,包括全局的(“*.*”,適用于所有數據庫和所有的表)、數據庫專有的(“db_name.*”,適用于某個數據庫中的所有表),以及表(“db_name.table_name”,適用于某個表)專有的。如果想更進一步指定權限適用的列,可以通過COLUMNS子句指定。
● user:授予權限的用戶,由用戶名和主機名組成,如user_name@host_name。即不單指定誰進行連接,還要指定從網絡的哪個位置進行連接,MySQL支持多個同名、從不同位置連接的用戶。
● password:用戶口令,可選。如果不給新用戶指定IDENTIFIED BY子句,該用戶不分配口令。對于已有的用戶,指定的口令將替代舊口令;如果不指定新口令,用戶的舊口令仍然保持不變。當使用IDENTIFIED BY時,GRANT會自動對口令進行加密。
● WITH GRANT OPTION:可選。如果包含該子句,該用戶可以將自身的權限授予其他用戶。
例如下面的命令將建立一個新的用戶newuser1@localhost,并授予其在數據庫student_course上所有操作權。
GRANT ALL ON student_course TO newuser1@localhost IDENTIFIED BY "password"
下面的命令授予newuser2@localhost在表student_course.students上的修改和刪除權。
GRANT UPDATE DELETE ON student_course.students TO newuser2@localhost IDENTIFIED BY "password"
此時,如果使用newuser2登錄,則只能看到student_course中的students表,如果試圖查詢表中的數據,則會報錯:
%mysql -u newuser2 -p Enter password: ******** Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 8 to server version: 4.0.14-max-debug Type 'help;' or '\h' for help. Type '\c' to clear the buffer. mysql> use student_course; Database changed mysql> show tables; +----------------------------------------+ | Tables_in_student_course | +----------------------------------------+ | students | +----------------------------------------+ 1 row in set (0.00 sec) mysql> select * from students; ERROR 1142: select command denied to user: 'newuser2@localhost' for table 'students' mysql>
若想再進一步細化權利范圍,比如限定newuser2@localhost只能修改students表中的sname列,命令如下:
GRANT UPDATE(sname) ON student_course.students TO newuser2@localhost IDENTIFIED BY "password"
6.1.2 控制權限傳遞
上面介紹了如何創建一個用戶及對其授權,可用WITH GRANT OPTION子句來控制權限的傳遞。例如,如果要讓tom能從host1進行連接并管理sales數據庫中所有表,并能夠將這個權限傳遞給其他用戶,應使用下列GRANT語句:
GRANT ALL ON student_courses.* TO tom@host1 IDENTIFIED BY "password" WITH GRANT OPTION
WITH GRANT OPTION子句允許將用戶的權限授予給另一個用戶,具有GRANT權限的兩個用戶可以相互授予自己的權限。如果只給一個用戶授予SELECT權限,而給另一個用戶除SELECT外還授予了其的權限,則第二個用戶可以通過權限傳遞,使第一個用戶更加“強大”。
6.1.3 取消權限和刪除用戶
為了收回某個用戶的權限,可使用REVOKE語句。除了要用FROM替換TO,并且沒有IDENTIFIED BY或WITH GRANT OPTION子句外,REVOKE的語法與GRANT語句非常相似:
REVOKE privileges (columns) ON what FROM user
其中,user為想要取消權限的用戶名,privileges為想要取消的權限。例如,下面命令取消newuser1的所有權限:
mysql> REVOKE ALL ON student_course FROM newuser1@localhost;
REVOKE語句只刪除權限,而不刪除用戶。即使取消了該用戶的所有權限,用戶仍然保留在系統(user表)中,這意味著該用戶仍然可連接服務器。要想刪除整個用戶,必須用DELETE語句將該用戶的記錄從user表中直接刪除:
DELETE FROM user WHERE User="username" and Host="hostname";
例如,下面命令刪除newuser1@localhost用戶:
mysql> use mysql Database changed mysql> DELETE FROM user -> WHERE User="newuser1" and Host="localhost"; mysql> FLUSH PRIVILEGES;
其中,DELETE語句刪除該用戶,FLUSH語句告訴服務器重新加載授權表。
6.1.4 了解MySQL的用戶管理表
前面兩節介紹了如何使用GRANT和REVOKE來管理用戶和權限,作為MySQL管理員,應該更進一步了解MySQL的用戶和權限管理表。MySQL把用戶和權限信息保存在一個叫做mysql數據庫中。該數據庫至少包含了四個表,如表6-2所示。
表6-2 MySQL的用戶權限表

GRANT和REVOKE語句影響上面四個表,當通過GRANT為用戶授權時,MySQL在user表中為該用戶創建一個項。
● 如果GRANT語句授予用戶所有全局權限,則這些權限也記錄在user表中。
● 如果GRANT語句只授予該用戶數據庫、表或列上的權限,則這些權限將被分別記錄在db、tables_priv和columns_priv表中。
使用GRANT和REVOKE語句比直接修改授權表更容易。例如,下面的命令通過update命令直接修改user表,來更改root用戶的密碼:
% mysql -u root mysql % UPDATE user SET password=password('new_password') where user='root'; % FLUSH PRIVILEGES