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用戶能夠修改本身的密碼,也能夠修改其餘用戶的密碼
其餘用戶只能修改本身的密碼
(2)PASSWORD函數
用於把密碼明文進行加密,所獲得的密碼爲原密碼的哈希值。
例:
mysql> SELECT PASSWORD('111');
+-------------------------------------------+
| PASSWORD('111') |
+-------------------------------------------+
| *832EB84CB764129D05D498ED9CA7E5CE9B8F83EB |
+-------------------------------------------+
1 row in set (0.07 sec)
(3)ROOT用戶、普通用戶修改本身的密碼
SET PASSWORD=PASSWORD(‘新密碼’);
(4)ROOT 用戶爲其餘用戶修改密碼:
SET PASSWORD FOR ‘用戶名稱’ @’主機名稱’ = password(‘新密碼’);
例,如下兩種修改密碼的方式結果相同:
SET PASSWORD FOR 'user1' @'%'=PASSWORD('111');
UPDATE mysql.user SET password=PASSWORD('111') WHERE user='user1';