一、權限體系簡介:
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)