1. 程式人生 > 實用技巧 >Dubbo服務引用原始碼解析③

Dubbo服務引用原始碼解析③

在MySQL 5.7中,關於使用者及使用者許可權的相關資訊,都儲存在了mysql庫中的user表中,可以將user表中大致分為使用者列、許可權列、安全列、資源控制列這幾種。

一、使用者、許可權概述

1.1 使用者列

user表的使用者列包括 Host、 User、password,分別表示主機名、使用者名稱和密碼。其中 user和 Host為user表的聯合主踺。當用戶與伺服器之間建立連線時,輸入的賬戶資訊中的使用者名稱稱、主機名和密碼必須匹配user表中對應的欄位,只有3個值都匹配的時候,才允許連線的建立。這3 個欄位的值就是建立賬戶時儲存的賬戶資訊。修改使用者密碼時,實際就是修改user表的password欄位值。

1.2 許可權列

許可權列的欄位決定了使用者的許可權,描述了在全域性範圍內允許對資料和資料庫進行的操作。包括查詢許可權、修改許可權等普通許可權,還包括了關閉伺服器、超級許可權和載入使用者等高階許可權。普通許可權用於操作資料庫;高階許可權用於資料庫管理。 user表中對應的許可權是針對所有使用者資料庫的。這些欄位值的型別為 ENUM,可以取的值只能為 Y和 N, Y表示該使用者有對應的許可權; N表示使用者沒有對應的許可權。檢視user表的結構可以看到,這些欄位的值預設都是 N。如果要修改許可權,可以使用 GRANT語句或 UPDATE語句更改 user表的這些欄位來修改使用者對應的許可權。

1.3 安全列

安全列只有6個欄位,其中兩個是 SSI相關的,2個是 x509相關的,另外2個是授權外掛相關的。SSI用於加密; X509標準可用於標識使用者: Plugin欄位標識可以用於驗證使用者身份的外掛,如果該欄位為空,伺服器使用內建授權驗證機制驗證使用者身份。可以通過 SHOW VARIABLES LIKE ' have_openssl'語句來查詢伺服器是否支援 SSI功能。

1.4 資源控制列

資源控制列的欄位用來限制使用者使用的資源,包含4個欄位,分別為:
1)Max_questions—使用者每小時允許執行的查詢操作次數;
2)Max_updates一使用者每小時允許執行的更新操作次數;
3)Max_connections—使用者每小時允許執行的連線操作次數;
4)Max_user_connections—使用者允許同時建立的連線次數;

一個小時內使用者查詢或者連線數量超過資源控制限制,使用者將被鎖定,直到下一個小時,才可以在此執行對應的操作。可以使用GRANT語句更新這些欄位的值。

注:若新建的使用者無法登入到資料庫,排除許可權錯誤的前提下,可以嘗試重新整理許可權,命令如下:

mysql> flush privileges;

在使用grant給使用者授權時,可以使用下面的指令檢視有哪些許可權可以授權給使用者:

mysql> show privileges;

二、建立使用者

2.1 使用create語句

① 方法一
mysql> create user lzj@'localhost' identified by '123';
#建立一個使用者lzj,並設定密碼為123,僅允許本機登入
mysql> select * from mysql.user where user='lzj'\G;
#查詢mysql庫user表中User欄位為lzj的列
*************************** 1. row ***************************
                  Host: localhost   #允許從哪個主機登入
                  User: lzj       #使用者名稱
#以下是許可權,“N”表示沒有對應的許可權,“Y”表示擁有對應的許可權-			  
           Select_priv: N
           Insert_priv: N
           Update_priv: N
           Delete_priv: N
           Create_priv: N
             Drop_priv: N
           Reload_priv: N
         Shutdown_priv: N
          Process_priv: N
             File_priv: N
            Grant_priv: N
       References_priv: N
            Index_priv: N
            Alter_priv: N
          Show_db_priv: N
            Super_priv: N
 Create_tmp_table_priv: N
      Lock_tables_priv: N
          Execute_priv: N
       Repl_slave_priv: N
      Repl_client_priv: N
      Create_view_priv: N
        Show_view_priv: N
   Create_routine_priv: N
    Alter_routine_priv: N
      Create_user_priv: N
            Event_priv: N
          Trigger_priv: N
Create_tablespace_priv: N
              ssl_type:
            ssl_cipher:
           x509_issuer:
          x509_subject:
         max_questions: 0
           max_updates: 0
       max_connections: 0
  max_user_connections: 0
                plugin: mysql_native_password
 authentication_string: *23AE809DDACAF96AF0FD78ED04B6A265E05AA257  #經過雜湊加密過的密碼
      password_expired: N
 password_last_changed: 2020-04-14 12:38:17
     password_lifetime: NULL
        account_locked: N

但是上面這種方式,密碼是以明文的方式寫下來的(雖然儲存進去後是密文的方式),但有些不安全!

② 方法二
mysql> select password('123');    #查詢123加密後的字串
+-------------------------------------------+
| password('123')                           |
+-------------------------------------------+
| *23AE809DDACAF96AF0FD78ED04B6A265E05AA257 |
+-------------------------------------------+
mysql> create user lv@'localhost' identified by
    -> password '*23AE809DDACAF96AF0FD78ED04B6A265E05AA257';
#建立使用者的時候,直接寫入加密後的密碼即可,但是需要新增password關鍵字

2.2 使用grant語句

mysql> grant select on test.* to zhen@'localhost' identified by '123';
#建立使用者zhen,密碼為123,對test庫下的所有表只允許讀取的許可權
[root@db01 ~]# mysql -uzhen -p123
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| test               |
+--------------------+
mysql> show tables from test;
+----------------+
| Tables_in_test |
+----------------+
| bank           |
| student        |
+----------------+
mysql> select * from test.student;
+----+----------+
| id | name     |
+----+----------+
|  2 | zhangsan |
|  4 | wangwu   |
+----+----------+
mysql> update test.student set name=zhang where id=2;
ERROR 1142 (42000): UPDATE command denied to user 'zhen'@'localhost' for table 'student'
#由於許可權的問題所以導致失敗

三、刪除使用者

3.1 使用drop user語句

mysql> drop user zhen@'localhost';

3.2 使用delete語句

mysql> delete from mysql.user where host='localhost' and user='lzj';

四、修改使用者密碼

4.1 使用mysqladmin命令

[root@db01 ~]# mysqladmin -uroot -p'123' password '123.com';
[root@db01 ~]# mysql -uroot -p123.com
mysql>

4.2 修改mysql庫下的user表

mysql> update mysql.user set authentication_string=password('123') where user='root';
mysql> flush privileges;
[root@db01 ~]# mysql -uroot -p123
mysql>

4.3 使用set語句修改當前使用者的密碼

mysql> set password=password('123.com');
[root@db01 ~]# mysql -uroot -p123.com
mysql>

4.4 root使用者修改普通使用者密碼

① 使用set語句
mysql> set password for lv@'localhost'=password('123.com');
② 使用update語句
mysql> update mysql.user set authentication_string=password('123')
    -> where user='lv' and host='localhost';
mysql> flush privileges;
#需重新整理一下許可權	
③ 使用grant語句
mysql> grant select on *.* to lv@'localhost' identified by '123.com';

4.5 普通使用者修改自己的密碼

[root@db01 ~]# mysql -ulv -p123.com
mysql> set password=password('123');

4.6 撤銷普通使用者許可權

mysql> show grants for lv@'localhost';
#檢視使用者擁有的許可權
mysql> revoke select on *.* from lv@'localhost';
#撤銷使用者的select許可權
mysql> flush privileges;
#需重新整理許可權