一、許可權體系簡介:
MySQL的許可權體系在實現上比較簡單,相關許可權資訊主要儲存在mysql.User、mysql.db、mysql.Host、mysql_table_priv和mysql.column_priv幾個表中。由於許可權資訊資料量比較小,而且訪問又比較頻繁,所以MySQL在啟動時就會將所有的許可權資訊都Load到記憶體中儲存在幾個特定的結構中,所以才有了我們手動修改了許可權相關的表後,都需要通過執行"FLUSH PRIVILEGES" 命令重新載入MySQL的許可權資訊。我們也可以通過GRANT,REVOKE或者DROP USER命令所做的修改許可權後也會同時更新到記憶體結構中的許可權資訊。
二、許可權的賦予與去除
要為某個使用者授權可以使用GRANT命令,要去除某個使用者現有的許可權可以使用REVKOE命令,當給使用者授權不僅需要提供使用者名稱,還可以指定通過哪個主機訪問,下面提供給簡單的列子:
#建立一個使用者test1隻能從本機登入並賦予這個使用者擁有test庫的查詢許可權mysql> grant select on test.* to test1@'localhost' identified by 'test123';Query OK, 0 rows affected (0.03 sec)#建立一個使用者test2可以從互連網上任何一台主機登入並賦予這個使用者擁有test庫的查詢許可權mysql> grant select on test.* to test2@'%' identified by 'test234';Query OK, 0 rows affected (0.02 sec)重新整理許可權,並查詢使用者test1的許可權mysql> flush privileges;Query OK, 0 rows affected (0.00 sec)mysql> show grants for test1@'localhost';+--------------------------------------------------------------------------------------------------------------+| Grants for test1@localhost |+--------------------------------------------------------------------------------------------------------------+| GRANT USAGE ON *.* TO 'test1'@'localhost' IDENTIFIED BY PASSWORD '*676243218923905CF94CB52A3C9D3EB30CE8E20D' || GRANT SELECT ON `test`.* TO 'test1'@'localhost' |+--------------------------------------------------------------------------------------------------------------+2 rows in set (0.00 sec)刪除使用者test1的許可權mysql> revoke select on test.* from 'test1'@'localhost' identified by 'test123';Query OK, 0 rows affected (0.00 sec)在此查看使用者test1,已經沒有許可權了。mysql> show grants for test1@'localhost';+--------------------------------------------------------------------------------------------------------------+| Grants for test1@localhost |+--------------------------------------------------------------------------------------------------------------+| GRANT USAGE ON *.* TO 'test1'@'localhost' IDENTIFIED BY PASSWORD '*676243218923905CF94CB52A3C9D3EB30CE8E20D' |+--------------------------------------------------------------------------------------------------------------+
三、權限等級
mysql的許可權分為5個層級,分別如下:
1、Global Lovel:
Global Lovel的許可權控制又稱為全域控制許可權,所有許可權資訊u儲存在mysql.User 表中,Global Lovel的所有許可權都是針對整個mysqld的,對所有mysql資料庫下的所有表及所有欄位都有效。如果一個許可權是以Global Lovel來授予的,則會覆蓋其他所有層級的相同使用權限設定。Global Lovel主要有如下許可權:
名稱 |
版本支援 |
限制資訊 |
ALTER |
ALL |
表結構更改許可權 |
ALTER ROUTINE |
5.0.3 |
procedure, function 和 trigger等的變更許可權 |
CREATE |
ALL |
資料庫,表和索引的建立許可權 |
CREATE ROUTINE |
5.0.3+ |
procedure, function 和 trigger等的變更許可權 |
CREATE TEMPORARY TABLES |
4.0.2+ |
零時表的建立許可權 |
CREATE USER |
5.0.3+ |
建立使用者的許可權 |
CREATE VIEW |
5.0.1+ |
建立視圖的許可權 |
DELETE |
ALL |
刪除表資料的許可權 |
EXECUTE |
5.0.3+ |
procedure, function 和 trigger等的執行許可權 |
FILE
|
ALL |
執行LOAD DATA INFILE 和 SELECT... INTO FILE 的許可權 |
INDEX |
ALL |
在已有表上建立索引的許可權 |
INSERT
|
ALL |
資料插入許可權 |
LOCK TABLES
|
4.0.2+ |
執行LOCK TABLES 命令顯示給表加鎖的許可權 |
PROCESS
|
ALL |
執行SHOW PROCESSLIST命令的許可權 |
RELOAD
|
ALL |
執行FLUSH等讓資料庫重載LOAD某些對象或者資料命令的許可權 |
REPLCATION SLAVE
|
4.0.2+ |
主從複製中SLAVE串連使用者所需的複製許可權 |
REPLICATION CLIENT
|
4.0.2+ |
執行SHOW MASTER STATUS 和SHOW SLAVE STSTUS命令的許可權 |
SELECT
|
ALL |
資料查詢許可權 |
SHOW DATABASES
|
4.0.2+ |
執行SHOW DATABASES的許可權 |
SHUTDOWN
|
ALL |
MySQL Server的shut down 許可權 |
SHOW VIEW
|
5.0.1+ |
執行SHOW CREATE VIEW命令查看VIEW建立語句的許可權 |
SUPER
|
4.0.2+ |
執行kill線程,CHANGE MASTER,PURGE MASTER LOGS, and SET GLOBAL等命令的許可權 |
UPDATE
|
ALL |
更新資料庫的許可權 |
USAGE
|
ALL |
新建立使用者後不授權時所用到擁有最小的許可權 |
要授予Global Lovel許可權只需要在執行GRANT命令的時候,用*.*來指定範圍是Global即可,如果有多個使用者,可以使用逗號分隔開,如下:
mysql> grant all on *.* to test3,test4@'localhost' identified by 'test123';Query OK, 0 rows affected (0.00 sec)
2、Database Level
Database Level是在Global Level之下,其他三個Level之上的權限等級,其範圍即為所指定資料庫中的所有對象,和Database Level比 Database Level主要少了以下幾個許可權,CREATE USER,FILE,PROCESS,RELOAD,REPLICATION CLIENT,REPLICATION SLAVE, SHOW DATABASES, SHUTDOWN,沒有增加任何許可權,
要授予Database Level許可權,用如下方式實現:
1)、在執行GRANT命令的時候,通過database.* 來指定範圍為整個資料庫:或者先建立一個沒有許可權的使用者在使用過GRANT命令來授權。
mysql> grant all on test.* to test3,test4@'localhost' identified by 'test123';Query OK, 0 rows affected (0.00 sec)
3、Table Level
Table Level許可權可以被Global Level和Database Level許可權覆蓋,Table Level許可權的範圍是授權所指定的表,可以通過如下語句來授權:
mysql> grant all on test.test1 to wolf@'%' identified by 'wolf@123';Query OK, 0 rows affected (0.01 sec)mysql> show grants for wolf@'%';+-----------------------------------------------------------------------------------------------------+| Grants for wolf@% |+-----------------------------------------------------------------------------------------------------+| GRANT USAGE ON *.* TO 'wolf'@'%' IDENTIFIED BY PASSWORD '*F693761139616215C4AC1A7C23A8B8F5B94704D1' || GRANT ALL PRIVILEGES ON `test`.`test1` TO 'wolf'@'%' |+-----------------------------------------------------------------------------------------------------+2 rows in set (0.00 sec)
Table Level許可權由於範圍僅限於每張表,所以許可權種類也比較小,只有如下8個許可權,ALTER,CREATE,DELETE,DROP,INDEX,INSERT,SELECT,UODATE
4、Column Level
Column Level許可權的範圍僅限於某個表的某個列,Column Level同樣可以被Database Level,Database Level,Table Level同樣的許可權覆蓋掉,由於Column Level許可權和Routine Level許可權範圍沒有重合部分所以不會被覆蓋,Column Level許可權僅有SELECT,UPDATE,INSERT三種,通過如下方式賦予許可權需要賦予許可權的列名用括弧括起來):
mysql> grant select(id,name) on test.test to kelly@'%' identified by 'wolf123';Query OK, 0 rows affected (0.01 sec)mysql> show grants for kelly@'%';+------------------------------------------------------------------------------------------------------+| Grants for kelly@% |+------------------------------------------------------------------------------------------------------+| GRANT USAGE ON *.* TO 'kelly'@'%' IDENTIFIED BY PASSWORD '*30F17FEB599168D8F1BC498525B27B83A13F54E3' || GRANT SELECT (name, id) ON `test`.`test` TO 'kelly'@'%' |+------------------------------------------------------------------------------------------------------+
5、Routine Level
Routine Level許可權主要只有EXECUTE和ALTER ROUTINE兩種,主要針對的對象是procedure 和function兩種對象,要賦予Routine Level許可權需要指定資料庫和相關對象,如下:
mysql> grant execute on test.pl to kelly@'%';Query OK, 0 rows affected (0.01 sec)
本文出自 “平凡的日子” 部落格,請務必保留此出處http://wolfchen.blog.51cto.com/2211749/1243990