MySql-權限管理

在mysql數據庫中,有mysql_install_db腳本初始化權限表,存儲權限的表有:

  1. user表
  2. db表
  3. host表
  4. table_priv表
  5. columns_priv表
  6. proc_priv表

MySQL存取控制包含2個階段:
階段1:服務器檢查你是否允許連接。
這裏寫圖片描述

階段2:假定你能連接,服務器檢查你發出的每個請求。看你是否有足夠的權限實施它。例如,如果你從數據庫中一個表精選(select)行或從數據庫拋棄一個表,服務器確定你對錶有select權限或對數據庫有drop權限。
這裏寫圖片描述

服務器在存取控制的兩個階段使用在mysql的數據庫中的user、db和host表表示,
表名稱 user db host
範圍字段 Host Host Host
User Db Db
Password User

表名稱 user db host
範圍字段 host,use,password host,db,user host,db

權限的鍵以 _priv 結尾:
這裏寫圖片描述

使用CREATE語句創建新用戶

CREATE USER user[IDENTIFIED BY [PASSWORD] 'password'],
[user[IDENTIFIED BY [PASSWORD] 'password']]...

創建用戶

CREATE USER 'admin'@'%' IDENTIFIED BY 'admin'

授予權限

grant all privileges on *.* to admin@% identified by ' admin';
flush privileges;

使用GRANT語句創建新用戶
GRANT USER語句可以用來創建帳戶,通過該語句可以在user表中添加一條新記錄
比起CREATE USER語句創建的新用戶,還需要使用GRANT語句

賦予用戶權限
使用GRANT語句創建新用戶時必須有GRANT權限。

GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ...
    ON [object_type] {tbl_name | * | *.* | db_name.*}
    TO user [IDENTIFIED BY [PASSWORD] 'password']
        [, user [IDENTIFIED BY [PASSWORD] 'password']] ...
    [REQUIRE
        NONE |
        [{SSL| X509}]
        [CIPHER 'cipher' [AND]]
        [ISSUER 'issuer' [AND]]
        [SUBJECT 'subject']]
    [WITH with_option [with_option] ...]

使用GRANT語句創建一個新用戶testUser,密碼爲testpwd,並授予用戶對所有數據表的SELECT和UPDATE權限

GRANT SELECT ,UPDATE ON *.* TO 'testUser'@'localhost' identified BY 'testpwd'
SELECT `Host` ,`User` ,`Select_priv` ,`Update_priv`  FROM mysql.user WHERE `User` ='testUser';

執行結果顯示執行成功,使用SELECT語句查詢用戶testUser的權限
Select ‘Host’,’User’,’Select_priv’,’Update_priv’ from mysql user where ‘User’ = ‘testUser’;

root用戶密碼丟失的解決辦法
使用–skip-grant-tables選項啓動MYSQL服務
使用–skip-grant-tables選項啓動MYSQL時,服務器將不加載權限判斷,任何用戶都能訪問數據庫

LINUX下
使用mysqld_safe來啓動MYSQL服務,也可以使用/etc/init.d/mysql命令來啓動mysql

mysqld_safe --skip-grant-tables user=mysql

或者

/etc/init.d/mysql start-mysqld --skip-grant-tables

啓動MYSQL服務後,就可以使用root用戶登錄了

權限管理
MYSQL中的各種權限
對於GRANT和REVOKE語句,priv_type可以被指定爲以下任何一種:

權限 意義
ALL [PRIVILEGES] 設置除GRANT OPTION之外的所有簡單權限
ALTER 允許使用ALTER TABLE
ALTER ROUTINE 更改或取消已存儲的子程序
CREATE 允許使用CREATE TABLE
CREATE ROUTINE 創建已存儲的子程序
CREATE TEMPORARY TABLES 允許使用CREATE TEMPORARY TABLE
CREATE USER 允許使用CREATE USER, DROP USER, RENAME USER和REVOKE ALL PRIVILEGES。
CREATE VIEW 允許使用CREATE VIEW
DELETE 允許使用DELETE
DROP 允許使用DROP TABLE
EXECUTE 允許用戶運行已存儲的子程序
FILE 允許使用SELECT…INTO OUTFILE和LOAD DATA INFILE
INDEX 允許使用CREATE INDEX和DROP INDEX
INSERT 允許使用INSERT
LOCK TABLES 允許對您擁有SELECT權限的表使用LOCK TABLES
PROCESS 允許使用SHOW FULL PROCESSLIST
REFERENCES 未被實施
RELOAD 允許使用FLUSH
REPLICATION CLIENT 允許用戶詢問從屬服務器或主服務器的地址
REPLICATION SLAVE 用於複製型從屬服務器(從主服務器中讀取二進制日誌事件)
SELECT 允許使用SELECT
SHOW DATABASES SHOW DATABASES 顯示所有數據庫
SHOW VIEW 允許使用SHOW CREATE VIEW
SHUTDOWN 允許使用mysqladmin shutdown
SUPER 允許使用CHANGE MASTER, KILL, PURGE MASTER LOGS和SET GLOBAL語句,mysqladmin debug命令;允許您連接(一次),即使已達到max_connections。
UPDATE 允許使用UPDATE
USAGE “無權限”的同義詞
GRANT OPTION 允許授予權限

當從舊版本的MySQL升級時,要使用EXECUTE, CREATE VIEW, SHOW VIEW, CREATE USER, CREATE ROUTINE和ALTER ROUTINE權限

授權
授權就是爲某個用戶授予權限
授予的權限可以分爲多個層級:
全局層級
全局權限適用於一個給定服務器中的所有數據庫。這些權限存儲在mysql.user表中。GRANT ALL ON .和REVOKE ALL ON .只授予和撤銷全局權限。
數據庫層級
數據庫權限適用於一個給定數據庫中的所有目標。這些權限存儲在mysql.db和mysql.host表中。GRANT ALL ONdb_name.和REVOKE ALL ON db_name.只授予和撤銷數據庫權限。
表層級
表權限適用於一個給定表中的所有列。這些權限存儲在mysql.talbes_priv表中。GRANT ALL ON db_name.tbl_name和REVOKE ALL ON db_name.tbl_name只授予和撤銷表權限。
列層級
列權限適用於一個給定表中的單一列。這些權限存儲在mysql.columns_priv表中。當使用REVOKE時,您必須指定與被授權列相同的列。
子程序層級
CREATE ROUTINE, ALTER ROUTINE, EXECUTE和GRANT權限適用於已存儲的子程序。這些權限可以被授予爲全局層級和數據庫層級。而且,除了CREATE ROUTINE外,這些權限可以被授予爲子程序層級,並存儲在mysql.procs_priv表中。

當後續目標是一個表、一個已存儲的函數或一個已存儲的過程時,object_type子句應被指定爲TABLE、FUNCTION或PROCEDURE。當從舊版本的MySQL升級時,要使用本子句,您必須升級您的授權表

收回權限
收回權限就是取消已經賦予用戶的某些權限。收回用戶不必要的權限可以在一定程度上保證系統的安全性。
使用REVOKE收回權限之後,用戶帳戶的記錄將從db、host、tables_priv、columns_priv表中刪除,但是用戶帳號記錄依然
在user表中保存。

REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ...
    ON [object_type] {tbl_name | * | *.* | db_name.*}
    FROM user [, user] ... 
REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...

使用REVOKE語句,必須擁有mysql數據庫的全局CREATE權限或UPDATE權限
使用REVOKE語句取消用戶grantUser的INSERT權限

REVOKE INSERT ON *.* FROM 'grantUser'@'localhost';

注意:當從舊版本的MYSQL升級時,如果要使用EXECUTE、CREATE VIEW、SHOW VIEW、CREATE USER、CREATE ROUTINE、ALTER ROUTINE權限,必須先升級授權表

查看權限
SHOW GRANT語句可以顯示用戶的權限信息

show grants FOR 'user'@'host';
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章