一、MySQL用戶認證:
登錄並不屬於訪問控制機制,而屬於用戶身份識別和認證:
1.用戶名—user
2.密碼—password
3.登錄mysqld主機—host
實現用戶登錄MySQL,建立連接。
MySQL的整個訪問控制包括兩大塊:用戶管理模塊、訪問控制模塊

MySQL中用戶管理模塊的信息存儲在系統表mysql.user中
mysql> SELECT * FROM mysql.user;

存放的信息:授權用戶的基本信息、權限信息
首先:以root用戶登錄---shell> mysql -u root -p
1、新建用戶---localhost本地主機、%表示任何登錄
mysql> create user 'u1'@'172.16.12.24' identified by '123'; mysql> create user 'u1'@'172.16.11.99' identified by '123'; mysql> create user 'u2'@'%' identified by '123';
mysql> select user,host from mysql.user; +-----------+--------------+
| user | host |
+-----------+--------------+
| u2 | % |
| u1 | 172.16.11.99 |
| u1 | 172.16.12.24 |
| mysql.sys | localhost |
| root | localhost |
+-----------+--------------+
5 rows in set (0.00 sec)
2、刪除用戶
mysql> use mysql;
mysql> delete from user where User='u1' and Host='172.16.11.99';
mysql> flush privileges;
3、修改用戶名
語法:該語句不影響用戶的密碼
RENAME USER old_user TO new_user
[, old_user TO new_user] ...
mysql> rename user 'u1'@'172.16.12.24' to 'win.user'@'172.16.12.24';
mysql> rename user 'u2'@'%' to 'back'@'127.0.0.1';
4、修改用戶密碼
①推薦方法:
mysql> alter user '用戶名'@'登錄主機' identified by '密碼(自定義)';
②傳統方法(mysql5.6):
語法:
SET PASSWORD [FOR user_name] = password_option;
缺省for user_name是給當前用戶修改密碼
mysql> SET PASSWORD FOR '用戶名'@'登錄主機' = PASSWORD('密碼');
5、破解密碼
先關閉mysqld服務
①查看跳過授權表參數
shell> mysqld --verbose --help
--skip-grant-tables
②修改/etc/my.cnf文件,注釋密碼策略參數
③安全啟動mysql
shell> mysqld_safe --skip-grant-tables &
④無密碼登錄mysql -uroot
mysql> flush privileges; #加載授權表
然后進行修改密碼
最后重啟數據庫,用修改的密碼進行登錄驗證即可
二、MySQL的授權:
1.系統權限
2.針對某一個數據庫
3.某一個數據庫里面的某一張表
4.某一個數據庫里面的某一張表的某一個列
1、按照權限的授予級別,分類:
①全局權限Global Privileges:管理權限,應用到服務器上的所有數據庫上(全局權限保存在 mysql.user 表中)-----on *.*
②數據庫權限Database Privileges:應用到某個特定數據庫的所有對象上(數據庫權限保存在 mysql.db 表中)-----on db_name.*
③表權限Table Privileges:應用到某個特定表的所有列上(表權限保存在 mysql.tables_priv 表中)-----on db_name.tbl_name
④列權限Column Privileges:應用到某個特定表的單個列上(列權限保存在 mysql.columns_priv 表中)-----在權限名稱后面跟小括號,其中寫上列名
⑤存儲例程權限Stored Routine Privileges:應用到存儲過程和函數上(存儲例程權限保存在 mysql.procs_priv表中)
⑥代理用戶權限Proxy User Privileges:使一個用戶成為另一個用戶的代理(代理用戶權限保存在 mysql.proxies_priv表中)
2、基本格式:grant 權限類型 on [對象類型] 某數據庫.某表 to 用戶名@登錄主機;
1、u1可以訪問所有數據庫的所有表,select
mysql> grant select on table *.* to 'u1'@'172.16.12.24';
2、u1可以訪問test數據庫的所有表,insert
mysql> grant insert on table test.* to 'u1'@'172.16.12.24';
3、u2可以訪問test數據庫里面的t1
mysql> grant all on table test.t1 to 'u2'@'%';
4、u2可以訪問test數據庫里面的t1(id列)
mysql> grant select (id) on table test.t1 to 'u2'@'%';
3、grant里的新建用戶(且授權):
mysql> grant all on *.* to 'zhang'@'%' identified by '123' with grant option;
with grant option子句
---通過在grant語句的最后使用該子句,就允許被授權的用戶把得到的權限繼續授給其它用戶。
問:能否新建用戶但不設密碼?
mysql> grant all on *.* to 'u3'@'%' with grant option;
ERROR 1133 (42000): Can't find any matching row in the user table
#u3是個未知用戶,不定義密碼就是授權操作,因此報錯沒有匹配的用戶
解決:
①查看變量sql_mode的值
mysql> show variables like 'sql_mode';
……NO_AUTO_CREATE_USER…… #不自動創建用戶(set去掉此項修改sql_mode參數)
MySQL服務器可以以不同的SQL模式來操作,並且可以為不同客戶端應用不同模式;
如此,每個應用程序可以根據自己的需求來定制服務器的操作模式;
sql_mode模式定義了MySQL應支持的SQL語法,以及應該在數據上執行何種確認檢查;通過sql_mode設置,就能在眾多不同的環境下、與其他數據庫服務器一起更容易地使用MySQL;MySQL常用的有三種SQL模式:傳統模式TRADITIONAL、嚴格模STRICT、ANSI模式;
②修改變量sql_mode的值
mysql>set @@session.sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
Query OK, 0 rows affected, 1 warning (0.00 sec)
③新建無密碼用戶u3且授權
mysql> grant all on *.* to 'u3'@'%' with grant option;
Query OK, 0 rows affected, 1 warning (0.01 sec)
4、廢除(revoke)權限
語法:
REVOKE
priv_type [(column_list)]
[, priv_type [(column_list)]] ...
ON [object_type] priv_level
FROM user [, user] ...
REVOKE ALL PRIVILEGES, GRANT OPTION
FROM user [, user] ...
REVOKE PROXY ON user
FROM user [, user] ...
基本格式:revoke 權限類型 on [對象類型] 權限級別(庫表) from user;
mysql> revoke all on *.* from 'u3'@'%';
# Tips 注意:
使用 grant、revoke 的時候都會修改 user 數據表,也會同步修改內存中的 hash 結構,即時生效,也就沒有必要跟着執行 flush privileges 命令;
flush privileges 使用場景:加載用戶權限。直接使用 DML 操作系統權限表,會導致權限數據跟內存中的權限數據不一致,這時就是需要使用 flush privileges 重建內存數據,達到權限一致狀態。
