MySQL 用戶名和口令
* MySQL使用於認證目的的用戶名
與Unix用戶名(登錄名字)或Windows用戶名無關
缺省地
大多數MySQL客戶嘗試使用當前Unix用戶名作為MySQL用戶名登錄
但是這僅僅為了方便
客戶程序允許用
u或
user選項指定一個不同的名字
及與安全的考慮
所有的MySQL用戶名都應該有口令
* MySQL用戶名最長可以是
各字符
典型地
Unix用戶名限制為
個字符
* MySQL口令與Unix口令沒關系
* MySQL加密口令使用了一個Unix登錄期間所用的不同算法
PASSWORD()和ENCRYPT()
函數PASSWORD(str)
從純文本口令str計算一個口令字符串
該函數被用於為了在user授權表的Password列中存儲口令而加密MySQL口令
mysql> select PASSWORD(
badpwd
);
>
f
dd
b
PASSWORD()加密是非可逆的
PASSWORD()不以與Unix口令加密的相同的方法執行口令加密
你不應該假定如果你的Unix 口令和你的MySQL口令是一樣的
PASSWORD()將導致與在Unix口令文件存儲的相同的加密值
見ENCRYPT()
ENCRYPT(str[
salt])
使用Unix crypt()系統調用加密str
salt參數應該是一個有
個字符的字符串
(MySQL
中
salt可以長於
個字符
)
mysql> select ENCRYPT(
hello
);
>
VxuFAJXVARROc
如果crypt()在你的系統上不可用
ENCRYPT()總是返回NULL
ENCRYPT()只保留str起始
個字符而忽略所有其他
至少在某些系統上是這樣
這將由底層的crypt()系統調用的行為決定
與MySQL服務器連接
語法格式
shell> mysql [
h host_name][
u user_name][
pyour_pass ]
h
u和
p選項的另一種形式是
host=host_name
user=user_name和
password=your_pass
注意
在
p或
password=與跟隨它後面的口令之間沒有空格
(在命令行上指定一個口令是不安全的!)
對於命令行沒有的聯接參數
mysql使用缺省值
* 缺省主機名是localhost
* 缺省用戶名是你的Unix登錄名
* 如果沒有
p
則沒有提供口令
缺省值參數的指定
在你的主目錄下
f
的配置文件的[client]小節裡指定連接參數
[client]
host=host_name
user=user_name
password=your_pass
注
命令行上被指定的值優先於在配置文件和環境變量中指定的值
最安全的方法是讓客戶程序提示口令或在一個適當保護的
f
文件中指定口令
MySQL提供的權限
權限 列 上下文
select Select_priv 表
insert Insert_priv 表
update Update_priv 表
delete Delete_priv 表
index Index_priv 表
alter Alter_priv 表
create Create_priv 數據庫
表或索引
drop Drop_priv 數據庫或表
grant Grant_priv 數據庫或表
references References_priv 數據庫或表
reload Reload_priv 服務器管理
shutdown Shutdown_priv 服務器管理
process Process_priv 服務器管理
file File_priv 在服務器上的文件存取
注
grant權限允許你把你自己擁有的那些權限授給其他的用戶
file權限給予你用LOAD DATA INFILE和SELECT
INTO OUTFILE語句讀和寫服務器上的文件
任何被授予這個權限的用戶都能讀或寫MySQL服務器能讀或寫的任何文件
存取控制
連接證實
身份檢查使用user表
個(Host
User和Password)范圍字段
服務器只有在一個user表條目匹配你的主機名和用戶名並且你提供了正確的口令時才接受連接
注
一個Host值可以是主機名或一個IP數字
或
localhost
指出本地主機
可以在Host字段裡使用通配符字符
%
和
_
Host值
%
匹配任何主機名
當一個連接被嘗試時
服務器浏覽排序的條目並使用找到的第一個匹配
普遍的誤解是認為
對一個給定的用戶名
當服務器試圖對連接尋找匹配時
明確命名那個用戶的所有條目將首先被使用
這明顯不是事實
存取控制
請求證實
一旦你建立了一個連接
服務器進入階段
對在此連接上進來的每個請求
服務器檢查你是否有足夠的權限來執行它
授權表用GRANT和REVOKE命令操作
GRANT priv_type [(column_list)] [
priv_type [(column_list)]
]
ON {tbl_name | * | *
* | db_name
*}
TO user_name [IDENTIFIED BY
password
]
[
user_name [IDENTIFIED BY
password
]
]
[WITH GRANT OPTION]
REVOKE priv_type [(column_list)] [
priv_type [(column_list)]
]
ON {tbl_name | * | *
* | db_name
*}
FROM user_name [
user_name
]
GRANT在MySQL
或以後版本中實現
對於更早MySQL版本
GRANT語句不做任何事情
GRANT和REVOKE命令允許系統主管在
個權限級別上授權和撤回賦予MySQL用戶的權利
全局級別
全局權限作用於一個給定服務器上的所有數據庫
這些權限存儲在mysql
user表中
數據庫級別
數據庫權限作用於一個給定數據庫的所有表
這些權限存儲在mysql
db和mysql
host表中
表級別
表權限作用於一個給定表的所有列
這些權限存儲在mysql
tables_priv表中
列級別
列權限作用於在一個給定表的單個列
這些權限存儲在lumns_priv表中
user表權限是超級用戶權限
只把user表的權限授予超級用戶如服務器或數據庫主管是明智的
對其他用戶
你應該把在user表中的權限設成
N
並且僅在一個特定數據庫的基礎上授權
使用db和host表
權限更改何時生效
當mysqld啟動時
所有的授權表內容被讀進存儲器並且從那點生效
用GRANT
REVOKE或SET PASSWORD對授權表施行的修改會立即被服務器注意到
如果你手工地修改授權表(使用INSERT
UPDATE等等)
你應該執行一個FLUSH PRIVILEGES語句或運行mysqladmin flush
privileges告訴服務器再裝載授權表
否則你的改變將不生效
除非你重啟服務器
建立初始的MySQL權限
在安裝MySQL後
你通過運行scripts/mysql_install_db安裝初始的存取權限
包含下列權限集合
* MySQL root用戶作為可做任何事情的一個超級用戶
連接必須由本地主機發出
注意
出世的root口令是空的
因此任何人能以root而沒有一個口令進行連接並且被授予所有權限
* 一個匿名用戶
他可對有一個
test
或以
test_
開始的名字的數據庫做任何時期事情
連接必須由本地主機發出
這意味著任何本地用戶能連接並且視為匿名用戶
* 其他權限被拒絕
例如
一般用戶不能使用mysqladmin shutdown或mysqladmin processlist
為MySQL root用戶指定一個口令(注意
你使用PASSWORD()函數指定口令)
shell> mysql
u root mysql
mysql> UPDATE user SET Password=PASSWORD(
new_password
)
WHERE user=
root
;
mysql> FLUSH PRIVILEGES;
在MySQL
和以上版本中
你可以使用SET PASSWORD語句
shell> mysql
u root mysql
mysql> SET PASSWORD FOR root=PASSWORD(
new_password
);
設置口令的另一種方法是使用mysqladmin命令
shell> mysqladmin
u root password new_password
看看scripts/mysql_install_db腳本
看它如何安裝缺省的權限
你可用它作為一個研究如何增加其他用戶的基礎
為了完全重建權限表
刪除在包含mysql數據庫的目錄下所有
*
frm
*
MYI
和
*
MYD
文件
(這是在數據庫目錄下面命名為
mysql
的目錄
當你運行mysqld
help時
它被列出
)然後運行mysql_install_db腳本
可能在首先編輯它擁有你想要的權限之後
向MySQL增加新用戶權限
增加用戶
個不同的方法
通過使用GRANT語句或通過直接操作MySQL授權表
比較好的方法是使用GRANT語句
因為他們是更簡明並且好像錯誤少些
shell> mysql
user=root mysql
mysql> GRANT ALL PRIVILEGES ON *
* TO monty@localhost
IDENTIFIED BY
something
WITH GRANT OPTION;
mysql> GRANT ALL PRIVILEGES ON *
* TO monty@
%
IDENTIFIED BY
something
WITH GRANT OPTION;
mysql> GRANT RELOAD
PROCESS ON *
* TO admin@localhost;
mysql> GRANT USAGE ON *
* TO dummy@localhost;
monty
可以從任何地方連接服務器的一個完全的超級用戶
但是必須使用一個口令(
something
做這個
注意
我們必須對monty@localhost和monty@
%
發出GRANT語句
如果我們增加localhost條目
對localhost的匿名用戶條目在我們從本地主機連接接時由mysql_install_db創建的條目將優先考慮
因為它有更特定的Host字段值
所以以user表排列順序看更早到來
admin
可以從localhost沒有一個口令進行連接並且被授予reload和process管理權限的用戶
這允許用戶執行mysqladmin reload
mysqladmin refresh和mysqladmin flush
*命令
還有mysqladmin processlist
沒有授予數據庫有關的權限
他們能在以後通過發出另一個GRANT語句授權
dummy
可以不用一個口令連接的一個用戶
但是只能從本地主機
全局權限被設置為
N
USAGE權限類型允許你無需權限就可設置一個用戶
它假定你將在以後授予數據庫相關的權限
也可以直接通過發出INSERT語句增加同樣的用戶存取信息
然後告訴服務器再次裝入授權表
shell> mysql
user=root mysql
mysql> INSERT INTO user VALUES(
localhost
monty
PASSWORD(
something
)
Y
Y
Y
From:http://tw.wingwit.com/Article/program/MySQL/201311/29392.html