MySQL用戶管理

      MySQL受權系統主要經過五個表(user、db、host、tables_priv和columns_priv)來實現,其中用於訪問數據庫的各類用戶信息都保存在mysql庫的user表中。帳戶權限信息被存儲在mysql數據庫的user、db、host、tables_priv、columns_priv和procs_priv表中。html

      user表——該表決定是否容許用戶鏈接到服務器。若是容許鏈接,權限字段則爲該用戶的全局權限。mysql

      db表——用於決定哪些用戶能夠從哪些主機訪問哪些數據庫。包含在db表中的權限適用於這個表標識的數據庫。sql

      host表——當您想在db表的範圍以內擴展一個條目時,就會用到這個表。舉例來講,若是某個db容許經過多個主機訪問的話,那麼超級用戶就可讓db表內將host列爲空,而後用必要的主機名填充host表。數據庫

      tables_priv表——該表與db表類似,不一樣之處是它用於表而不是數據庫。這個表還包含一個其餘字段類型,包括timestamp和grantor兩個字段,用於存儲時間戳和受權方。在本文後面咱們會對這個表作進一步的講解。服務器

      columns_priv——該表做用幾乎與db和tables_priv表同樣,不一樣之處是它提供的是針對某些表的特定列的權限。ide

權限表的存取過程是:工具

    1)  先從user表中的host、 user、 password這3個字段中判斷鏈接的IP、用戶名、密碼是否存在表中,存在則經過身份驗證;htm

2)   經過權限驗證,進行權限分配時,按照user、db、tables_priv、columns_priv的順序進行分配。即先檢查全局權限表 user,若是user中對應的權限爲Y,則此用戶對全部數據庫的權限都爲Y,將再也不檢查db, tables_priv,columns_priv;若是爲N,則到db表中檢查此用戶對應的具體數據庫,並獲得db中爲Y的權限;若是db中爲N,則檢 查tables_priv中此數據庫對應的具體表,取得表中的權限Y,以此類推。對象

更詳細參考:http://dev.mysql.com/doc/refman/5.1/zh/database-administration.html#what-privileges繼承

 

1.建立用戶

1)        可使用CREATE USER用於建立新的MySQL帳戶, CREATE USER會在沒有權限的mysql.user表中建立一個新記錄。若是 帳戶已經存在,則出現錯誤。

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

        mysql>create user test1@'localhost' identified by '12345';    --test1只能本地訪問
        mysql>create user test2@'%' identified by '12345';              --test2能夠遠程訪問

        mysql>create user test3@’172.21.78.89’ identified by ‘12345’;  --test3僅從172.21.78.89上訪問

                     create user test3@172.21.78.89 identified by ‘12345’;

        mysql>create user test4@172.21.78.% identified by ‘12345’;   --test4能夠從172.21.78.*網段上訪問

 

2)        也可使用grant語句,GRANT語句的主要用途是來給賬戶受權的,但也可用來創建新賬戶並同時受權。

        mysql>grant select,insert,update,delete on mydb.* to test1@localhost identified by "123456";

        能夠在hostname中指定通配符。例如user_name@'%.loc.gov'適用於在loc.gov域中的任何主機的user_name。同時user_name@'144.155.166.%'適用於144.155.166 C級子網中的任何主機的user_name。簡單形式user_name是user_name@'%'的同義詞。

 

3)        能夠直接用INSERT語句建立相同的帳戶,而後使用FLUSH PRIVILEGES告訴服務器重載受權表。

        mysql> insert into mysql.user(Host,User,Password) values("localhost","test3",password("12345"));

        mysql>flush privileges;

第一種和第三種建立用戶後還須要進行受權。

 

2.數據庫用戶受權

        GRANT權限列表 ON 庫名.表名TO 用戶名@來源地址[ IDENTIFIEDBY ‘密碼‘]

使用GRANT語句的注意事項:

■ 權限列表:用於列出受權使用的各類數據庫操做,以逗號分隔。All表示全部權限;

■ 庫名.表名:用於指定受權操做的庫和表的名稱,其中可使用「*」。如:使用「mydb.*」表示受權操做的對象爲mydb庫中的全部表。

■ 用戶名@來源地址:用於指定用戶名稱和容許訪問的客戶機地址,即誰能鏈接、能從哪裏鏈接。來源的地址能夠是域名、IP地址,還可使用「%」通配符,表示某個區域或網段內的全部地址。如:「%.example.com」、「172.168.10.%」等

■ IDENTIFIED BY:設置用戶鏈接數據庫時所使用的密碼字符串。在新建用戶時,若省略則用戶的密碼將爲空。

■ 使用GRANT語句受權的用戶記錄,會保存到mysql庫的user、db、host、tables_priv等。

 

例:添加一個名爲test1的數據庫用戶,並容許其從本機訪問,對mydb庫中的全部表具備查詢權限,驗證密碼爲「12345」。

       mysql> GRANT select ON mydb.* TO 'test1'@'localhost' IDENTIFIED BY '12345';

 

例:增長一個test2用戶,密碼爲12345,能夠在任何主機上登陸,並對全部數據庫有查詢,增長,修改和刪除的功能。

       mysql>grant select, insert, update, delete on *.* to test2@'%' identified by '12345';

 

例:增長一個test3用戶,密碼爲12345,只能在172.21.78.89上登陸,並對mydb數據庫有查詢,增長,修改和刪除的功能。

      mysql>grant select, insert, update, delete on mydb.* to test3@172.21.78.89 identified by '12345';

 

例:受權用戶test4擁有數據庫mydb的全部權限

      mysql>grant all privileges on mydb.* to test4@localhost identified by '12345';

 

例:建立一個只容許從本地登陸的超級用戶test5,並容許將權限賦予別的用戶,密碼爲12345

      mysql>GRANT ALL PRIVILEGES ON *.* TO test5@localhost IDENTIFIED BY '12345' WITH GRANT OPTION;

 

例:建立一個通常應用程序用戶,並只須要SELECT, INSERT, UPDATE, DELETE, CREATE TEMPORARY TABLES等權限,若有存儲過程還須要加上EXECUTE權限。指定登陸網段172.21.78網段。

        mysql>GRANT  USAGE,SELECT, INSERT, UPDATE, DELETE, SHOW VIEW ,CREATE TEMPORARY TABLES,EXECUTE ON mydb.* TO test6@'172.21.78.%' IDENTIFIED BY  '12345';

 

例:建立一個普通用戶(僅有查詢權限)

        mysql>GRANT USAGE,SELECT ON mydb.* TO test7@'172.21.78.%' IDENTIFIED BY  '12345';

 

3.查看用戶權限

        查看服務器庫中全部用戶列表(由於用戶信息保存在mysql.user表中,故可從該表中查看)

mysql> select distinct concat('user:',user,'@',host,':') as query from mysql.user;

+---------------------------+

| query                     |

+---------------------------+

| user:test1@%:             |

| user:test2@%:             |

| user:test3@172.21.78.89: |

| user:test4@172.21.78.%:  |

| user:test5@172.21.78.89:  |

| user:root@localhost:      |

| user:test1@localhost:     |

| user:test2@localhost:     |

+---------------------------+

8 rows in set (0.59 sec)

或者使用 select * from mysql.user 可看到相關權限等信息。

 

查看當前登錄用戶

mysql> select user();

+----------------+

| user()         |

+----------------+

| test2@localhost |

+----------------+

1 row in set (0.00 sec)

    USER()或SYSTEM_USER()   返回當前登錄用戶名

    SESSION_USER()                     和 USER() 具備相同的意義

    SYSTEM_USER()                      和 USER() 具備相同的意義

    CURRENT_USER, CURRENT_USER()    返回當前會話被驗證的用戶名和主機名組合

mysql> select current_user();

+----------------+

| current_user() |

+----------------+

| test2@localhost |

+----------------+

1 row in set (0.00 sec)

 

查看權限:

             SHOW GRANTS 語句: SHOWGRANTSFOR 用戶名@來源地址

例:mysql> show grants for test1;

+------------------------------------------------------------------------------------------------------------------------------+

| Grants for test1@%                                                |

+------------------------------------------------------------------------------------------------------------------------------+

| GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO 'test1'@'%' IDENTIFIED BY PASSWORD '*6BB4837EB74329105EE4568DDA7DC67ED2CA2AD9' |

+------------------------------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

 

mysql> show grants for test2;

+------------------------------------------------------------------------------------------------------+

| Grants for test2@%                       |

+------------------------------------------------------------------------------------------------------+

| GRANT USAGE ON *.* TO 'test2'@'%' IDENTIFIED BY PASSWORD '*00A51F3F48415C7D4E8908980D443C29C69B60C9' |

+------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

 

例:查看用戶test5從主機172.21.78.89訪問數據庫時得受權信息。

mysql> show grants for test5@172.21.78.89;

+-----------------------------------------------------------------------------------------------------------------+

| Grants for test5@172.21.78.89                                  |

+-----------------------------------------------------------------------------------------------------------------+

| GRANT USAGE ON *.* TO 'test5'@'172.21.78.89' IDENTIFIED BY PASSWORD '*00A51F3F

48415C7D4E8908980D443C29C69B60C9' |

+-----------------------------------------------------------------------------------------------------------------+

1 row in set (0.00 sec)

注意:使用show grants for test5查看不到相關信息。

mysql> show grants for test5;

ERROR 1141 (42000): There is no such grant defined for user 'test5' on host '%'

 

4.撤銷權限:

        REVOKE 語句:用於撤銷指定用戶的數據庫權限,撤銷權限後的用戶仍然能夠鏈接到mysql服務器,但將禁止執行對應的數據庫操做:

        格式:REVOKE權限列表ON 數據庫名.表名FROM用戶名@來源地址

        如:撤銷用戶test5從172.21.78.89訪問數據庫的全部權限:

mysql> revoke all on *.* from test5@172.21.78.89;

Query OK, 0 rows affected (0.00 sec)

 

5.刷新權限

        當mysqld服務器啓動時,將受權表的內容讀入到內存中。你能夠經過FLUSH PRIVILEGES語句或執行mysqladmin flush-privilegesmysqladmin reload命令讓它從新讀取表。

        Flush privileges使權限生效,尤爲在對那些權限表user、db、host等作了update或者delete更新的時候。

           mysql>FLUSH PRIVILEGES;

 

6.修改用戶密碼

        可使用mysqladmin工具,格式:mysqladmin -u用戶名 -p舊密碼 password 新密碼

例:給root加個密碼ab12。首先在DOS下進入目錄mysqlbin,而後鍵入如下命令:

             mysqladmin -uroot -password 12345

注:由於開始時root沒有密碼,因此-p舊密碼一項就能夠省略了。

再將root的密碼改成abcde。

             mysqladmin -uroot -12345 password abcde

例:     mysqladmin -utest2 -p12345 password public12

注意,須要相關的權限

 

也可以使用update語句更新:

     mysql>update mysql.user set password=password('123456') where User='test1' and Host='localhost';

     mysql>flush privileges;

 

還可以使用SET PASSWORD命令,

     mysql> SET PASSWORD FOR 'USERNAME'@'HOST'=PASSWORD('NEW_PASSWORD'

    如修改test1 密碼

mysql> set password for test1@localhost = password('public12');

Query OK, 0 rows affected (0.00 sec)

 

7.刪除用戶

        mysql>delete from user where user='test2' and host='localhost';

        mysql>flush privileges;

        注意刪除用戶最好不要使用DELETE直接刪除,由於使用DELETE刪除後用戶的權限並未刪除,新建同名用戶後又會繼承之前的權限。

        正確的作法是使用DROP USER命令刪除用戶,好比要刪除'test'@'172.168.100.%'用戶採用以下命令:

        mysql>DROP USER test3@'172.21.78.89’;  ---- 刪除帳戶及權限

相關文章
相關標籤/搜索