MySQL權限體系介紹

一、權限體系簡介:

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主要有如下權限:

名稱版本支持限制信息
ALTERALL表結構更改權限
ALTER ROUTINE5.0.3procedure, function 和 trigger等的變更權限
CREATEALL數據庫,表和索引的創建權限
CREATE ROUTINE5.0.3+procedure, function 和 trigger等的變更權限
CREATE TEMPORARY TABLES4.0.2+零時表的創建權限
CREATE USER5.0.3+創建用戶的權限
CREATE VIEW5.0.1+創建視圖的權限
DELETEALL刪除表數據的權限
EXECUTE5.0.3+procedure, function 和 trigger等的執行權限
FILE
ALL執行LOAD DATA INFILE 和 SELECT... INTO FILE 的權限
INDEXALL在已有表上創建索引的權限
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
ALLMySQL 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)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章