權限表
user 表
user表是MySQL中一個重要的權限表,記錄允許連接服務器的賬號信息,
user表有42個字段主要分爲四類:
用戶列
有 host,user, password 字段,連接時只有這三個值都匹配才能連接,修改密碼其實就是修改password字段的值
權限列
類型爲枚舉:值爲 Y 或 N
可以使用 grant 或 update 改變user表的字段來修改權限
安全列
其中兩個是 和 ssl相關
用戶可以使用 show variables like “have_openssl” 查看服務是否支持ssl功能
資源控制類
max_questions----> 用戶每小時允許的查詢操作次數
max_updates—被允許更新次數
max_connections—每小時連接次數
max_user_connections----用戶同時建立的連接數量
db表 host表
db:存儲了用戶對db的操作權限
host:記錄某個主機對DB的操作權限
兩者相結合
注意:好像MySQL5.7版本後是沒有host表
tables_priv && columns_priv 表
tables_priv 用來對標設置操作權限
columns_priv 用來對錶的某一列設置權限
對錶的權限包括:select update delete insert drop alter create grant references 等
proces_priv 表
對------ 存儲過程,存儲函數設置操作權限
proc_priv 表示擁有的權限 包括 ----- execute、alter routine、grant
賬戶管理
登錄退出MySQL服務器
參數
- h 主機名或ip,默認是localhost
- u 用戶名
- p 密碼
- P 端口號
- 數據庫名,在命令最後指定
新建用戶
兩種方式:1.使用 create user 或 grant語句 2.操作MySQL的授權表
但是一般我們都使用第一種方式
注意:新建的用戶沒有任何權限
# 第一種方式
# identified 用來設置用戶密碼
CREATE USER 'jeffrey'@'localhost' IDENTIFIED BY 'mypass';
# 第一種方式 使用 grant 所有數據庫都有select && update 權限
GRANT SELECT,UPDATE ON *.* TO 'testUser'@'localhost' IDENTIFIED BY 'testpwd';
# 第二種方式 修改user表
INSERT INTO user (Host,User,Password) VALUES('localhost','customer1',PASSWORD('customer1'));
刪除用戶
# 刪除用戶本地登錄權限
drop user "user_name"@"localhost"
# 刪除用戶
delete from user where host=‘hostname’ and user='username'
root修改自己密碼
1.修改MySQL數據庫中的user表
UPDATE mysql.user set Password=password(“rootpwd2”)
WHERE User=“root” and Host=“localhost”;
2.使用MySQLadmin
mysqladmin -u username -p password “newpwd”
更改權限後,使用 flush privileges
3.使用 set password 設置密碼
set password=password(“rootpwd”)
root用戶修改 普通用戶密碼
- 使用set 語句
- set password for “user”@“host” = password(“somepwd”)
- 如果是普通用戶修改則可以省略for
- set password = password(“somepwd”)
- 使用update語句修改用戶密碼
update mysql.user set password=password(“userpwd”) where user=“username” and host=“hostname” - 使用grant 修改密碼
grant usage on *.* to 'username'@'password' identified by "userpassword"
- 一個普通用戶修改自己密碼
- set password = password(“userpwd”)
忘記root密碼解決辦法
- 使用 --skip-grant-tables 選項,MySQL服務啓動時將不會加載權限判斷
mysqld --skip-grant-tables
- 直接mysql -u root 就好了
musql -u root
此時應該直接連上MySQL了
- 登錄成功設置root密碼
update mysql.user set password=password(“userpwd”)
- 加載權限
flush privileges
權限管理
MySQL 的各種權限
賬號的權限都存儲在,user、db、host、tables_priv、columns_priv、proces_priv
授權
- 全局層級
grant all on . 和 revoke all on . 授予或撤銷全局權限
- 數據庫層級
- 表級別
- 列級別
示例演示
使用 grant 創建一個新用戶 grantuser 密碼爲 grantpwd
grant select,insert on . to ‘grantuser’@‘localhost’ identified by ‘grantpwd’ with grant option
with 後面可以跟的參數
grant option :被授權的用戶,可以講這些權限賦予別的用戶
收回權限
取消用戶的update權限
revoke update on . from ‘testuser’@‘localhost’;
查看用戶的權限信息
show grants for ‘user’@‘host’
select privileges from user where user=“username” ,host=“hostname”;
訪問控制
連接覈實階段
當用戶連接MySQL時,MySQL會去user表中驗證 host user password ,這三個字段是否匹配上,若果匹配上則允許登錄,否則拒絕訪問
請求覈實階段
階段2:
1.建立連接後,這個連接上的每個請求服務器都會檢查用戶要執行的操作,判斷用戶是否有足夠的權限來執行,權限來自表,庫級 db、用戶級 user、表級別 tables_priv 、列級別 columns_priv。 2.確認權限時,先檢查user表如果被授權,則檢查db表如果被授權,則繼續檢查,tables_priv和columns_priv 表,如果所有權限檢查過了則執行,否則error