Mysql——權限管理


安裝Mysql時會自動安裝一個名為mysql的數據庫。這個數據庫下面存儲的是權限表

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| mysql              |
| test               |
+--------------------+

Mysql會根據這些權限表的內容為每個用戶賦予相應的權限
所以我們也是通過這些表來實現管理用戶和權限的

use mysql;
show tables;
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
| columns_priv              |
| db                        |
| event                     |
| func                      |
| general_log               |
| help_category             |
| help_keyword              |
| help_relation             |
| help_topic                |
| host | | innodb_index_stats | | innodb_table_stats | | ndb_binlog_index | | plugin | | proc | | procs_priv | | proxies_priv | | servers | | slave_master_info | | slave_relay_log_info | | slave_worker_info | | slow_log | | tables_priv | | time_zone | | time_zone_leap_second | | time_zone_name | | time_zone_transition | | time_zone_transition_type | | user | +---------------------------+

 

user表

1. user表的作用相當與mysql工作流程中的"用戶管理模塊",它決定着我們對一個連接允許或拒絕

2. user表用於記錄允許連接到服務器的用戶帳號信息,里面的對於數據庫的權限是全局生效的

3. 根據user表結構,表的字段可以分為4類
(1) 用戶列

  • Host          主機名   ——>如果想要從別的機器來登入數據庫,Host可以設成 % 
  • User          用戶名
  • Password  密碼

用戶登錄時,首先要判斷這三個字段是否匹配,匹配則允許登錄;

用戶創建時,也是設置這三個字段的值;

修改用戶密碼時,實際也是修改了user表的Password字段的值。

(2) 權限列(以priv結尾的)

  • Grant_priv         是否有Grant權限
  • Shutdown_priv  是否有停止mysql服務的權限
  • Super_priv        是否有超級權限
  • Execute_priv    是否有執行存儲過程和函數的權限

包含普通權限:查詢權限、修改權限等 操作數據庫的動作;

包含高級管理權限:關閉服務權限、超級權限、加載用戶等 管理數據庫的動作;

這些字段只有N和Y兩個選項,為安全起見默認值都設為N;

對這些權限的管理可以使用GRANT語句、也可以通過UPDATE user表的這些列來實現。

(3) 安全列

ssl用於加密,不過一般的發行版本並不支持ssl

mysql> show variables LIKE'have_openssl';
+---------------+----------+
| Variable_name | Value    |
+---------------+----------+
| have_openssl  | DISABLED |  ——>DISABLED表示沒有支持ssl加密功能
+---------------+----------+
1 row in set (0.03 sec)

x509標准可以用來標識用戶

(4) 資源控制列  

  • max_questions    每小時允許執行多少次查詢
  • max_updates       每小時允許執行多少次更新
  • max_connections 每小時允許建立多少連接
  • max_user_connections 單個用戶可以同時具有的連接數

這些字段默認值為0,表示沒有限制

desc user;
+------------------------+-----------------------------------+------+-----+----
| Field                  | Type          | Null | Key | Default   | Extra |
+------------------------+-----------------------------------+------+-----+---
| Host                   | char(60)      | NO   | PRI |                       |       |
| User                   | char(16)      | NO   | PRI |                       |       |
| Password               | char(41)      | NO   |     |                       |       |
| Select_priv            | enum('N','Y') | NO   |     | N                     |       |
| Insert_priv            | enum('N','Y') | NO   |     | N                     |       |
| Update_priv            | enum('N','Y') | NO   |     | N                     |       |
| Delete_priv            | enum('N','Y') | NO   |     | N                     |       |
| Create_priv            | enum('N','Y') | NO   |     | N                     |       |
| Drop_priv              | enum('N','Y') | NO   |     | N                     |       |
| Reload_priv            | enum('N','Y') | NO   |     | N                     |       |
| Shutdown_priv          | enum('N','Y') | NO   |     | N                     |       |
| Process_priv           | enum('N','Y') | NO   |     | N                     |       |
| File_priv              | enum('N','Y') | NO   |     | N                     |       |
| Grant_priv             | enum('N','Y') | NO   |     | N                     |       |
| References_priv        | enum('N','Y') | NO   |     | N                     |       |
| Index_priv             | enum('N','Y') | NO   |     | N                     |       |
| Alter_priv             | enum('N','Y') | NO   |     | N                     |       |
| Show_db_priv           | enum('N','Y') | NO   |     | N                     |       |
| Super_priv             | enum('N','Y') | NO   |     | N                     |       |
| Create_tmp_table_priv  | enum('N','Y') | NO   |     | N                     |       |
| Lock_tables_priv       | enum('N','Y') | NO   |     | N                     |       |
| Execute_priv           | enum('N','Y') | NO   |     | N                     |       |
| Repl_slave_priv        | enum('N','Y') | NO   |     | N                     |       |
| Repl_client_priv       | enum('N','Y') | NO   |     | N                     |       |
| Create_view_priv       | enum('N','Y') | NO   |     | N                     |       |
| Show_view_priv         | enum('N','Y') | NO   |     | N                     |       |
| Create_routine_priv    | enum('N','Y') | NO   |     | N                     |       |
| Alter_routine_priv     | enum('N','Y') | NO   |     | N                     |       |
| Create_user_priv       | enum('N','Y') | NO   |     | N                     |       |
| Event_priv             | enum('N','Y') | NO   |     | N                     |       |
| Trigger_priv          | enum('N','Y') | NO   |     | N                     |       |
| Create_tablespace_priv | enum('N','Y') | NO   |     | N                     |       |
| ssl_type               | enum('','ANY','X509','SPECIFIED') | NO             |       |          
| ssl_cipher             | blob          | NO   |     | NULL                  |       |
| x509_issuer            | blob          | NO   |     | NULL                  |       |
| x509_subject           | blob          | NO   |     | NULL                  |       |
| max_questions          | int(11) unsigned | NO   |     | 0                     |       |
| max_updates            | int(11) unsigned | NO   |     | 0                     |       |
| max_connections        | int(11) unsigned | NO   |     | 0                     |       |
| max_user_connections   | int(11) unsigned | NO   |     | 0                     |       |
| plugin                 | char(64)         | YES  |     | mysql_native_password |       |
| authentication_string  | text             | YES  |     | NULL                  |       |
| password_expired       | enum('N','Y')    | NO   |     | N                     |       |
+------------------------+-----------------------------------+------+-----+----------------

 

db表

1. 用戶被允許連接了,但是是不是可以就能操作所有數據庫了呢?

2. 所以我們需要db表/host表,用來規定某一個用戶對一個數據庫的權限

3. db表的字段分為兩類:
(1)用戶列

  • Host   主機名
  • Db      數據庫名
  • User   用戶名

(2)權限列      

用戶是先根據user表的內容獲得權限,再根據db表的內容獲取權限          

例如,user表中某用戶的Select_priv字段為‘N’,表示所有數據庫中的表它都無權查詢

但db表中這一用戶對student表的Select_priv字段設為了‘Y’,表示它只有查詢student表的權限

desc db;
+-----------------------+---------------+------+-----+---------+-------+
| Field                 | Type          | Null | Key | Default | Extra |
+-----------------------+---------------+------+-----+---------+-------+
| Host                  | char(60)      | NO   | PRI |         |       |
| Db                    | char(64)      | NO   | PRI |         |       |
| User                  | char(16)      | NO   | PRI |         |       |
| Select_priv           | enum('N','Y') | NO   |     | N       |       |
| Insert_priv           | enum('N','Y') | NO   |     | N       |       |
| Update_priv           | enum('N','Y') | NO   |     | N       |       |
| Delete_priv           | enum('N','Y') | NO   |     | N       |       |
| Create_priv           | enum('N','Y') | NO   |     | N       |       |
| Drop_priv             | enum('N','Y') | NO   |     | N       |       |
| Grant_priv            | enum('N','Y') | NO   |     | N       |       |
| References_priv       | enum('N','Y') | NO   |     | N       |       |
| Index_priv            | enum('N','Y') | NO   |     | N       |       |
| Alter_priv            | enum('N','Y') | NO   |     | N       |       |
| Create_tmp_table_priv | enum('N','Y') | NO   |     | N       |       |
| Lock_tables_priv      | enum('N','Y') | NO   |     | N       |       |
| Create_view_priv      | enum('N','Y') | NO   |     | N       |       |
| Show_view_priv        | enum('N','Y') | NO   |     | N       |       |
| Create_routine_priv   | enum('N','Y') | NO   |     | N       |       |
| Alter_routine_priv    | enum('N','Y') | NO   |     | N       |       |
| Execute_priv          | enum('N','Y') | NO   |     | N       |       |
| Event_priv            | enum('N','Y') | NO   |     | N       |       |
| Trigger_priv          | enum('N','Y') | NO   |     | N       |       |
+-----------------------+---------------+------+-----+---------+-------+

 

tables_priv表和columns_priv表

1. 同理,即便用戶有權對某一數據庫操作,那么是不是對所有表都可以操作?對表中的所有記錄都可以操作?
2. tables_priv表用來對單個表進行權限設置
3. columns_priv表用來對單條記錄(列)進行權限設置
4. 其包含的字段主要有:

  • Host                 主機名
  • Db                    數據庫名
  • User                 用戶名
  • Table_name     表名
  • column_name  表示可以對哪些數據列進行操作
  • Table_priv        對表進行操作的權限(select,insert,update,delete,create,drop,grant,references,index,alter)
  • Column_priv    對記錄進行操作的權限(select,insert,update,references)
  • Timestamp       修改權限的時間
  • Grantor             權限的設置者
mysql> desc tables_priv;
+-------------+-----------------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-----------------------------+
| Field       | Type                                                                                                                              | Null | Key | Default           | Extra                       |
+-------------+-----------------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-----------------------------+
| Host        | char(60)                                                                                                                          | NO   | PRI |                   |                             |
| Db          | char(64)                                                                                                                          | NO   | PRI |                   |                             |
| User        | char(16)                                                                                                                          | NO   | PRI |                   |                             |
| Table_name  | char(64)                                                                                                                          | NO   | PRI |                   |                             |
| Grantor     | char(77)                                                                                                                          | NO   | MUL |                   |                             |
| Timestamp   | timestamp                                                                                                                         | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| Table_priv  | set('Select','Insert','Update','Delete','Create','Drop','Grant','References','Index','Alter','Create View','Show view','Trigger') | NO   |     |                   |                             |
| Column_priv | set('Select','Insert','Update','References')                                                                                      | NO   |     |                   |                             |
+-------------+-----------------------------------------------------------------------------------------------------------------------------------+------+-----+-------------------+-----------------------------+
8 rows in set (0.01 sec)
mysql> desc columns_priv;
+-------------+----------------------------------------------+------+-----+-------------------+-----------------------------+
| Field       | Type                                         | Null | Key | Default           | Extra                       |
+-------------+----------------------------------------------+------+-----+-------------------+-----------------------------+
| Host        | char(60)                                     | NO   | PRI |                   |                             |
| Db          | char(64)                                     | NO   | PRI |                   |                             |
| User        | char(16)                                     | NO   | PRI |                   |                             |
| Table_name  | char(64)                                     | NO   | PRI |                   |                             |
| Column_name | char(64)                                     | NO   | PRI |                   |                             |
| Timestamp   | timestamp                                    | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
| Column_priv | set('Select','Insert','Update','References') | NO   |     |                   |                             |
+-------------+----------------------------------------------+------+-----+-------------------+-----------------------------+
7 rows in set (0.00 sec)

 

procs_priv表

1. 對存儲過程和存儲函數進行權限設置

2. 主要字段:

  • Host                 主機名
  • Db                    數據庫名
  • User                 用戶名
  • Routine_name 存儲過程/存儲函數的名字
  • Routine_type   標識它是FUNCTION(存儲函數)還是PROCEDURE(存儲過程)
  • Proc_priv         擁有的權限(Execute、Alter Routine、Grant)
  • Timestamp       更新的時間
  • Grantor            權限是誰設置的
mysql> desc procs_priv;
+--------------+----------------------------------------+------+-----+-------------------+-----------------------------+
| Field        | Type                                   | Null | Key | Default           | Extra                       |
+--------------+----------------------------------------+------+-----+-------------------+-----------------------------+
| Host         | char(60)                               | NO   | PRI |                   |                             |
| Db           | char(64)                               | NO   | PRI |                   |                             |
| User         | char(16)                               | NO   | PRI |                   |                             |
| Routine_name | char(64)                               | NO   | PRI |                   |                             |
| Routine_type | enum('FUNCTION','PROCEDURE')           | NO   | PRI | NULL              |                             |
| Grantor      | char(77)                               | NO   | MUL |                   |                             |
| Proc_priv    | set('Execute','Alter Routine','Grant') | NO   |     |                   |                             |
| Timestamp    | timestamp                              | NO   |     | CURRENT_TIMESTAMP | on update CURRENT_TIMESTAMP |
+--------------+----------------------------------------+------+-----+-------------------+-----------------------------+
8 rows in set (0.00 sec)

 

用戶的權限分配規則

(1)Mysql的權限分配是按照user表--->db表--->tables_priv表--->columns_priv表的順序進行分配的
(2)如果user表中某一權限的值為Y,就不需要檢查往后的表了
(3)如果user表中某一權限的值為N,則依次往后檢查每一張表

 

Mysql的各種權限

 

權限管理操作

1. 授權

Methods-1

> grant            [權限list]                      ——> 參考上表
   on                 [datebase-name.table-name]
   to                  ['username'@'hostname']

   identified by  ['password']                  ——> 如果是新創建的用戶可以設置密碼
   with               [options];                      ——> with關鍵字之后有5個可選項

options:
  grant option:表示被授權的用戶可以將這些權限賦予給別的用戶
  max_queries_per_hour [count]:設置每小時可以允許執行count次查詢
  max_updates_per_hour [count]:設置每小時可以允許執行count次更新
  max_connections_per_hour [count]:設置每小時可以建立count連接
  max_user_connections [count]:設置單個用戶可以同時具有的count個連接數

 

Methods-2 授予一個用戶全部權限

> grant   all privileges  on  [database-name.table-name]  to  'username'@'hostname'  with grant option;

2. 查看權限

Methods-1

  > show  grants  for  'hostname'@'hostname' \G

 

Methods-2  

  > select  *  from  mysql.user  where  User='username'  and  Host='hostname' \G

3. 取消權限

> revoke  [權限list]
   on         [datebase-name.table.name]
   from      ['username'@'hostname'];

 

取消全部權限:

> revoke all privileges,grant option
   from     'username'@'hostname';

4. 刷新(加載)權限

> flush privileges;

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM