?? manual_privilege_system.html
字號:
<td><code>Db</code> </td>
<td><code>Db</code> </td>
</tr>
<tr>
<td></td>
<td><code>User</code> </td>
<td><code>User</code> </td>
</tr>
<tr>
<td></td>
<td><code>Table_name</code> </td>
<td><code>Table_name</code> </td>
</tr>
<tr>
<td></td>
<td></td>
<td><code>Column_name</code> </td>
</tr>
<tr>
<td><strong>權限字段</strong> </td>
<td><code>Table_priv</code> </td>
<td><code>Column_priv</code> </td>
</tr>
<tr>
<td></td>
<td><code>Column_priv</code> </td>
<td></td>
</tr>
<tr>
<td><strong>其他字段</strong> </td>
<td><code>Timestamp</code> </td>
<td><code>Timestamp</code> </td>
</tr>
<tr>
<td></td>
<td><code>Grantor</code> </td>
<td></td>
</tr>
</table>
<p>每個授權表包含范圍字段和權限字段。 </p>
<p>范圍字段決定表中每個條目的范圍,即,條目適用的上下文。例如,
一個<code>user</code>表條目的<code>Host</code>和<code>User</code>值為<code>'thomas.loc.gov'</code>和<code>'bob'</code>將被用于證實來自主機<code>thomas.loc.gov</code>的<code>bob</code>對服務器的連接。同樣,一個<code>db</code>表條目的<code>Host</code>、<code>User</code>和<code>Db</code>字段的值是<code>'thomas.loc.gov'</code>、<code>'bob'</code>和<code>'reports'</code>將用在<code>bob</code>從主機聯接<code>thomas.loc.gov</code>存取<code>reports</code>數據庫的時候。
<code>tables_priv</code>和<code>columns_priv</code>表包含范圍字段,指出每個條目適用的表或表/列的組合。
</p>
<p><a NAME="IDX129"></a>對于檢查存取的用途,比較<code>Host</code>值是忽略大小寫的。<code>User</code>、<code>Passwor</code>d、<code>Db</code>和<code>Table_name</code>值是區分大小寫的。<code>Column_name</code>值在<strong>MySQL</strong>3.22.12或以后版本是忽略大小寫的。
</p>
<p>權限字段指出由一個表條目授予的權限,即,可實施什么操作。服務器組合各種的授權表的信息形成一個用戶權限的完整描述。為此使用的規則在<a HREF="manual_Privilege_system.html#Request_access">6.8 存取控制, 階段2:請求證實</a>描述。</p>
<p>范圍字段是字符串,如下所述;每個字段的缺省值是空字符串: </p>
<table BORDER="manual_Privilege_system.html#Request_access" WIDTH="100%" NOSAVE="#101090">
<tr>
<td><strong>字段名</strong> </td>
<td><strong>類型</strong> </td>
</tr>
<tr>
<td><code>Host</code> </td>
<td><code>CHAR(60)</code> </td>
</tr>
<tr>
<td><code>User</code> </td>
<td><code>CHAR(16)</code> </td>
</tr>
<tr>
<td><code>Password</code> </td>
<td><code>CHAR(16)</code> </td>
</tr>
<tr>
<td><code>Db</code> </td>
<td><code>CHAR(64)</code> </td>
<td>(<code>tables_priv</code>和<code>columns_priv</code>表為<code>CHAR(60)</code>)</td>
</tr>
</table>
<p>在<code>user</code>、<code>db</code>和<code>host</code>表中,所有權限字段被聲明為<code>ENUM('N','Y')</code>--每一個都可有值<code>'N'</code>或<code>'Y'</code>,并且缺省值是<code>'N'</code>.
</p>
<p>在<code>tables_priv</code>和<code>columns_priv</code>表中,權限字段被聲明為<code>SET</code>字段:
</p>
<table BORDER="manual_Privilege_system.html#Request_access" WIDTH="100%" NOSAVE="#101090">
<tr>
<td><strong>表名</strong> </td>
<td><strong>字段名</strong> </td>
<td><strong>可能的集合成員</strong> </td>
</tr>
<tr>
<td><code>tables_priv</code> </td>
<td><code>Table_priv</code> </td>
<td><code>'Select', 'Insert', 'Update', 'Delete', 'Create', 'Drop', 'Grant', 'References',
'Index', 'Alter'</code> </td>
</tr>
<tr>
<td><code>tables_priv</code> </td>
<td><code>Column_priv</code> </td>
<td><code>'Select', 'Insert', 'Update', 'References'</code> </td>
</tr>
<tr>
<td><code>columns_priv</code> </td>
<td><code>Column_priv</code> </td>
<td><code>'Select', 'Insert', 'Update', 'References'</code> </td>
</tr>
</table>
<p>簡單地說,服務器使用這樣的授權表:
<ul>
<li><code>user</code>表范圍字段決定是否允許或拒絕到來的連接。對于允許的連接,權限字段指出用戶的全局(超級用戶)權限。
</li>
<li><code>db</code>和<code>host</code>表一起使用: <ul>
<li><code>db</code>表范圍字段決定用戶能從哪個主機存取哪個數據庫。權限字段決定允許哪個操作。
</li>
<li>當你想要一個給定的<code>db</code>條目應用于若干主機時,<code>host</code>表作為<code>db</code>表的擴展被使用。例如,如果你想要一個用戶能在你的網絡從若干主機使用一個數據庫,在用戶的<code>db</code>表的<code>Host</code>條目設為空值,然后將那些主機的每一個移入<code>host</code>表。這個機制詳細描述在<a HREF="manual_Privilege_system.html#Request_access">6.8 存取控制, 階段2:請求證實</a>。
</li>
</ul>
</li>
<li><code>tables_priv</code>和<code>columns_priv</code>表類似于<code>db</code>表,但是更精致:他們在表和列級應用而非在數據庫級。
</li>
</ul>
<p>注意管理權限(<strong>reload</strong>, <strong>shutdown</strong>, 等等)僅在<code>user</code>表中被指定。這是因為管理性操作是服務器本身的操作并且不是特定數據庫,因此沒有理由在其他授權表中列出這樣的權限。事實上,只需要請教<code>user</code>表來決定你是否執行一個管理操作。
</p>
<p><strong>file</strong>權限也僅在<code>user</code>表中指定。它不是管理性權限,但你讀或謝在服務器主機上的文件的的能力獨立于你正在存取的數據庫。
</p>
<p>當<code>mysqld</code>服務器啟動時,讀取一次授權表內容。對授權表的更改生效在<a HREF="manual_Privilege_system.html#Privilege_changes">6.9 權限更改何時生效</a>描述。
</p>
<p>當你修改授權表的內容時,確保你按你想要的方式更改權限設置是一個好主意。為幫助診斷問題,見<a HREF="manual_Privilege_system.html#Access_denied">6.13 “存取拒絕引起<code>”</code>錯誤的原因</a>。對于安全問題上的忠告,見<a HREF="manual_Privilege_system.html#Security">6.14 怎么對使MySQL安全對抗解密高手</a>。
</p>
<p>一個有用的診斷工具是<code>mysqlaccess</code>腳本,由Carlier Yves
提供給<strong>MySQL</strong>分發。使用<code>--help</code>選項調用<code>mysqlaccess</code>查明它怎樣工作。注意:<code>mysqlaccess</code>僅用<code>user</code>、<code>db</code>和<code>host</code>表僅檢查存取。它不檢查表或列級權限。
</p>
<h2><a NAME="Connection_access" HREF="manual_toc.html#Connection_access">6.7 存取控制,
階段1:連接證實</a></h2>
<p>當你試圖聯接一個<strong>MySQL</strong>服務器時,服務器基于你的身份和你是否能通過供應正確的口令驗證身份來接受或拒絕連接。如果不是,服務器完全具結你的存取,否則,服務器接受連接,然后進入階段2并且等待請求。
</p>
<p>你的身份基于2個信息:
<ul>
<li>你從那個主機連接</li>
<li>你的<strong>MySQL</strong>用戶名</li>
</ul>
<p>身份檢查使用3個<code>user</code>表(<code>Host</code>, <code>User</code>和<code>Password</code>)范圍字段執行。服務器只有在一個<code>user</code>表條目匹配你的主機名和用戶名并且你提供了正確的口令時才接受連接。
</p>
<p>在<code>user</code>表范圍字段可以如下被指定:
<ul>
<li>一個<code>Host</code>值可以是主機名或一個IP數字,或<code>'localhost'</code>指出本地主機。
</li>
<li><a NAME="IDX130"></a>你可以在<code>Host</code>字段里使用通配符字符<samp>“%”</samp>和<samp>“_”</samp>。
</li>
<li>一個<code>Host</code>值<code>'%'</code>匹配任何主機名,一個空白<code>Host</code>值等價于<code>'%'</code>。注意這些值匹配<em>能創建一個連接到你的服務器的任何主機!</em>
</li>
<li><a NAME="IDX131"></a>通配符字符在<code>User</code>字段中不允許,但是你能指定空白的值,它匹配任何名字。如果<code>user</code>表匹配到來的連接的條目有一個空白的用戶名,用戶被認為是匿名用戶(沒有名字的用戶),而非客戶實際指定的名字。這意味著一個空白的用戶名被用于在連接期間的進一步的存取檢查(即,在階段2期間)。
</li>
<li><code>Password</code>字段可以是空白的。這不意味著匹配任何口令,它意味著用戶必須不指定一個口令進行連接。
</li>
</ul>
<p><a NAME="IDX132"></a>非空白<code>Password</code>值代表加密的口令。 <strong>MySQL</strong>不以任何人可以看的純文本格式存儲口令,相反,正在試圖聯接的一個用戶提供的口令被加密(使用<code>PASSWORD()</code>函數),并且與存儲了<code>user</code>表中的已經加密的版本比較。如果他們匹配,口令是正確的。
</p>
<p>下面的例子顯示出各種<code>user</code>表中<code>Host</code>和<code>User</code>條目的值的組合如何應用于到來的連接:
</p>
<table BORDER="IDX132" WIDTH="100%" NOSAVE="#101090">
<tr>
<td><code>Host</code> <strong>值</strong> </td>
<td><code>User</code> <strong>值</strong> </td>
<td><strong>被條目匹配的連接</strong> </td>
</tr>
<tr>
<td><code>'thomas.loc.gov'</code> </td>
<td><code>'fred'</code> </td>
<td><code>fred</code>, 從<code>thomas.loc.gov</code> 連接</td>
</tr>
<tr>
<td><code>'thomas.loc.gov'</code> </td>
<td><code>''</code> </td>
<td>任何用戶, 從<code>thomas.loc.gov</code>連接 </td>
</tr>
<tr>
<td><code>'%'</code> </td>
<td><code>'fred'</code> </td>
<td><code>fred</code>, 從任何主機連接</td>
</tr>
<tr>
<td><code>'%'</code> </td>
<td><code>''</code> </td>
<td>任何用戶, 從任何主機連接</td>
</tr>
<tr>
<td><code>'%.loc.gov'</code> </td>
<td><code>'fred'</code> </td>
<td><code>fred</code>, 從在<code>loc.gov</code>域的任何主機連接</td>
</tr>
<tr>
<td><code>'x.y.%'</code> </td>
<td><code>'fred'</code> </td>
<td><code>fred</code>, 從<code>x.y.net</code>、<code>x.y.com</code>,<code>x.y.edu</code>等聯接。(這或許無用)</td>
</tr>
<tr>
<td><code>'144.155.166.177'</code> </td>
<td><code>'fred'</code> </td>
<td><code>fred</code>, 從<code>有144.155.166.177</code> IP 地址的主機連接</td>
</tr>
<tr>
<td><code>'144.155.166.%'</code> </td>
<td><code>'fred'</code> </td>
<td><code>fred</code>, 從<code>144.155.166</code> C類子網的任何主機連接</td>
</tr>
</table>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -