MySQL資料庫許可權體系入門(2)---建立使用者

junsansi發表於2010-09-16

二、許可權授予與回收

  MySQL中對於使用者許可權的授予和解除比較靈活,即可以通過專用命令,也可以通過直接操作字典表來實現,正所謂條條道路通目標。不過話說回來,修的馬路多不叫奇蹟,何況在這片神奇的土地,奇蹟這個詞本身就是奇蹟,因此三思真是不好意思用奇蹟這樣的詞來形容:這樣想像不到的不平凡的事(注,該段描述為現代漢語詞典中關於奇蹟一詞的解釋),因此,我決定用一種加強的語氣來描述我的感受:

  • 比奇蹟更神奇的是,這條條大路居然都修成了高速路;
  • 比神奇的奇蹟更神奇的是,這些高速居然都是免費的;
  • 比神奇的神奇奇蹟更神奇,那就是神蹟啊,額地神哪,免費的高速居然也不堵車,這肯定不是二環三環和四環,當然跟急吧(G8)線應該也沒啥關係,至少也是十八環外了,弟兄們,走吧,跟著三思去溜達溜達~~~

    提示:

    基於合適的使用者做符合其許可權的事的目地,執行與許可權相關操作的使用者當然也得有許可權,預設就是root了,該使用者為安裝MySQL資料庫時自動建立,需要注意MySQL資料庫的使用者跟作業系統使用者沒有任何關係,也就是說此root非彼root,本例中所做的使用者管理操作,均是使用mysql中的root使用者執行。

2.1 建立使用者

  MySQL中專用的建立使用者命令是CREATE USER,該命令語法如下:

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

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

  例如,先按照最簡單的方式建立一個名為jss的使用者:

    mysql> create user jss;

    Query OK, 0 rows affected (0.01 sec)

    mysql> select user,host,password from user where user='jss';

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

    | user | host | password |

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

    | jss  | %    |          |

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

    1 row in set (0.00 sec)

  這樣建立的使用者,可以從任意安裝了mysql客戶端,並能夠訪問目標伺服器的機器上建立連線,無須密碼。

  例如,從ip:10.0.0.99的客戶端執行連線:

    E:\MySQL\MySQL Server 5.1\bin>mysql -ujss -h 172.16.1.110

    Welcome to the MySQL monitor.  Commands end with ; or \g.

    Your MySQL connection id is 126

    Server version: 5.1.49-community MySQL Community Server (GPL)

    Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.

    This software comes with ABSOLUTELY NO WARRANTY. This is free software,

    and you are welcome to modify and redistribute it under the GPL v2 license

    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

    mysql> select user();

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

    | user()        |

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

    | jss@10.0.0.99 |

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

    1 row in set (0.00 sec)

  因為前面建立使用者時指定的密碼為空,因此連線時不必指定密碼即可成功建立連線。

  如果希望使用者連線時,必須指定密碼,那就可以在建立使用者時,通過指定identified by子句來設定密碼,例如:

    mysql> create user jss_ps identified by 'jss';

    Query OK, 0 rows affected (0.00 sec)

    mysql> select user,host,password from user where user='jss_ps';

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

    | user   | host | password                                  |

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

    | jss_ps | %    | *284578888014774CC4EF4C5C292F694CEDBB5457 |

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

    1 row in set (0.00 sec)

    提示:

    Mysql中使用者的密碼是通過md5加密過的,如果希望在指定密碼時,直接指定加密後的形式,可以通過identified by password ''子句,自行嘗試吧。

  這樣,當使用jss_ps使用者登陸時,就必須指定密碼,否則連線就會報錯,例如:

    E:\MySQL\MySQL Server 5.1\bin>mysql -ujss_ps -h 172.16.1.110

    ERROR 1045 (28000): Access denied for user 'jss_ps'@'10.0.0.99' (using password: NO)

  指定密碼後再次連線:

    E:\MySQL\MySQL Server 5.1\bin>mysql -ujss_ps -p -h 172.16.1.110

    Enter password: ***

    Welcome to the MySQL monitor.  Commands end with ; or \g.

    Your MySQL connection id is 131

    Server version: 5.1.49-community MySQL Community Server (GPL)

    Copyright (c) 2000, 2010, Oracle and/or its affiliates. All rights reserved.

    This software comes with ABSOLUTELY NO WARRANTY. This is free software,

    and you are welcome to modify and redistribute it under the GPL v2 license

    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

    mysql>

  如果希望指定的使用者只能從某臺指定的域(domain)或主機訪問,可以在建立使用者時指定host,例如,指定使用者只能從10.0.0.99訪問,執行命令如下:

    mysql> create user jss_ip@10.0.0.99 identified by password '*284578888014774CC4EF4C5C292F694CEDBB5457';

    Query OK, 0 rows affected (0.00 sec)

    mysql> select user,host,password from user where user like 'jss%';

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

    | user   | host      | password                                  |

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

    | jss    | %         |                                           |

    | jss_ps | %         | *284578888014774CC4EF4C5C292F694CEDBB5457 |

    | jss_ip | 10.0.0.99 | *284578888014774CC4EF4C5C292F694CEDBB5457 |

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

    3 rows in set (0.00 sec)

  從任意非10.0.0.99的主機上執行連線會告知沒有許可權,例如:

    [root@rhel5u3 ~]# mysql -ujss_ip -p -h 172.16.1.110

    Enter password: 

    ERROR 1045 (28000): Access denied for user 'jss_ip'@'172.16.1.131' (using password: YES)

  綜述:

  上面建立的三個使用者:

  • jss:可以無須密碼從任何主機使用jss使用者訪問資料庫;
  • jss_ps:從任何主機連線使用jss_ps的使用者都可以訪問資料庫;
  • jss_ip:只有從10.0.0.99連線過來的使用者才能訪問資料庫。

  CREATE USER只是建立使用者的高速路之一,如果你覺著這條道路實在太過平坦,路邊風景太過平淡,行程太過平常,不妨在抵達目的地之前,拐彎嘗試一下grant 大道,飽覽不一樣的風景。

  Grant命令並非本小節重點,這裡僅簡要描述一下其語句中與使用者相關的部分:

    GRANT priv_clause TO user [IDENTIFIED BY [PASSWORD] 'password']

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

  看起來使用者部分,跟create user是差不多的,事實上當然不是差不多,根本就是一模一樣嘛,下面舉個例子,操作如下:

    mysql> grant select on mysql.user to jss_grant@10.0.0.99 identified by 'jss';

    Query OK, 0 rows affected (0.00 sec)

    mysql> select user,host,password from user where user ='jss_grant';

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

    | user      | host      | password                                  |

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

    | jss_grant | 10.0.0.99 | *284578888014774CC4EF4C5C292F694CEDBB5457 |

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

    1 row in set (0.00 sec)

  上述語句在實現了前面第3個例子(建立使用者jss_ip)的功能外,還額外授予了jss_grant使用者查詢mysql.user表的許可權。MySQL的開發團隊靠著永不屈服、永不放棄、永不退縮、永不言敗的奮爭精神,用智慧和巧妙的構思完美複製了ORACLE GRANT語句的功能,這是全世界默默無聞的MySQL開發人員長期以來內生品格的自然流露,是全世界默默無聞的MySQL開發人員開拓前進的不竭動力,寫到這兒三思忍不住不感嘆,老美真是不會吹啊,這點兒破事兒要擱中國怕是早就吹成全宇宙軟體史上的奇蹟大書特吹了。

  如果說上述方式覺著都不順手,或者,大腦短路導致短暫忘記了命令的語法,那也沒關係,mysql.user表還記得吧,直接向該字典表中插入記錄(一般insert語法想忘不容易),也是靠譜的,例如:

    mysql> insert into user (host,user,password) values ('%','jss_insert',password('jss'));

    Query OK, 1 row affected, 3 warnings (0.00 sec)

    mysql> select user,host,password from user where user = 'jss_insert';

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

    | user       | host      | password                                  |

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

    | jss_insert | %         | *284578888014774CC4EF4C5C292F694CEDBB5457 |

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

    1 rows in set (0.00 sec)

  看看,效果相同,不僅是看起來相同,實際表現也是一模一樣,這點跟ORACLE資料庫就截然不同了,ORACLE這類資料庫是絕對不建議使用者修改字典表的,而且一般情況下也不知道都應該改哪些地方(沒錯,完全可能不止一處需要修改),因此對於ORACLE資料庫,最安全最穩妥也最快捷的方式還是老老實實按照ORACLE提供的命令進行操作,而MySQL則完全不同,官方不僅完全不介意使用者通過操作字典表的方式進行功能修改(想想也是,連軟體都是開源的,在這種地方設什麼障礙也沒有意義),甚至鼓勵通過這種方式,話說回來,截止到MySQL5.1版本,都沒有提供alter user的語法,因此如果想對使用者做修改,update mysql.user表就算是比較便捷的方式了。

    提示:

    • 注意MySQL中使用者名稱密碼的大小寫都是敏感的,也就是使用者JSS和jss是兩個不同的使用者喲;
    • 使用者名稱長度不超過16個字元;
    • MySQL資料庫的使用者跟作業系統使用者沒有任何關係,就算你在其中發現一個叫root甚至mysql的,那也說明不了什麼;
    • password()是MySQL資料庫提供的函式,專門用來做密碼加密;
    • []的意思是可選,[,]的意思是可指定多個該引數。

=======================================

檢視之前的連載:

MySQL資料庫許可權體系入門(1)---工作原理

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7607759/viewspace-674167/,如需轉載,請註明出處,否則將追究法律責任。

相關文章