📄 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 + -