用户管理
用户信息存储在mysql.user表中
MySQL用户
MySQL是一个多用户数据库, 具有功能强大的访问控制功能。
使用过程中可以为不同用户分配不同的权限。
root用户是超级管理员, 拥有所有权限, 包括创建用户,,删除用户 和修改用户密码等管理权限。
为了实际项目的需要, 可以创建拥有不同权限的普通用户。
创建用户
CREATE USER 'username'@'hostname' IDENTIFIED BY 'password'
# 例:CREATE USER 'tom'@'localhost' IDENTIFIED BY '123456'
查询用户
SELECT user,host FROM mysql.user;
# 例: SELECT user,host FROM mysql.user WHERE user='tom';
重命名用户
RENAME USER 'tom'@'localhost' TO 'jerry'@'localhost'
删除用户
DROP USER 'jerry'@'localhost'
修改用户密码
# 使用 SET PASSWORD 命令:
SET PASSWORD FOR 'username'@'hostname' = PASSWORD('new_password');
# 使用 ALTER USER 命令:
ALTER USER 'username'@'hostname' IDENTIFIED BY 'new_password';
## 注意,在使用 SET PASSWORD 命令时,需要在 MySQL 5.7.6 之前的版本中使用旧密码哈希函数(OLD_PASSWORD()),而在 MySQL 5.7.6 及以后的版本中则使用新密码哈希函数(PASSWORD())。而使用 ALTER USER 命令时则不需要考虑这个问题。
权限管理
MySQL权限
MySQL权限就是MySQL允许做权限以内的事情
比如:
只允许执行SELECT操作, 那么久不能执行UPDATA操作
只允许从192.168.4.5主机连接那么久不能从192.168.4.5以外的其他主机连接MySQL
MySQL权限两阶段验证
第一阶段
服务器首先会检查是否允许连接
第二阶段
如果能连接, MySQL会检查发出的每个请求, 查看是否有足够的权限实施
查看用户权限
SHOW GRANTS FOR 'username'@'hostname';
授予用户权限
语法: GRANT 权限 ON 库名.表名 TO用户
# 授予指定单个权限
GRANT SELECT ON project1.* TO 'tom'@'localhost';
# 授予指定多个权限
GRANT INSERT,UPDATE,DELETE ON project1.* TO 'tom'@'localhost';
# 授予用户所有权限
GRANT ALL PRIVILEGES ON project2.* TO 'tom'@'localhost';
撤销用户授权
语法: REVOKE 权限 ON 库,.表 FROM 用户@地址
# 削减用户拥有的所有权限
REVOKE ALL PRIVILEGES ON project2.* FROM 'tom'@'localhost';
MySQL权限管理原则
授予满足用户需求的最小权限
创建用户时指定用户登录的主机范围
初始化数据库时删除没有密码的用户
为每个用户设置满足复杂度要求的密码
定期清理了不需要的用户
定期回收用户不需要的权限
MySQL用户权限分布
用户相关
MySQL的用户信息记录在mysql.user表
权限相关
全局权限记录在mysql.user表
完整库权限记录在mysal.db中
完整表权限记录在musql.tables_priv表
指定字段权限记录在mysql.tables_prv和mysql.columns_priv表
# 查看用户信息
DESC mysql.user;
CREATE USER 'jerry'@'localhost' IDENTIFIED BY '123456';
SELECT user,host,authentication_string FROM mysql.user WHERE user='jerry';
SHOE GRANTS FOR 'jerry'@'localhost';
MySQL用户全局权限
GRANT SELECT ON*.* TO 'jerry'@'localhost';
SHOW GRANTS FOR 'jerry'@'localhost';
SELECT * FROM mysql.user WHERE user='jerry';
MySQL 用户指定库权限
GRANT INSERT ON project1.* TO 'jerry'@'localhost';
SHOW GRANTS FOR 'jerry'@'localhost';
SELECT * FROM mysql.db WHERE user='jerrt';
MySQL用户指定表权限
CREATE DATABASE project1;
CREATE TABLE project1.user(
id INT NULL PRIMARY KEY AUTO_INCREMENT,
name CHAR(50) NOT NULL DEFAULT '',
age TINYINT UNSIGNED NOT NULL DEFAULT 18,
class CHAR(9) NOT NULL DEFAULT 'NSDVN2502'
)ENGINT=InnoDB,CHARSET='utf8';
# 查看用户指定表权限
GRANT DELETE ON project1.user TO 'jerry'@'localhost';
SHOW GRANTS FOR 'jerry'@'localhost';
SELECT * FROM mysql.tables_priv WHERE user='jerry';
MySQL用户指定表字段权限
GRANT UPDATE(name.age) ON project1.user TO 'jerry'@'localhost';
SHOW GRANTS FOR 'jerry'@'localhost';
SELECT * FROM mysql.tables_priv WHERE user='jerry';
SELECT * FROM mysql.columns_priv EHERE user='jerry';
评论区