MySQL用戶認證及權限控制


一、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 重建內存數據,達到權限一致狀態。


免責聲明!

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



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