天天看點

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指令,當給使用者授權不僅需要提供使用者名,還可以指定通過哪個主機通路,下面提供給簡單的列子:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

<code>#建立一個使用者test1隻能從本機登入并賦予這個使用者擁有test庫的查詢權限</code>

<code>mysql&gt; grant select  on test.* to test1@'localhost' identified by 'test123';</code>

<code>Query OK, 0 rows affected (0.03 sec)</code>

<code>#建立一個使用者test2可以從網際網路上任何一台主機登入并賦予這個使用者擁有test庫的查詢權限</code>

<code>mysql&gt; grant select  on test.* to test2@'%' identified by 'test234';</code>

<code>Query OK, 0 rows affected (0.02 sec)</code>

<code>重新整理權限,并查詢使用者test1的權限</code>

<code>mysql&gt; flush privileges;</code>

<code>Query OK, 0 rows affected (0.00 sec)</code>

<code>mysql&gt; show grants for test1@'localhost';</code>

<code>+--------------------------------------------------------------------------------------------------------------+</code>

<code>| Grants for test1@localhost                                                                                   |</code>

<code>| GRANT USAGE ON *.* TO 'test1'@'localhost' IDENTIFIED BY PASSWORD '*676243218923905CF94CB52A3C9D3EB30CE8E20D' |</code>

<code>| GRANT SELECT ON `test`.* TO 'test1'@'localhost'                                                              |</code>

<code>2 rows in set (0.00 sec)</code>

<code>删除使用者test1的權限</code>

<code>mysql&gt; revoke select on test.* from 'test1'@'localhost' identified by 'test123';</code>

<code>在此檢視使用者test1,已經沒有權限了。</code>

三、權限級别

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

資料庫,表和索引的建立權限

CREATE ROUTINE

5.0.3+

CREATE TEMPORARY TABLES

4.0.2+

零時表的建立權限

CREATE USER

建立使用者的權限

CREATE VIEW

5.0.1+

建立視圖的權限

DELETE

删除表資料的權限

EXECUTE

procedure, function 和 trigger等的執行權限

FILE

執行LOAD DATA INFILE 和 SELECT... INTO FILE 的權限

INDEX

在已有表上建立索引的權限

INSERT

資料插入權限

LOCK TABLES

執行LOCK TABLES 指令顯示給表加鎖的權限

PROCESS

執行SHOW PROCESSLIST指令的權限

RELOAD

執行FLUSH等讓資料庫重載LOAD某些對象或者資料指令的權限

REPLCATION SLAVE

主從複制中SLAVE連接配接使用者所需的複制權限

REPLICATION CLIENT

執行SHOW MASTER STATUS 和SHOW SLAVE STSTUS指令的權限

SELECT

資料查詢權限

SHOW DATABASES

執行SHOW DATABASES的權限

SHUTDOWN

MySQL Server的shut down 權限

SHOW VIEW

執行SHOW CREATE VIEW指令檢視VIEW建立語句的權限

SUPER

執行kill線程,CHANGE MASTER,PURGE MASTER LOGS, and SET GLOBAL等指令的權限

UPDATE

更新資料庫的權限

USAGE

新建立使用者後不授權時所用到擁有最小的權限

要授予Global Lovel權限隻需要在執行GRANT指令的時候,用*.*來指定範圍是Global即可,如果有多個使用者,可以使用逗号分隔開,如下:

<code>mysql&gt; grant all on *.* to test3,test4@'localhost' identified by 'test123';</code>

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指令來授權。

<code>mysql&gt; grant all on test.* to test3,test4@'localhost' identified by 'test123';</code>

3、Table Level

Table Level權限可以被Global Level和Database Level權限覆寫,Table Level權限的作用域是授權所指定的表,可以通過如下語句來授權:

<code>mysql&gt; grant all on test.test1 to wolf@'%' identified by 'wolf@123';</code>

<code>Query OK, 0 rows affected (0.01 sec)</code>

<code>mysql&gt; show grants for wolf@'%';</code>

<code>+-----------------------------------------------------------------------------------------------------+</code>

<code>| Grants for wolf@%                                                                                   |</code>

<code>| GRANT USAGE ON *.* TO 'wolf'@'%' IDENTIFIED BY PASSWORD '*F693761139616215C4AC1A7C23A8B8F5B94704D1' |</code>

<code>| GRANT ALL PRIVILEGES ON `test`.`test1` TO 'wolf'@'%'                                                |</code>

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三種,通過如下方式賦予權限(需要賦予權限的列名用括号括起來):

<code>mysql&gt; grant select(id,name) on test.test to kelly@'%' identified by 'wolf123';</code>

<code>mysql&gt; show grants for kelly@'%';</code>

<code>+------------------------------------------------------------------------------------------------------+</code>

<code>| Grants for kelly@%                                                                                   |</code>

<code>| GRANT USAGE ON *.* TO 'kelly'@'%' IDENTIFIED BY PASSWORD '*30F17FEB599168D8F1BC498525B27B83A13F54E3' |</code>

<code>| GRANT SELECT (name, id) ON `test`.`test` TO 'kelly'@'%'                                              |</code>

5、Routine Level

Routine Level權限主要隻有EXECUTE和ALTER ROUTINE兩種,主要針對的對象是procedure 和function兩種對象,要賦予Routine Level權限需要指定資料庫和相關對象,如下:

<code>mysql&gt; grant execute on test.pl to kelly@'%';</code>

<code></code>

本文轉自1594cqb 51CTO部落格,原文連結:http://blog.51cto.com/wolfchen/1243990,如需轉載請自行聯系原作者