MYSQL 用戶管理

1.權限表mysql

MYSQL是一個多用戶的數據庫,MYSQL的用戶能夠分爲兩大類:sql

(1)       超級管理員用戶(root),擁有所有權限數據庫

(2)       普通用戶,由root建立,普通用戶只擁有root所分配的權限安全

1.1 權限表的位置函數

數據庫:mysql加密

與權限相關的數據表:user,db,host,tables_priv,columns_priv,procs_priv等orm

1.2 user索引

User表存儲了:ssl

(1)用戶的信息:hots(用戶所在的主機),user(用戶名),password(密碼)ci

(2)用戶的權限信息:_priv

(3)安全性相關的信息:ssl_,x509,記錄用戶登陸的驗證操做等

(4)與資源分配相關的信息:max_,

max_questions表示用戶在一個小時內最多能夠進行的查詢次數。

max_updates表示用戶在一個小時內最多能夠進行的更新次數,也包括增長數據、刪除數據。

Max_connections:表示用戶最多能夠創建的鏈接數

1.2.1 user表的內容

(1)host列

Localhost表示本機的用戶或者超級管理員

%表示任何主機上的root用戶

說明:_priv權限是全局權限,不受數據庫的範圍限制

1.3 DB

(1)與用戶相關的字段:hots(用戶所在的主機),user(用戶名),

(2)與權限相關的字段:_priv,DB字段規定了_priv權限的有效範圍。

1.4 host

(1)與用戶相關的字段:hots(用戶所在的主機)

(2)與權限相關的字段:_priv,DB字段規定了_priv權限的有效範圍。

說明:

(1)       記錄主機上的用戶對數據庫擁有的權限,側重點在主機,而不在用戶,例如假設select_priv=Y,那個這個主機上的全部數據庫用戶都擁有select權限。

(2)       Host表的優先級大於db表,若是db表規定這個用戶沒有權限,可是host表規定了這臺主機的用戶有權限,那麼db的這個用戶也是擁有權限的。

1.5 tables_priv

設定了用戶對某個表擁有的權限,該表記錄了用戶的信息,以及某個表的權限信息table_priv(select ,lnsert,alter等等),以及表上的某個列的權限信息column_priv。

1.6 column_priv

記錄某用戶對某表的某個列所擁有的權限。

1.7procs_priv 

    規定了用戶關於存儲過程及存儲函數的操做權限,主要字段:proc_priv

 

 

2. 建立數據庫用戶

 

2.1 建立普通用戶

2.1.1 CREATE USER

CREATE USER ‘用戶名稱’ [@’主機名稱’]

例:CREATE USER 'user1';

驗證是否建立成功:

mysql> SELECT user FROM mysql.user;

+-------+

| user  |

+-------+

| user1 |

| root  |

| root  |

|       |

| pma   |

| root  |

+-------+

6 rows in set (0.00 sec)  說明新建立的用戶已經進入user表內

說明:使用CREATE USER來建立的用戶,均無任何權限,user表的權限字段的值均爲N

 

1)建立帶有主機名的用戶

CREATE USER ‘用戶名稱’ [@’主機名稱’] [INDENTIFIED BY ‘用戶密碼’]

CREATE USER 'user2' @'localhost';

 

mysql> select user,host from mysql.user;

+-------+---------------------+

| user  | host      |

+-------+---------------------+

| user1 | %         |

| root  | 127.0.0.1 |

| root  | ::1       |

|       | localhost |

| pma   | localhost |

| root  | localhost |

| user2 | localhost |

+-------+---------------------+

7 rows in set (0.00 sec)

 

說明:host字段的%表示不受任何主機的限制

 

2)建立帶密碼的用戶

CREATE USER 'user3' @'localhost'  [INDENTIFIED BY ‘用戶密碼’];

 

例子:

CREATE USER 'user3' @'localhost' IDENTIFIED BY '123333';

 

驗證:

mysql> SELECT user,password,host FROM mysql.user;

+-------+-------------------------------------------------------------------------+-----------+

| user  | password                                  | host      |

+-------+-------------------------------------------------------------------------+-----------+

| root  |                                           | localhost |

| root  |                                           | 127.0.0.1 |

| root  |                                           | ::1       |

|       |                                           | localhost |

| pma   |                                           | localhost |

| user1 |                                           | %         |

| user2 |                                           | localhost |

| user3 | *0166E21E66009700F528CA21179AF9AD81120DA2 | localhost |

+-------+-------------------------------------------------------------------------+-----------+

8 rows in set (0.00 sec)

 

說明:密碼是哈希碼的形式顯示的

 

 

2.1.2 使用GRANT來建立用戶,以及授予權限

GRANT是用來給用戶受權的,可是也能夠用來建立用戶,GRANT在給用戶進行受權的時候,若是用戶是不存在的,那麼GRANT會自動建立這個用戶,而後再給這個用戶進行受權。

 

(1)添加權限

 

grant 權限 on 數據庫. to '用戶名'@'登陸主機'  [INDENTIFIED BY ‘用戶密碼’];

 

權限: select ,update,delete,insert(表數據)、create,alert,drop(表結構)、references(外鍵)、create temporary tables(建立臨時表)、index(操做索引)、create view,show view(視圖)、create routine,alert routine,execute(存儲過程)、all,all privileges(全部權限)

 

數據庫:數據庫名或者*(全部數據庫)

 

表:表名或者*(某數據庫下全部表),*.*表示全部數據庫的全部表

 

主機:主機名或者%(任何其餘主機)

 

例:grant selec,insert,update,delete on *.* to 'jifei'@'%';

 

GRANT SELECT ON *.* TO 'user4' @'localhost' IDENTIFIED BY '123333';

 

 

mysql> SELECT user,password,host FROM mysql.user;

+-------+-------------------------------------------------------------------------------+-----------+

| user  | password                                    | host      |

+-------+-------------------------------------------------------------------------------+-----------+

| root  |                                             | localhost |

| root  |                                             | 127.0.0.1 |

| root  |                                             | ::1      |

|       |                                            | localhost |

| pma   |                                            | localhost |

| user1 |                                              | %      |

| user2 |                                             | localhost |

| user3 | *0166E21E66009700F528CA21179AF9AD81120DA2   | localhost |

| user4 | *0166E21E66009700F528CA21179AF9AD81120DA2   | localhost |

+-------+-------------------------------------------------------------------------------+-----------+

9 rows in set (0.00 sec)

 

(2) 爲用戶授予指定數據庫、指定表、指定列的權限:

GRANT UPDATE(cid,cname) ON mysqlpart2.custom TO 'user3'@'localhost';

 

受權成功後,能夠在如下表中查看到受權信息:

數據庫: mysql » 表: tables_priv "Table privileges"

數據庫: mysql » 表: columns_priv "Column privileges"

 

(3)用戶權限表

位置:數據庫: information_schema »表: USER_PRIVILEGES

 

表的說明:

GRANTEE:受權者

PRIVILEGE_TYPE:權限名稱

 

用戶表:數據庫: mysql »表: user "Users and global privileges"

說明:user表中,」_priv」的值域USER_PRIVILEGES表的PRIVILEGE_TYPE的值是一一對應的。

 

4)權限的層級關係

①權限的層級關係,就是指權限的適用範圍。

②權限的最高層級是全局級,所謂全局級就是能夠在任何數據庫的任何數據表上進行操做。

③數據庫級:只能在某個數據庫上進行操做。

④表級:權限信息所在位置:數據庫: mysql »表: tables_priv "Table privileges"

⑤列級:權限信息所在位置:數據庫: mysql »表: columns_priv "Column privileges"

⑥子程序級:權限信息所在位置:數據庫: mysql »表: procs_priv "Procedure privileges"

 

 

5)撤銷權限

 

REVOKE 權限 ON 數據庫. FROM  '用戶名'@'登陸主機;

 

說明:賦權與撤銷權限的區別,就是REVOKE是將to改成from

 

例:revoke all on *.* from  ‘jifei’  @’%’;

 

REVOKE UPDATE(cid,cname) ON mysqlpart2.custom FROM 'user3'@'localhost';

 

(6) 查看權限

 

SHOW GRANTS;//本身

SHOW GRANTS FOR  用戶名稱@主機名稱;

 

例:

SHOW GRANTS FOR  dba@localhost;//指定用戶指定host

mysql> SHOW GRANTS FOR user3@localhost;

+---------------------------------------------------------------------------------------------------------------+

| Grants for user3@localhost                                                                                    |

+---------------------------------------------------------------------------------------------------------------+

| GRANT SELECT ON *.* TO 'user3'@'localhost' IDENTIFIED BY PASSWORD '*975B2CD4FF9AE554FE8AD33168FBFC326D2021DD' |

| GRANT UPDATE (cname, cid) ON `mysqlpart2`.`custom` TO 'user3'@'localhost'                                     |

+---------------------------------------------------------------------------------------------------------------+

2 rows in set (0.00 sec)

 

說明:全部SHOW關鍵字後面的詞都是複數,全部CREATE關鍵字後面的詞都是單數

 

經過mysql.columns_priv表來查看權限:

SELECT * FROM mysql.columns_priv WHERE user='user3' AND host='localhost';

mysql> SELECT * FROM mysql.columns_priv WHERE user='user3' AND host='localhost'\G

*************************** 1. row ***************************

       Host: localhost

         Db: mysqlpart2

       User: user3

 Table_name: custom

Column_name: cid

  Timestamp: 0000-00-00 00:00:00

Column_priv: Update

*************************** 2. row ***************************

       Host: localhost

         Db: mysqlpart2

       User: user3

 Table_name: custom

Column_name: cname

  Timestamp: 0000-00-00 00:00:00

Column_priv: Update

2 rows in set (0.00 sec)

 

 

2.1.3 關於以直接向user表插入記錄的方式來建立用戶

可使用INSERT的方式,直接向user表插入記錄,以此來建立用戶,可是由於user表的字段不少,並且所有字段均不容許爲空,這就須要爲每個列賦值,因此不推薦使用這種方式來建立用戶。

 

2.1.4 CREATE USER  GRANT 兩種方式建立用戶的區別

(1)CREATE USER 建立用戶的優勢:語法簡單

(2)CREATE USER 建立用戶的不足:用戶無權限

(3)GRANT 建立用戶的優點:建立的用戶有權限

(4)GRANT 建立用戶的不足:語法較CREATE USER 繁瑣

 

3. 刪除MYSQL的用戶

 

delete from mysql.user where user='用戶名稱' and host='主機名稱';

 

例:DELETE FROM mysql.user WHERE user='user3' AND host='localhost';

 

刪除後使用:FLUSH PRIVILEGES 來刷新權限

 

說明:

使用DELETET刪除用戶後,必須使用FLUSH PRIVILEGES 來刷新權限,不然將沒法繼續建立用戶名與已刪用戶的用戶名相同的用戶,即便在user表中看不到已刪除的用戶,若是不刷新權限,也是沒法再新建的。

 

例:

刪除用戶user3:

mysql> DELETE FROM mysql.user WHERE user='user3' AND host='localhost';

Query OK, 1 row affected (0.00 sec)

 

查看用戶表,user3已刪除成功:

mysql> select user from mysql.user;

+-------+

| user  |

+-------+

| user1 |

| root  |

| root  |

|       |

| pma   |

| root  |

| user2 |

| user4 |

+-------+

8 rows in set (0.00 sec)

 

建立用戶user3失敗:

mysql> CREATE USER 'user3' @'localhost' IDENTIFIED BY 'pwd';

ERROR 1396 (HY000): Operation CREATE USER failed for 'user3'@'localhost'

 

刷新權限:

FLUSH PRIVILEGES;

 

再次建立用戶,成功:

mysql> CREATE USER 'user3' @'localhost' IDENTIFIED BY 'pwd';

Query OK, 0 rows affected (0.00 sec)

 

4. 修改用戶密碼:

 

UPDATE mysql.user SET password=PASSWORD('新密碼') WHERE user='用戶名

[AND host=’主機名稱’]';

UPDATE mysql.user SET password=PASSWORD('111111') WHERE user='root';

 

注意:

(1)若是不加WHERE 條件,則會把全部用戶的密碼都修改成’新密碼’

(2)密碼修改完成後,須要進行權限刷新操做才能生效,FLUSH PRIVILEGES;

 

例:

UPDATE mysql.user SET password=PASSWORD('111') WHERE user='user1';

 

 

1)修改密碼的權限

ROOT用戶能夠修改本身的密碼,也能夠修改其餘用戶的密碼

其餘用戶只能修改本身的密碼

 

2PASSWORD函數

用於把密碼明文進行加密,所獲得的密碼爲原密碼的哈希值。

例:

mysql> SELECT PASSWORD('111');

+-------------------------------------------+

| PASSWORD('111')                           |

+-------------------------------------------+

| *832EB84CB764129D05D498ED9CA7E5CE9B8F83EB |

+-------------------------------------------+

1 row in set (0.07 sec)

 

3ROOT用戶、普通用戶修改本身的密碼

SET PASSWORD=PASSWORD(‘新密碼’);

 

4ROOT 用戶爲其餘用戶修改密碼:

SET PASSWORD FOR ‘用戶名稱’  @’主機名稱’  = password(‘新密碼’);

 

例,如下兩種修改密碼的方式結果相同:

SET PASSWORD FOR 'user1' @'%'=PASSWORD('111');

UPDATE mysql.user SET password=PASSWORD('111') WHERE user='user1';

相關文章
相關標籤/搜索