MySQL的使用者設定與授權

2021-08-25 20:37:02 字數 4969 閱讀 3572

摘要:本文介紹了如何建立使用者,如何為使用者分配許可權。grant語句雖然能夠為使用者分配許可權,使用比較方便,但是從安全角度,從增加對系統了解角度,你應該盡量使用直接修改授權表的方法。這樣可以更精確的控制授權,能夠對授權表完全了解,避免因為 grant語句的錯誤,是mysql伺服器的安全性降低。

你可以有2個不同的方法增加使用者:通過使用grant語句或通過直接操作mysql授權表。比較好的方法是使用grant語句,因為他們是更簡明並且好像錯誤少些。

使用show grants語句顯示使用者的授權

你可以直接檢視授權表,也可以使用show grants語句檢視某個使用者的授權,這種情況下使用show grants語句顯然要方便一些。

語法:show grants for user_name

為了容納對任意主機的使用者授予的權利,mysql支援以格式指定user_name值。

例如,下面的語句顯示乙個使用者admin的許可權:

mysql>show grants for ;

其結果為建立該使用者的grnat授權語句:

grant reload, shutdown, process on *.* to identified by password '28e89ebc62d6e19a'

密碼是加密後的形式。

使用grant語句建立使用者並授權

grant語句的語法

grant priv_type (columns)

on what

to user identified by 「password」

with grant option

要使用該語句,需要填寫以下部分:

·priv_type 分配給使用者的許可權。

priv_type可以指定下列的任何乙個:

all privileges      file                reload

alter               index               select

create              insert              shutdown

delete              process             update

drop                references          usage

all是all privileges的乙個同義詞,references還沒被實現,usage當前是「沒有許可權」的乙個同義詞。它能用在你想要建立乙個沒有許可權使用者的時候。

對於表,你能指定的唯一priv_type值是select、insert、update、delete、create、drop、grant、index和alter。

對於列,你能指定的唯一priv_type值是(即,當你使用乙個column_list子句時)是select、insert和update。

·columns 許可權適用的列。

這是可選的,只來設定列專有的許可權。如果命名多於乙個列,則用逗號分開。

·what 許可權應用的級別

grant允許系統主管在4個許可權級別上授權mysql使用者的權利:

·全域性級別

全域性許可權作用於乙個給定伺服器上的所有資料庫。這些許可權儲存在mysql.user表中。 你能通過使用on *.*語法設定全域性許可權

·資料庫級別

資料庫許可權作用於乙個給定資料庫的所有表。這些許可權儲存在mysql.db和mysql.host表中。 你能通過使用on db_name.*語法設定資料庫許可權。如果你指定on *並且你有乙個當前資料庫,你將為該資料庫設定許可權。(警告:如果你指定on *而你沒有乙個當前資料庫,你將影響全域性許可權!)

·表級別

表許可權作用於乙個給定表的所有列。這些許可權儲存在mysql.tables_priv表中。你能透過 on tbl_name,為具體的表名設定許可權。

·列級別

列許可權作用於在乙個給定表的單個列。這些許可權儲存在mysql.columns_priv表中。你可以通過指定乙個columns子句將許可權授予特定的列,同時要在on子句中指定具體的表。

對與乙個表或列的許可權是由4個許可權級別的邏輯或形成的。例如,如果mysql.user表指定乙個使用者有乙個全域性select許可權,它不能被資料庫、表或列的乙個條目否認。

對於乙個列的許可權能如下計算:

global privileges

or (database privileges and host privileges)

or table privileges

or column privileges

在大多數情況下,你只授予使用者乙個許可權級別上的許可權,因此現實通常不象上面所說的那樣複雜。

user 使用許可權的使用者。

為了容納對任意主機的使用者授予的權利,mysql支援以格式指定user_name值。如果你想要指定乙個特殊字元的乙個user字串(例如「-」),或乙個包含特殊字元或萬用字元的host字串(例如「%」),你可以用括號括起能使用者或主機名字 (例如,)。

你能在主機名中指定萬用字元。例如,"適用於在loc.gov域中任何主機的user,並且"適用於在144.155.166類 c 子網中任何主機的user。

簡單形式的user是"的乙個同義詞。注意:如果你允許匿名使用者連線mysql伺服器(它是預設的),你也應該增加所有本地使用者如 ,因為否則,當使用者試圖從本地機器上登入到mysql伺服器時,對於mysql.user表中的本地主機的匿名使用者條目將被使用!匿名使用者通過插入有user=''的條目到mysql.user表中來定義。通過執行這個查詢,你可以檢驗它是否作用於你:

mysql> select host,user from mysql.user where user='';

·password 分配給該使用者的口令。這也是可選的。

警告:如果你創造乙個新使用者但是不指定乙個identified by子句,使用者沒有口令。這是不安全的。

·with grant option子句是可選的。

with grant option子句給與使用者有授予其他使用者在指定的許可權水平上的任何許可權的能力。你應該謹慎對待你授予他grant許可權的使用者,因為具有不同許可權的兩個使用者也許能合併許可權!

建立使用者並授權的例項

mysql>grant all on *.* to identified by "passwd"->with grant option

該語句將在user表中為建立乙個記錄,開啟所有許可權。

資料庫級許可權用乙個on db_name.*子句而不是on *.*進行授權:

mysql>grant all on sample.* to identified by "ruby"

這些許可權不是全域性的,所以它們不儲存在user表中,我們仍然需要在user表中建立一條記錄(使得使用者能連線),但我們也需要建立乙個db表記錄記錄資料庫集的許可權。

直接修改授權表建立使用者並授權

如果你還記得前面的介紹,你應該能即使不用grant語句也能做grant做的事情。記住在你直接修改授權表時,你將通知伺服器過載授權表,否則他不知道你的改變。你可以執行乙個mysqladmin flush-privileges或mysqladmin reload命令和flush privileges語句強迫乙個過載。如果你忘記做這個,你會疑惑為什麼伺服器不做你想做的事情。

下列grant語句建立乙個擁有所有權的超級使用者。包括授權給別人的能力:

grant all on *.* to identified by "passwd" with grant option

該語句將在user表中為建立乙個記錄,開啟所有許可權,因為這裡是超級使用者(全域性)許可權儲存的地方,要用insert語句做同樣的事情,語句是:

insert into user  values("localhost","anyname",password("passwd"),

"y","y","y","y","y","y","y","y","y","y","y","y","y","y")

你可能發現它不工作,這要看你的mysql版本。授權表的結構已經改變而且你在你的user表可能沒有14個許可權列。用show columns找出你的授權表包含的每個許可權列,相應地調整你的insert語句。下列grant語句也建立乙個擁有超級使用者身份的使用者,但是只有乙個單個的許可權:

grant reload on *.* to identified by "flushpass"

本例的insert語句比前乙個簡單,它很容易列出列名並只指定乙個許可權列。所有其它列將設定為預設的"n":

insert into user (host,password,reload) values("localhost","flush",password("flushpass"),"y")

資料庫級許可權用乙個on db_name.*子句而不是on *.*進行授權:

grant all on sample.* to identified by "ruby"

這些許可權不是全域性的,所以它們不儲存在user表中,我們仍然需要在user表中建立一條記錄(使得使用者能連線),但我們也需要建立乙個db表記錄記錄資料庫集許可權:

mysql> insert into user (host,user,password)

-> values("localhost","boris",password("ruby")) ;

mysql> insert into db values

-> ("localhost","sample_db","boris","y","y","y","y","y","y","n","y","y","y");

"n"列是為grant許可權;對末尾的乙個資料庫級具有with grant option的grant語句,你要設定該列為"y"。

要設定表級或列級許可權,你對tables_priv或columns_priv使用insert語句。當然,如果你沒有grant語句,你將沒有這些表,因為它們在mysql中同時出現。如果你確實有這些表並且為了某些原因想要手工操作它們,要知道你不能用單獨的列啟用許可權。

你設定tables_priv.table_priv或columns_priv.column_priv列來設定包含你想啟用的許可權值。例如,要對乙個表啟用select和insert許可權,你要在相關的tables_priv的記錄中設定table_priv為"select,insert"。

MySQL使用者與授權

create user username root identified by password username 你將建立的使用者名稱 root 指定該使用者在哪個主機上可以登陸,如果是本地使用者可用localhost,如果想讓該使用者可以從任意遠端主機登陸,可以使用萬用字元 password 該...

MySQL新增使用者使用者與授權

mysql中新增使用者,新建資料庫,使用者授權,刪除使用者,修改密碼 注意每行後邊都跟個 表示乙個命令語句結束 1.新建使用者 登入mysql mysql u root p 密碼 建立使用者 mysql insert into mysql.user host,user,password values...

mysql 授權 mysql 使用者授權

mysql grant 許可權1,許可權2,許可權n on 資料庫名稱.表名稱 to 使用者名稱 使用者位址 identified by 連線口令 許可權1,許可權2,許可權n代表select,insert,update,delete,create,drop,index,alter,grant,re...