【MySQL】用户和权限管理

目录

[1. 用户与账号管理](#1. 用户与账号管理)

[1.1 查看用户](#1.1 查看用户)

[1.2 创建用户](#1.2 创建用户)

[1.3 修改密码](#1.3 修改密码)

[1.4 删除用户](#1.4 删除用户)

[2. 权限与授权](#2. 权限与授权)

[2.1 MySQL支持的权限列表](#2.1 MySQL支持的权限列表)

[2.2 show 查看用户权限](#2.2 show 查看用户权限)

[2.3 grant 授予权限](#2.3 grant 授予权限)

[2.4 revoke 回收权限](#2.4 revoke 回收权限)


1. 用户与账号管理

1.1 查看用户

a. 用户信息的存放

MySQL数据库管理系统的用户信息保存在mysql数据库 中的user表中。

查看所有数据库:

sql 复制代码
show databases;

查看mysql数据库中表:

sql 复制代码
use mysql;  
show tables;     

b. 查看用户信息

数据库默认初始有4个用户: mysql.infoschema、mysql.session、mysql.sys、root

【注意:这4个用户千万不能删除!!!】

其中root是 MySQL 的超级管理员账户,拥有所有数据库的完全控制权限。在user表中可以查看所有的用户:

sql 复制代码
注意:\G要在命令行工具才能使用
select host, user, authentication_string from user\G  

\G的作用是以行的形式展示列中的数据:

  • user:⽤户名
  • host:允许登录的主机。如果是localhost,表⽰只能从本机登陆。
  • authentication_string:加密后的⽤户密码

除了这3种属性,user表还能查到用户的权限:

Y表示该用户拥有权限,N表示没有权限。root账户拥有所有的权限。

1.2 创建用户

语法:

create user [ if not exists ] '用户名'@'可登录的主机IP' identified by '密码明文';

  • 用户名要用单引号包裹,区分大小写(与字符集校验规则无关)。
  • 主机的IP地址要单引号包裹。
  • 密码要用单引号包裹。MySQL 8.0 默认启用密码验证策略,要求:[至少8位长度] [包含大小写字母、数字、特殊字符]
  • 新创建出来的用户是没有任何权限的,需要手动授权。

a. 可填写的主机地址

1. 通配符%

  • %表示所有主机都可以连接到数据库 。强烈建议不要这样设置,因为会导致严重的安全问题。
  • 如果不指定主机IP (只有用户名,也没@符 ),那么就相当于使用了**'user_name'@'%'**。
  • user_name和host_name分别⽤单引号包裹,如果写成 'user_name@host_name' ,相当于使用了 'user_name@host_name'@'%'

2. 通过子网掩码CIDR表示法设置主机范围:

  • 198.0.0.0 / 255.0.0.0 或 198.0.0.0 / 24:可连接 198 A段⽹络中的任意⼀台主机。
  • 198.51.0.0 / 255.255.0.0 或 198.51.0.0 / 16:可连接 198.51 B段⽹络中的任意⼀台主机。
  • 198.51.100.0 / 255.255.255.0 或 198.51.100.0 / 8:可连接 198.51.100 C段⽹络中的任意⼀台主机。
  • 198.51.100.1:只包含特定IP地址的主机,这里只能连接 198.51.100.1 D段网络中的主机。
  • localhost:它表示只有本机才允许登录,相当于IP地址127.0.0.1
  1. 允许在IP地址中使用%通配符 。⽐如, 198.51.100.% 匹配 198.51.100 C段⽹络中的任何主机。MySQL8.0.35中已弃⽤(虽然支持该语法,但是很少用了),以后可能会删除。

b. 示例

-- 例1:添加一个名为bit的新用户,只允许从本机登录

sql 复制代码
# 密码我设置为123456
create user 'bit'@'localhost' identified by '123456'; 
select host, user, authentication_string from user;

-- 例2:添加⼀个名为bit1的新用户,允许从192.168.1.1/24网段登录

sql 复制代码
create user 'bit1'@'192.168.1.1/24' identified by '123456';
select host, user, authentication_string from user;

1.3 修改密码

语法:

有三种方式:

  1. alter user '用户名'@'可登录的主机IP' identified by '新密码';
  2. set password for '用户名'@'可登录的主机IP' = '新密码';
  3. set password = '新密码';
  • 前两种方式都可以为指定的用户修改密码,第3种方式只能为当前登录的用户设置密码。
  • 如果是修改其他用户的密码,那么当前登录的用户必须要有相应的权限 ,通常需要CREATE USER 权限。
  • 必须把 '用户名'@'主机IP' 写全,否则 MySQL 会认为是操作 '用户名'@'%',这可能导致意外的安全问题和数据丢失

-- 示例:用root账户把bit1的密码改成'654321'

修改前:

sql 复制代码
ALTER USER 'bit1'@'192.168.1.1/24' IDENTIFIED BY '654321';

修改后:

1.4 删除用户

语法:

drop user [ if exists ] '用户名'@'可登录的主机IP' [ ,... ];

  • 可以同时删除多个用户,每个账户用逗号隔开。
  • 删除用户需要有相应的权限,通常是 CREATE USER 权限。
  • 可以自己删除自己,不过也需要当前登录的账户具有相应的权限,但是这种行为不推荐。
  • 必须把 '用户名'@'主机IP' 写全,否则 MySQL 会认为是操作 '用户名'@'%',这可能导致意外的安全问题和数据丢失。

-- 示例:删除用户bit1

删除前:

sql 复制代码
drop user if exists 'bit1'@'192.168.1.1/24';

删除后:'bit1'@'192.168.1.1/24' 已经不存在了。

2. 权限与授权

2.1 MySQL支持的权限列表

MySQL的权限系统非常精细,可以根据不同的层级进行控制。下面这个表格汇总了MySQL中常见的权限及其主要作用范围:

数据库对象层级

权限名称 主要作用范围 简要说明
ALLALL PRIVILEGES 全局 授予除GRANT OPTION之外的所有权限。
ALTER 全局、数据库、表 允许修改表或索引结构。
ALTER ROUTINE 全局、数据库 允许修改或删除存储过程和函数。
CREATE 全局、数据库、表 允许创建数据库和表。
CREATE ROLE 全局 允许创建角色。
CREATE ROUTINE 全局、数据库 允许创建存储过程和函数。
CREATE TEMPORARY TABLES 全局、数据库 允许使用CREATE TEMPORARY TABLE创建临时表。
CREATE USER 全局 允许执行CREATE USERDROP USERRENAME USERREVOKE ALL PRIVILEGES等账户操作。
CREATE VIEW 全局、数据库 允许创建或修改视图。
DELETE 全局、数据库、表 允许从数据库表中删除数据。
DROP 全局、数据库、表 允许删除数据库、表和视图。
DROP ROLE 全局 允许删除角色。
EVENT 全局、数据库 允许为事件调度器创建、修改或删除事件。
EXECUTE 全局、数据库 允许执行存储过程和函数。
FILE 全局 允许执行SELECT ... INTO OUTFILELOAD DATA INFILE等文件操作。
GRANT OPTION 全局、数据库、表、列、存储过程 允许将自己拥有的权限授予其他用户(或从其他用户回收)。
INDEX 全局、数据库、表 允许创建或删除索引。
INSERT 全局、数据库、表、列 允许向数据库表中插入数据。
LOCK TABLES 全局、数据库 允许使用LOCK TABLES语句显式锁定表。
PROCESS 全局 允许使用SHOW PROCESSLIST查看所有进程(包括其他用户的)。
REFERENCES 全局、数据库、表 允许创建外键约束。
RELOAD 全局 允许执行FLUSH操作(如FLUSH TABLES等)。
REPLICATION CLIENT 全局 允许查询主/从服务器状态。
REPLICATION SLAVE 全局 允许从服务器从主服务器读取二进制日志。
SELECT 全局、数据库、表、列 允许从数据库表中查询数据。
SHOW DATABASES 全局 允许使用SHOW DATABASES查看所有数据库列表。
SHOW VIEW 全局、数据库 允许使用SHOW CREATE VIEW查看视图定义。
SHUTDOWN 全局 允许执行mysqladmin shutdown关闭数据库。
SUPER 全局 允许执行管理操作(如CHANGE MASTER TOKILLPURGE LOGS等)。
TRIGGER 全局、数据库、表 允许创建、删除或执行触发器。
UPDATE 全局、数据库、表、列 允许更新数据库表中的数据。
USAGE 全局 无任何权限,仅用于创建能登录的用户。
  • 如果用户含有的权限是ALL,意味着他拥有除 grant option 之外的所有权限。
  • 如果用户唯一 的权限是USAGE,意味着他没有任何权限。

2.2 show 查看用户权限

除了通过查看user表中的字段信息可以得知用户权限,还可以通过 show 关键字来直接显示用户拥有的权限

语法:

show grants for '用户名'@'可登录的主机IP';

-- 示例:新创建的用户没有任何权限​

在user表直接查看用户信息和权限表格:

sql 复制代码
SELECT * FROM user WHERE user = 'bit' and host = 'localhost';

从图中可以看到,bit用户所有 "_priv" 列的值都为N,也就是没有任何权限。

通过user表来查看用户权限表格,这样显示出来的内容太多了,很难一眼就确定用户拥有哪些权限,所以我们换一种方法。

通过show语法直接显示用户拥有的权限:

sql 复制代码
show grants for 'bit'@'localhost';

可以看到,bit用户拥有的权限类型是usage,也就是没有任何权限。

以bit用户的身份登录mysql

USAGE权限下只能查看系统数据库 ,不能查看用户数据库,而 information_schema和 performance_schema 都是系统数据库。系统数据库中的表存储着元数据 ,这些元数据即使是USAGE权限的用户也是++可以通过select查询++的。

2.3 grant 授予权限

语法:

grant 权限类型1 [,权限类型2... ] on 权限等级(范围) to '用户名'@'可登录的主机IP' [ with grant option ];

  • 可以同时授予多种权限给同一个用户,每种权限用逗号隔开。且每种权限的所在的权限层级都相同
  • 权限等级的限定有3种:(注意库名与表名之间有个小点 )
    • 全局权限:*.* :表示所有数据库下的所有表
    • 数据库级权限:
      • db_name.* :表示指定数据库下的所有表
      • * :表示作用于当前数据库,即当前数据库下的所有表 。使用前最好先用 use 关键字来确定当前所使用的数据库。
    • 表级权限:
      • db_name.tbl_name :表示指定数据库下的指定表
      • tbl_name :表示当前数据库下的指定表 。使用前最好先用 use 关键字来确定当前所使用的数据库。
  • [ with grant option ] :可选项,允许用户将⾃⼰的权限授权给其它用户。只有权限的最初源头,才有权签发 WITH GRANT OPTION 。从 root 那里获得此资格的用户,只是一个"执行者 ",而非"签发者"。

-- 例1:使用root用户把SELECT 权限给予bit用户,作用范围是test1数据库下的所有表

sql 复制代码
grant SELECT on test1.* to 'bit'@'localhost';
show grants for 'bit'@'localhost';

此时在以bit用户的身份查看数据库,可以发现多了一个test1的数据库

-- 例2:使用root用户把ALL权限给予bit用户,作用范围是test1数据库下的所有表

由于SELECT权限是ALL权限的子集,所以授予ALL权限后,不再显示SELECT权限:

sql 复制代码
grant ALL on test1.* to 'bit'@'localhost';
show grants for 'bit'@'localhost';

2.4 revoke 回收权限

语法:

revoke [ if exists ] 权限类型1 [,权限类型2... ] on 权限范围 from '用户名1'@'主机1' [,'用户名2'@'主机2'... ];

  • 可以同时从多个用户身上回收多个权限。如果不使用 if exists 的话,必须保证权限列表、用户列表 和 权限范围 3者都互相对应。

  • 普通用户的权限回收是"纵向的"和"直接的" ,只能作用于自己的直接下游 。遵循 **"谁授予,谁回收"**的原则,不能对 "自己下属的下属" 进行回收操作。

  • root用户的权限回收是**"全局的"和"任意的"**,可以作用于任何用户,并能触发级联效应。

    • 级联效应: 当回收一个用户的权限时,如果该用户的这个权限是其他下级用户权限的唯一来源,则会把下级用户的相同类型权限一并回收

    • 【由root用户触发,与下级用户的权限类型有关,与下级用户权限的作用范围无关。

    • 【如果不是唯一来源,那么该下级用户的权限不会被回收。

-- 例1:回收bit用户的SELECT权限

sql 复制代码
revoke if exists SELECT on test1.* from 'bit'@'localhost';
show grants for 'bit'@'localhost';

ALL权限除去SELECT权限,剩下以下权限:

-- 例2:回收bit用户的所有权限

虽然bit用户已经没有ALL权限了,但是直接对ALL权限进行回收就能把它的子集权限也回收掉:

sql 复制代码
revoke if exists ALL on test1.* from 'bit'@'localhost';
show grants for 'bit'@'localhost';

本期分享完毕,感谢大家的支持Thanks♪(・ω・)ノ

相关推荐
有味道的男人1 小时前
速卖通商品详情接口(速卖通API系列)
java·大数据·数据库
沐夜听风1 小时前
MySQL的主从---1
数据库·mysql·主从原理
1***35771 小时前
SQL之CASE WHEN用法详解
数据库·python·sql
lnnn~1 小时前
2025美亚杯个人赛WP
数据库·网络安全
数据库学啊1 小时前
物联网(IoT)项目,时序数据库选型推荐哪个?
数据库·物联网·时序数据库
k***45991 小时前
C#数据库操作系列---SqlSugar完结篇
网络·数据库·c#
小时候的阳光2 小时前
使用Docker版Percona Xtrabackup备份恢复MySQL8.0.x
mysql·docker·备份·xtrabackup
Maỿbe2 小时前
MySQL索引失效的情况
mysql
shykevin2 小时前
Actix-Web完整项目实战:博客 API
前端·数据库·oracle