MySQL權(quán)限管理

MySQL中的賬號(hào)與權(quán)限管理

權(quán)限系統(tǒng)的工作原理

MySQL權(quán)限系統(tǒng)通過(guò)下面兩個(gè)階段進(jìn)行認(rèn)證:

  1. 對(duì)連接的用戶進(jìn)行身份認(rèn)證,合法的用戶通過(guò)認(rèn)證奴璃、不合法的用戶拒絕連接悉默。
  2. 對(duì)通過(guò)認(rèn)證的合法用戶賦予相應(yīng)的權(quán)限,用戶可以在這些權(quán)限范圍內(nèi)對(duì)數(shù)據(jù)庫(kù)做相應(yīng)的操作苟穆。

對(duì)于身份抄课,MySQL是通過(guò)IP地址用戶名聯(lián)合進(jìn)行確認(rèn)的,例如MySQL安裝默認(rèn)創(chuàng)建的用戶root@localhost表示用戶root只能從本地(localhost)進(jìn)行連接才可以通過(guò)認(rèn)證雳旅,此用戶從其他任何主機(jī)對(duì)數(shù)據(jù)庫(kù)進(jìn)行的連接都將被拒絕跟磨。也就是說(shuō),同樣的一個(gè)用戶名岭辣,如果來(lái)自不同的IP地址吱晒,則MySQL將其視為不同的用戶。

MySQL的權(quán)限表在數(shù)據(jù)庫(kù)啟動(dòng)地時(shí)候就載入內(nèi)存沦童,當(dāng)用戶通過(guò)身份認(rèn)證后仑濒,就在內(nèi)存中進(jìn)行相應(yīng)權(quán)限的存取,這樣偷遗,此用戶就可以在數(shù)據(jù)庫(kù)中做權(quán)限范圍內(nèi)的各種操作了墩瞳。

權(quán)限表

系統(tǒng)會(huì)用到名叫“mysql”數(shù)據(jù)庫(kù)(安裝MySQL時(shí)被創(chuàng)建)中user表作為權(quán)限表

我們看看user表的結(jié)構(gòu)(注:本文示例使用的是MySQL5.7.25版本)

mysql> desc user;
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Field                  | Type                              | Null | Key | Default               | Extra |
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
| Host                   | char(60)                          | NO   | PRI |                       |       |
| User                   | char(32)                          | NO   | PRI |                       |       |
| Select_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Insert_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Update_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Delete_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Create_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Drop_priv              | enum('N','Y')                     | NO   |     | N                     |       |
| Reload_priv            | enum('N','Y')                     | NO   |     | N                     |       |
| Shutdown_priv          | enum('N','Y')                     | NO   |     | N                     |       |
| Process_priv           | enum('N','Y')                     | NO   |     | N                     |       |
| File_priv              | enum('N','Y')                     | NO   |     | N                     |       |
| Grant_priv             | enum('N','Y')                     | NO   |     | N                     |       |
| References_priv        | enum('N','Y')                     | NO   |     | N                     |       |
| Index_priv             | enum('N','Y')                     | NO   |     | N                     |       |
| Alter_priv             | enum('N','Y')                     | NO   |     | N                     |       |
| Show_db_priv           | enum('N','Y')                     | NO   |     | N                     |       |
| Super_priv             | enum('N','Y')                     | NO   |     | N                     |       |
| Create_tmp_table_priv  | enum('N','Y')                     | NO   |     | N                     |       |
| Lock_tables_priv       | enum('N','Y')                     | NO   |     | N                     |       |
| Execute_priv           | enum('N','Y')                     | NO   |     | N                     |       |
| Repl_slave_priv        | enum('N','Y')                     | NO   |     | N                     |       |
| Repl_client_priv       | enum('N','Y')                     | NO   |     | N                     |       |
| Create_view_priv       | enum('N','Y')                     | NO   |     | N                     |       |
| Show_view_priv         | enum('N','Y')                     | NO   |     | N                     |       |
| Create_routine_priv    | enum('N','Y')                     | NO   |     | N                     |       |
| Alter_routine_priv     | enum('N','Y')                     | NO   |     | N                     |       |
| Create_user_priv       | enum('N','Y')                     | NO   |     | N                     |       |
| Event_priv             | enum('N','Y')                     | NO   |     | N                     |       |
| Trigger_priv           | enum('N','Y')                     | NO   |     | N                     |       |
| Create_tablespace_priv | enum('N','Y')                     | NO   |     | N                     |       |
| ssl_type               | enum('','ANY','X509','SPECIFIED') | NO   |     |                       |       |
| ssl_cipher             | blob                              | NO   |     | NULL                  |       |
| x509_issuer            | blob                              | NO   |     | NULL                  |       |
| x509_subject           | blob                              | NO   |     | NULL                  |       |
| max_questions          | int(11) unsigned                  | NO   |     | 0                     |       |
| max_updates            | int(11) unsigned                  | NO   |     | 0                     |       |
| max_connections        | int(11) unsigned                  | NO   |     | 0                     |       |
| max_user_connections   | int(11) unsigned                  | NO   |     | 0                     |       |
| plugin                 | char(64)                          | NO   |     | mysql_native_password |       |
| authentication_string  | text                              | YES  |     | NULL                  |       |
| password_expired       | enum('N','Y')                     | NO   |     | N                     |       |
| password_last_changed  | timestamp                         | YES  |     | NULL                  |       |
| password_lifetime      | smallint(5) unsigned              | YES  |     | NULL                  |       |
| account_locked         | enum('N','Y')                     | NO   |     | N                     |       |
+------------------------+-----------------------------------+------+-----+-----------------------+-------+
45 rows in set (0.00 sec)

當(dāng)用戶進(jìn)行連接的時(shí)候,權(quán)限表的存取過(guò)程有以下現(xiàn)個(gè)階段氏豌。

  • 先從user表中的Host喉酌、Userauthentication_string(密碼)泵喘、password_expiredpassword_lifetime這幾個(gè)字段中判斷連接的IP泪电、用戶名和密碼是否存在于表中,如果存在纪铺,則通過(guò)身份驗(yàn)證相速,否則拒絕連接。
  • 如果驗(yàn)證通過(guò)鲜锚,再通過(guò)以_priv結(jié)尾的那些枚舉字段(這些都是用戶的權(quán)限開關(guān)(Y/N))得到用戶擁有的權(quán)限突诬。

賬號(hào)管理

賬號(hào)管理主要包括賬號(hào)的創(chuàng)建、權(quán)限更改和賬號(hào)的刪除芜繁。用戶連接數(shù)據(jù)庫(kù)的第一步都從賬號(hào)創(chuàng)建開始旺隙。

有兩種方法可以用來(lái)創(chuàng)建賬號(hào):使用GRANT語(yǔ)法創(chuàng)建或者直接操作授權(quán)表,但更推薦使用第一種方法骏令,因?yàn)椴僮骱?jiǎn)單蔬捷,出錯(cuò)幾率更少。

我們用幾個(gè)例子來(lái)說(shuō)明吧:

  1. 創(chuàng)建用戶

    創(chuàng)建用戶tom伏社,權(quán)限為可以在所有數(shù)據(jù)庫(kù)上執(zhí)行所有權(quán)限抠刺,只能從本地進(jìn)行連接塔淤。

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

    如果你執(zhí)行這個(gè)語(yǔ)句碰到以下錯(cuò)誤:ERROR 1819 (HY000): Your password does not satisfy the current policy requirements。這個(gè)是密碼策略的問(wèn)題速妖,請(qǐng)?jiān)O(shè)置比較復(fù)雜的密碼高蜂,或者修改密碼策略,這里就不詳細(xì)說(shuō)了罕容。

    GRANT命令說(shuō)明:

    ALL PRIVILEGES是表示所有權(quán)限备恤,你也可以使用select、update等權(quán)限锦秒。

    ON用來(lái)指定權(quán)限針對(duì)哪些庫(kù)和表露泊,格式是數(shù)據(jù)庫(kù)名.表名类嗤,這里*.*表示所有數(shù)據(jù)庫(kù)和所有表巾钉。

    TO 表示將權(quán)限賦予某個(gè)用戶。tom@localhost瞪浸,表示tom用戶生真,@后面接限制的主機(jī)沉噩,可以是IPIP段柱蟀、域名以及%川蒙,%表示任何地方。注意:這里%有的版本不包括本地长已,以前碰到過(guò)給某個(gè)用戶設(shè)置了%允許任何地方登錄畜眨,但是在本地登錄不了,這個(gè)和版本有關(guān)系术瓮,遇到這個(gè)問(wèn)題再加一個(gè)localhost的用戶就可以了康聂。

    IDENTIFIED BY 指定用戶的登錄密碼, 這里'tompassword'就是用戶tom的密碼胞四。

    WITH GRANT OPTION 這個(gè)選項(xiàng)表示該用戶可以將自己擁有的權(quán)限授權(quán)給別人早抠。注意:經(jīng)常有人在創(chuàng)建操作用戶的時(shí)候不指定WITH GRANT OPTION選項(xiàng)導(dǎo)致后來(lái)該用戶不能使用GRANT命令創(chuàng)建用戶或者給其它用戶授權(quán)。

    備注:可以使用GRANT重復(fù)給用戶添加權(quán)限撬讽,權(quán)限疊加,比如你先給用戶添加一個(gè)select權(quán)限悬垃,然后又給用戶添加一個(gè)insert權(quán)限游昼,那么該用戶就同時(shí)擁有了select和insert權(quán)限。

    使用GRANT操作用戶權(quán)限之后尝蠕,再使用FLUSH PRIVILEGES命令來(lái)刷新權(quán)限使其立即生效

    mysql> FLUSH PRIVILEGES;
    Query OK, 0 rows affected (0.00 sec)
    
  2. 查看用戶的權(quán)限

    直接使用SHOW GRANTS默認(rèn)查看root@localhost的權(quán)限

    mysql> SHOW GRANTS;
    +---------------------------------------------------------------------+
    | Grants for root@localhost                                           |
    +---------------------------------------------------------------------+
    | GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION |
    | GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION        |
    +---------------------------------------------------------------------+
    2 rows in set (0.01 sec)
    

    查看某個(gè)用戶的權(quán)限

    mysql> SHOW GRANTS FOR tom@localhost;
    +----------------------------------------------------------------------+
    | Grants for tom@localhost                                           |
    +----------------------------------------------------------------------+
    | GRANT ALL PRIVILEGES ON *.* TO 'tom'@'localhost' WITH GRANT OPTION |
    +----------------------------------------------------------------------+
    1 row in set (0.00 sec)
    
  3. 收回權(quán)限

    mysql> REVOKE DELETE ON *.* FROM 'tom'@'localhost';
    Query OK, 0 rows affected (0.00 sec)
    
  4. 對(duì)用戶賬戶重命名

    mysql> RENAME USER tom@localhost to jerry@localhost;
    Query OK, 0 rows affected (0.00 sec)
    
  5. 刪除用戶

    mysql> DROP USER jerry@localhost;
    Query OK, 0 rows affected (0.01 sec)
    
  6. 修改和重置密碼

    • SET PASSWORD命令修改密碼
    mysql> SET PASSWORD FOR root@localhost = PASSWORD('123456');
    Query OK, 0 rows affected, 1 warning (0.01 sec)
    
    • 直接修改user表
    mysql> UPDATE user SET authentication_string=PASSWORD('123456root') WHERE user='root' and host='localhost';
    Query OK, 1 row affected, 1 warning (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 1
    
    mysql> FLUSH PRIVILEGES;
    Query OK, 0 rows affected (0.00 sec)
    
    • 在未登錄mysql的情況下用mysqladmin命令修改密碼
    $ mysqladmin -uroot -p123456root password 123321
    
    • 在丟失root密碼的時(shí)候
      關(guān)閉mysql服務(wù)(根據(jù)你自己的操作系統(tǒng)自行關(guān)閉)烘豌,然后跳過(guò)權(quán)限認(rèn)證啟動(dòng)mysql服務(wù)
    $ mysqld_safe --skip-grant-tables &   
    

    無(wú)密碼登陸

    $ mysql -uroot
    

    進(jìn)入之后使用上面直接修改user表的方法修改root用戶的密碼

    最后殺掉mysqld_safemysqld的進(jìn)程

    重新啟動(dòng)mysql服務(wù),用新的密碼登陸吧看彼。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末廊佩,一起剝皮案震驚了整個(gè)濱河市囚聚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌标锄,老刑警劉巖顽铸,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異料皇,居然都是意外死亡谓松,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門践剂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)鬼譬,“玉大人逊脯,你說(shuō)我怎么就攤上這事巩螃。” “怎么了?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵艘蹋,是天一觀的道長(zhǎng)宅荤。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么掩蛤? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任蜈亩,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好钟哥,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布吁恍。 她就那樣靜靜地躺著,像睡著了一般播演。 火紅的嫁衣襯著肌膚如雪冀瓦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天写烤,我揣著相機(jī)與錄音咕幻,去河邊找鬼。 笑死顶霞,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播选浑,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼蓝厌,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了古徒?” 一聲冷哼從身側(cè)響起拓提,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎隧膘,沒想到半個(gè)月后代态,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡疹吃,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年蹦疑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片萨驶。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡歉摧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出腔呜,到底是詐尸還是另有隱情叁温,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布核畴,位于F島的核電站膝但,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏谤草。R本人自食惡果不足惜跟束,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望咖刃。 院中可真熱鬧泳炉,春花似錦、人聲如沸嚎杨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)枫浙。三九已至刨肃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間箩帚,已是汗流浹背真友。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留紧帕,地道東北人盔然。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓桅打,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親愈案。 傳聞我的和親對(duì)象是個(gè)殘疾皇子挺尾,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • MySQL 權(quán)限經(jīng)驗(yàn)原則:權(quán)限控制主要是出于安全因素,因此需要遵循一下幾個(gè)經(jīng)驗(yàn)原則:只授予能滿足需要的最小權(quán)限站绪,防...
    盤木閱讀 620評(píng)論 0 0
  • 1遭铺,MySQL權(quán)限體系 mysql 的權(quán)限體系大致分為5個(gè)層級(jí): 全局層級(jí): 全局權(quán)限適用于一個(gè)給定服務(wù)器中的所有...
    不排版閱讀 945評(píng)論 0 4
  • 一. MySQL密碼的恢復(fù)方法之一 如果忘記了MySQL的root密碼,可以用以下方法重新設(shè)置: 1. KILL掉...
    不排版閱讀 534評(píng)論 0 1
  • 什么是數(shù)據(jù)庫(kù)恢准? 數(shù)據(jù)庫(kù)是存儲(chǔ)數(shù)據(jù)的集合的單獨(dú)的應(yīng)用程序魂挂。每個(gè)數(shù)據(jù)庫(kù)具有一個(gè)或多個(gè)不同的API,用于創(chuàng)建馁筐,訪問(wèn)涂召,管理...
    chen_000閱讀 4,035評(píng)論 0 19
  • 轉(zhuǎn):https://blog.csdn.net/anzhen0429/article/details/763590...
    SkTj閱讀 1,348評(píng)論 0 6