您好,登錄后才能下訂單哦!
在MySQL 5.7.24中,關于用戶及用戶權限的相關信息,都保存在了mysql庫中的user表中,可以將user表中大致分為用戶列、權限列、安全列、資源控制列這幾種。
user表的用戶列包括 Host、 User、password,分別表示主機名、用戶名和密碼。其中 user和 Host為user表的聯合主踺。當用戶與服務器之間建立連接時,輸入的賬戶信息中的用戶名稱、主機名和密碼必須匹配user表中對應的字段,只有3個值都匹配的時候,才允許連接的建立。這3 個字段的值就是創建賬戶時保存的賬戶信息。修改用戶密碼時,實際就是修改user表的password字段值。
權限列的字段決定了用戶的權限,描述了在全局范圍內允許對數據和數據庫進行的操作。包括查詢權限、修改權限等普通權限,還包括了關閉服務器、超級權限和加載用戶等高級權限。普通權限用于操作數據庫;高級權限用于數據庫管理。 user表中對應的權限是針對所有用戶數據庫的。這些字段值的類型為 ENUM,可以取的值只能為 Y和 N, Y表示該用戶有對應的權限; N表示用戶沒有對應的權限。查看user表的結構可以看到,這些字段的值默認都是 N。如果要修改權限,可以使用 GRANT語句或 UPDATE語句更改 user表的這些字段來修改用戶對應的權限。
安全列只有6個字段,其中兩個是 SSI相關的,2個是 x509相關的,另外2個是授權插件相關的。SSI用于加密; X509標準可用于標識用戶: Plugin字段標識可以用于驗證用戶身份的插件,如果該字段為空,服務器使用內建授權驗證機制驗證用戶身份。可以通過 SHOW VARIABLES LIKE ' have_openssl'語句來查詢服務器是否支持 SSI功能。
資源控制列的字段用來限制用戶使用的資源,包含4個字段,分別為:
1)Max_questions—用戶每小時允許執行的查詢操作次數。
2)Max_updates一用戶每小時允許執行的更新操作次數。
3)Max_connections—用戶每小時允許執行的連接操作次數。
4)Max_user_connections—用戶允許同時建立的連接次數。
一個小時內用戶查詢或者連接數量超過資源控制限制,用戶將被鎖定,直到下一個小時,才可以在此執行對應的操作。可以使用GRANT語句更新這些字段的值。
注:若新建的用戶無法登錄到數據庫,排除權限錯誤的前提下,可以嘗試刷新權限,命令如下:
mysql> flush privileges;
在使用grant給用戶授權時,可以使用下面的指令查看有哪些權限可以授權給用戶:
mysql> SHOW PRIVILEGES;
mysql> create user 'tom'@'localhost' identified by '123.com';
上面的語句是創建了一個tom用戶,只允許本機登錄,并且密碼為123.com。
但是上面這種方式,密碼是以明文的方式寫下來的(雖然存儲進去后是密文的方式),但有些不安全,上述指令會在mysq.user這個表中產生tom這個用戶的信息,如下:
mysql> select * from user where User='tom'\G <!--查詢User字段為tom的列-->
*************************** 1. row ***************************
Host: localhost <!--允許從哪個主機登錄-->
User: tom <!--用戶名-->
<!--以下是權限,“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: *AC241830FFDDC8943AB31CBD47D758E79F7953EA
<!--上面是123.com經過哈希加密過的密碼-->
password_expired: N
password_last_changed: 2019-12-27 11:45:25
password_lifetime: NULL
account_locked: N
1 row in set (0.00 sec)
mysql> select password('123.com');
+-------------------------------------------+
| password('123.com') |
+-------------------------------------------+
| *AC241830FFDDC8943AB31CBD47D758E79F7953EA |
+-------------------------------------------+
1 row in set, 1 warning (0.00 sec)
mysql> create user 'zhangyi'@'localhost'
-> identified by password '*AC241830FFDDC8943AB31CBD47D758E79F7953EA';
Query OK, 0 rows affected, 1 warning (0.00 sec)
上述命令是先將123.com字符串進行加密,然后創建用戶的時候,直接寫入加密后的密碼即可,但是需要添加password關鍵字。
創建后,zhangyi用戶在本機使用123.com這個密碼就可以登錄到數據庫了。
mysql> grant select on test01.* to 'zhanger'@'localhost' identifiedd by '123.com';
上述指令在創建用戶zhanger的同時,指定其只允許本機登錄,密碼為123.com,并且該用戶對test01這個庫的所有表具有select權限。
驗證:
[root@mysql ~]# mysql -uzhanger -p123.com <!--使用zhanger用戶進行登錄-->
mysql> show databases; <!--查看有哪些庫,其實還有很多,但是由于沒權限,所以不會顯示所有的庫-->
+--------------------+
| Database |
+--------------------+
| information_schema |
| test01 |
+--------------------+
2 rows in set (0.00 sec)
mysql> use test01; <!--切入到有權限的庫-->
mysql> show tables; <!--查看所有表-->
+------------------+
| Tables_in_test01 |
+------------------+
| bank |
| student |
+------------------+
2 rows in set (0.00 sec)
mysql> select * from bank; <!--查看某個表內容-->
+------+-------+
| name | money |
+------+-------+
| lu | 1000 |
| qi | 5000 |
+------+-------+
2 rows in set (0.00 sec)
mysql> update bank set money=600 where name='lu'; <!--試著更新表內容,但是由于只有select權限,所以會被拒絕-->
ERROR 1142 (42000): UPDATE command denied to user 'zhanger'@'localhost' for table 'bank'
mysql> drop user zhangyi@localhost;
mysql> delete from mysql.user where Host='localhost' and user='tom';
[root@mysql ~]# mysqladmin -uroot -p password '2008.com' <!--將root用戶的密碼修改為2008.com-->
Enter password: <!--此處注意,需要填寫舊密碼-->
[root@mysql ~]# mysql -uroot -p123.com <!--此時舊密碼已經無法登錄了-->
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
[root@mysql ~]# mysql -uroot -p2008.com <!--使用新密碼登錄即可-->
<!--修改root密碼為123.com-->
mysql> update mysql.user set authentication_string=password("123.com") where User="root" and Host="localhost";
mysql> flush privileges;
mysql> set password=password('2019.com');
mysql> set password for 'liss'@'localhost'=password('123456');
<!--修改liss用戶的密碼為123456-->
mysql> update mysql.user set authentication_string=password("123.com")
-> where User='liss' and host='localhost';
<!--修改liss用戶的密碼為123.com-->
mysql> flush PRIVILEGES; <!--需要刷新一下才可以生效-->
mysql> grant select on *.* to 'liss'@'localhost' identified by '304.com';
<!--修改liss用戶的密碼為304.com,同時賦予select權限-->
[root@mysql ~]# mysql -uliss -p304.com <!--登錄-->
mysql> set password=password("lvjianzhao"); <!--修改密碼為lvjianzhao-->
在上面已經寫下了如何為用戶授權,那么這里將寫下如何將用戶的已有權限撤銷。如下:
mysql> show grants for liss@localhost\G <!--查看用戶擁有的權限-->
mysql> revoke select on *.* from 'liss'@'localhost'; <!--將用戶的select權限撤銷-->
mysql> flush PRIVILEGES; <!--刷新權限,至此,當用戶再次登錄,就沒有select權限了-->
———————— 本文至此結束,感謝閱讀 ————————
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。