这是一张表格,表格有三列,分别是“User”(用户)、“Host”(主机)和“authentication_string”(认证字符串,也就是密码相关的内容)。这张表可能来自于MySQL的“mysql.user”系统表,这个表存储了所有MySQL用户的信息。
2. 列内容详细讲解
- **User列**
- 这里列出了不同的用户名,比如“root”、“mysql.session”、“mysql.sys”、“user”和“teacher”。
- “root”是MySQL中超级管理员用户,拥有最高权限,可以对数据库进行任何操作,比如创建新用户、创建数据库、删除数据等。
- “mysql.session”和“mysql.sys”是MySQL内部系统用户,用于管理数据库的会话和系统相关操作,一般不用于日常操作。
- “user”和“teacher”看起来像是自定义用户,可能是为特定应用或人员创建的具有特定权限的用户。
- **Host列**
- 这个列表示用户可以从哪个主机连接到MySQL数据库。
- “localhost”表示用户只能从本地(也就是安装MySQL的这台机器)连接到数据库。
- “%”是一个通配符,表示“root”用户可以从任何主机连接到数据库,这可能存在安全风险,如果安全设置不当,外部网络的攻击者可能尝试从远程连接到数据库。
- **authentication_string列**
- 这个列存储了用户的密码(以加密形式)。
- 对于“mysql.session”和“mysql.sys”用户,密码显示为“*THISISNOTAVALIDPASSWORDTHATCANBEUSEDHERE”,这意味着这些用户的密码不是通过常规方式设置的,可能是由MySQL内部机制管理的。
- 其他用户有一长串看似随机的字符,这是经过加密后的密码。例如“root”用户在本地(localhost)的密码加密后是“*57237BB49761F29AB9724BA084E811D70C12393D”,这是为了安全存储用户密码,防止密码泄露。
3. 实际意义和应用
- 数据库管理员会使用这些信息来管理用户权限。比如,如果要限制“root”用户只能从本地登录,可以修改“root”用户对应的“Host”值。
- 当创建新用户时,也会在这个表中添加新的记录。例如,如果要创建一个新的应用用户“app_user”,就会在“User”列添加“app_user”,在“Host”列指定允许连接的主机,在“authentication_string”列设置加密后的密码。
- 同时,这张表也涉及到数据库的安全。管理员需要确保只有授权的用户能够访问数据库,并且密码足够安全,防止被破解。
总之,这张表是MySQL数据库安全和用户管理的核心部分,它决定了谁能访问数据库,从哪里访问,以及使用什么密码访问。
问题:为什么需要创建 MySQL 用户?
想象一下,幼儿园有一个玩具柜:
- 园长:可以打开所有柜子,拿走或添加任何玩具(root 用户)。
- 普通老师:只能打开指定的柜子,拿特定的玩具(普通用户)。
- 小朋友:只能玩老师发的玩具,不能打开柜子(受限用户)。
为什么要这样?
- 安全:不让所有人都有最高权限。
- 责任分离:不同的人负责不同的工作。
创建普通用户的步骤
1. 使用 root 用户登录 MySQL
mysql -u root -p
# 输入 root 密码后进入 MySQL 命令行
2. 创建新用户
-- 创建一个名为 'teacher' 的用户,密码是 'ToyKey123'
-- 这个用户只能从本地连接(localhost)
CREATE USER 'teacher'@'localhost' IDENTIFIED BY 'ToyKey123';
代码解释:
CREATE USER 'teacher'@'localhost'
:创建名为teacher
的用户,只能从本地连接。IDENTIFIED BY 'ToyKey123'
:设置用户密码为ToyKey123
。
3. 授予权限
-- 授予 teacher 用户对 'kindergarten' 数据库的所有权限
GRANT ALL PRIVILEGES ON kindergarten.* TO 'teacher'@'localhost';
-- 只授予 SELECT 权限(只读)
GRANT SELECT ON kindergarten.* TO 'teacher'@'localhost';
-- 刷新权限使变更生效
FLUSH PRIVILEGES;
权限示例:
权限类型 | 作用 |
---|---|
ALL PRIVILEGES | 所有权限(创建表、删除数据等) |
SELECT | 只读权限 |
INSERT | 插入数据权限 |
UPDATE | 更新数据权限 |
DELETE | 删除数据权限 |
CREATE | 创建表、数据库权限 |
用户和权限的底层原理
1. MySQL 用户表
MySQL 将用户信息存储在 mysql.user
表中:
-- 查看所有用户
SELECT User, Host, authentication_string FROM mysql.user;
2. 权限表
MySQL 使用多个权限表记录权限:
mysql.user
:全局权限(如创建用户)。mysql.db
:数据库级权限(如对kindergarten
数据库的权限)。mysql.tables_priv
:表级权限(如对toys
表的权限)。mysql.columns_priv
:列级权限(如只对price
列的权限)。
使用场景示例
1. PHP 连接 MySQL 使用普通用户
<?php
// 使用 'teacher' 用户连接 MySQL
$servername = "localhost";
$username = "teacher";
$password = "ToyKey123";
$dbname = "kindergarten";
// 创建连接
$conn = new mysqli($servername, $username, $password, $dbname);
// 检查连接
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error);
}
// 执行查询(假设 teacher 用户只有 SELECT 权限)
$sql = "SELECT * FROM toys";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
// 输出数据
while($row = $result->fetch_assoc()) {
echo "玩具: " . $row["name"]. " - 价格: " . $row["price"]. "<br>";
}
} else {
echo "0 结果";
}
// 关闭连接
$conn->close();
?>
2. 创建更安全的用户
-- 创建一个只能从 web 服务器连接的用户
CREATE USER 'web_app'@'192.168.1.100' IDENTIFIED BY 'SecurePass456';
-- 只授予对 products 表的 SELECT 和 INSERT 权限
GRANT SELECT, INSERT ON store.products TO 'web_app'@'192.168.1.100';
FLUSH PRIVILEGES;
总结
为什么要创建普通用户?
- 安全:不让所有人都有最高权限,就像不让小朋友随便打开玩具柜。
- 责任分离:不同的用户负责不同的工作,例如 web 应用只需要读写特定表的权限。
创建用户的步骤:
CREATE USER
:创建用户并指定连接来源。GRANT
:授予适当的权限。FLUSH PRIVILEGES
:刷新权限表。
简单来说:
- 创建用户就像给不同的人发不同的钥匙,有的人只能开前门,有的人只能开玩具柜,这样更安全!