03_用户与权限管理

本文详细介绍了MySQL用户管理,包括登录、创建、修改、删除用户,以及密码策略、权限分配和角色管理。重点讲解了权限表结构、访问控制流程和角色的使用与权限回收。适合数据库管理员和开发者深入理解MySQL权限系统。
摘要由CSDN通过智能技术生成
1. 用户管理

MySQL用户可以分为普通用户root用户。root用户是超级管理员,拥有所有权限,包括创建用户、删除用户和修改用户的密码等管理权限;普通用户只拥有被授予的各种权限。

MySQL提供了许多语句用来管理用户账号,这些语句可以用来管理包括登录和退出MysQL服务器、创建用户、删除用户、密码管理和权限管理等内容。

MySQL数据库的安全性需要通过账户管理来保证。

1.1 登录MySQL服务器

启动MySQL服务后,可以通过mysql命令来登录MySQL服务器,命令如下:

mysql –h hostname|hostIP –P port –u username –p DatabaseName –e "SQL语句"

在这里插入图片描述
查询完结果后,依旧在用户界面,并没有进入MySQL中

  • -h参数后面接主机名或者主机IP,hostname为主机,hostIP为主机IP。
  • -P参数后面接MySQL服务的端口,通过该参数连接到指定的端口。MySQL服务的默认端口是3306,不使用该参数时自动连接到3306端口,port为连接的端口号。
  • -u参数后面接用户名,username为用户名。
  • -p参数会提示输入密码。
  • DatabaseName参数指明登录到哪一个数据库中。如果没有该参数,就会直接登录到MySQL数据库中,然后可以使用USE命令来选择数据库。
  • -e参数后面可以直接加SQL语句。登录MySQL服务器以后即可执行这个SQL语句,然后退出MySQL服务器。
mysql -uroot -p -hlocalhost -P3306 mysql -e "select host,user from user"
1.2 创建用户

在MySQL数据库中,官方推荐使用CREATE USER语句创建新用户。MysQL 8版本移除了PASSWORD加密方法,因此不再推荐使用INSERT语句直接操作MySQL中的user表来增加用户。

使用CREATE USER语句来创建新用户时,必须拥有CREATE USER权限。每添加一个用户,CREATE USER语句会在MySQL.user表中添加一条新记录,但是新创建的账户没有任何权限。如果添加的账户已经存在,CREATE USER语句就会返回一个错误。

CREATE USER语句的基本语法形式如下:

CREATE USER 用户名 [IDENTIFIED BY '密码'][,用户名 [IDENTIFIED BY '密码']];

在这里插入图片描述

举例:

CREATE USER 'xsy01' IDENTIFIED BY '111111'; # 默认host是 %
CREATE USER 'xsy01'@'localhost' IDENTIFIED BY '111111';

在这里插入图片描述
在这里插入图片描述
可以同名,表明user表里面的主键是由host+user构成的联合主键

登陆:
在这里插入图片描述
在这里插入图片描述

1.3 修改用户
UPDATE mysql.user SET USER='li4' WHERE USER='wang5'; 

FLUSH PRIVILEGES;
1.4 删除用户

在MySQL数据库中,可以使用DROP USER语句来删除普通用户,也可以直接在mysql.user表中删除用户。

方式1:使用DROP方式删除(推荐)

DROP USER user[,user]…;

在这里插入图片描述

举例:

DROP USER li4 ; # 默认删除host为%的用户

DROP USER 'kangshifu'@'localhost';

方式2:使用DELETE方式删除(不推荐,有残留信息)

可以使用DELETE语句直接将用户的信息从mysql.user表中删除,但必须拥有对mysql.user表的DELETE权限,

DELETE语句的基本语法形式如下:

DELETE FROM mysql.user WHERE Host=’hostname’ AND User=’username’;

在这里插入图片描述

FLUSH PRIVILEGES;

在这里插入图片描述

1.5 设置当前用户密码

在这里插入图片描述

1. 使用ALTER USER命令来修改当前用户密码
用户可以使用ALTER命令来修改自身密码,如下语句代表修改当前登录用户的密码。基本语法如下:

ALTER USER USER() IDENTIFIED BY 'new_password';

在这里插入图片描述

2. 使用SET语句来修改当前用户密码
使用root用户登录MySQL后,可以使用SET语句来修改密码,具体SQL语句如下:

SET PASSWORD='new_password';

在这里插入图片描述

1.6 修改其它用户密码

root用户不仅可以修改自己的密码,还可以修改其它普通用户的密码。root用户登录MySQL服务器后,可以通过ALTER语句和SET语句来修改普通用户的密码。由于PASSWORD()函数已移除,因此使用UPDATE直接操作用户表的方式已不再使用。

1. 使用ALTER语句来修改普通用户的密码

ALTER USER user [IDENTIFIED BY '新密码'] 
[,user[IDENTIFIED BY '新密码']];

在这里插入图片描述

2. 使用SET命令来修改普通用户的密码

SET PASSWORD FOR 'username'@'hostname'='new_password';

在这里插入图片描述
在这里插入图片描述

1.7 MySQL8密码管理

在这里插入图片描述

1.密码过期策略

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.密码重用策略

在这里插入图片描述
在这里插入图片描述

2. 权限管理

关于MySQL的权限简单的理解就是MySQL允许你做你权力以内的事情,不可以越界。比如只允许你执行SELECT操作,那么你就不能执行UPDATE操作。只允许你从某台机器上连接MySQL,那么你就不能从除那台机器以外的其他机器连接MySQL。

2.1 权限列表

MySQL到底都有哪些权限呢?

show privileges;

在这里插入图片描述

  • CREATE和DROP权限,可以创建新的数据库和表,或删除(移掉)已有的数据库和表。如果将MySQL数据库中的DROP权限授予某用户,用户就可以删除MySQL访问权限保存的数据库。
  • SELECT、INSERT、UPDATE和DELETE权限允许在一个数据库现有的表上实施操作。
  • SELECT权限只有在它们真正从一个表中检索行时才被用到。
  • INDEX权限允许创建或删除索引,INDEX适用于已有的表。如果具有某个表的CREATE权限,就可以在CREATE TABLE语句中包括索引定义。
  • ALTER权限可以使用ALTER TABLE来更改表的结构和重新命名表。
  • CREATE ROUTINE权限用来创建保存的程序(函数和程序),ALTER ROUTINE权限用来更改和删除保存的程序,EXECUTE权限用来执行保存的程序。
  • GRANT权限允许授权给其他用户,可用于数据库、表和保存的程序。
  • FILE权限使用户可以使用LOAD DATA INFILE和SELECT … INTO OUTFILE语句读或写服务器上的文件,任何被授予FILE权限的用户都能读或写MySQL服务器上的任何文件(说明用户可以读任何数据库目录下的文件,因为服务器可以访问这些文件)。

MySQL的权限如何分布:
在这里插入图片描述

2.2 授予权限的原则

权限控制主要是出于安全因素,因此需要遵循以下几个经验原则

1、只授予能满足需要的最小权限,防止用户干坏事。比如用户只是需要查询,那就只给select权限就可以了,不要给用户赋予update、insert或者delete权限。

2、创建用户的时候限制用户的登录主机,一般是限制成指定IP或者内网IP段。

3、为每个用户设置满足密码复杂度的密码

4、定期清理不需要的用户,回收权限或者删除用户。

2.3 授予权限

给用户授权的方式有2种,分别是通过把角色赋予用户给用户授权和直接给用户授权。用户是数据库的使用者,我们可以通过给用户授予访问数据库中资源的权限,来控制使用者对数据库的访问,消除安全隐患。

授权命令:

GRANT 权限1,权限2,…权限n ON 数据库名称.表名称 TO 用户名@用户地址 [IDENTIFIED BY ‘密码口令’];
  • 该权限如果发现没有该用户,则会直接新建一个用户。

比如:

  • 给li4用户用本地命令行方式,授予atguigudb这个库下的所有表的插删改查的权限。
GRANT SELECT,INSERT,DELETE,UPDATE ON atguigudb.* TO li4@localhost;

在这里插入图片描述

  • 授予通过网络方式登录的joe用户 ,对所有库所有表的全部权限,密码设为123。注意这里唯独不包括grant的权限,即就是,joe用户拥有所有权限,唯独不能为其他用户赋予权限
GRANT ALL PRIVILEGES ON *.* TO joe@'%' IDENTIFIED BY '123';

在这里插入图片描述
在这里插入图片描述

2.4 查看权限
  • 查看当前用户权限
SHOW GRANTS; 
# 或 
SHOW GRANTS FOR CURRENT_USER; 
# 或 
SHOW GRANTS FOR CURRENT_USER();
  • 查看某用户的全局权限
SHOW GRANTS FOR 'user'@'主机地址';
2.5 收回权限

在这里插入图片描述

注意:在将用户账户从user表删除之前,应该收回相应用户的所有权限。

  • 收回权限命令
REVOKE 权限1,权限2,…权限n ON 数据库名称.表名称 FROM 用户名@用户地址;
  • 举例
#收回全库全表的所有权限 
REVOKE ALL PRIVILEGES ON *.* FROM joe@'%'; 

#收回mysql库下的所有表的插删改查权限 
REVOKE SELECT,INSERT,UPDATE,DELETE ON mysql.* FROM joe@localhost;
  • 注意:须用户重新登录后才能生效

在这里插入图片描述

3.权限表

在这里插入图片描述
在这里插入图片描述

3.1 user表

user表是MySQL中最重要的一个权限表,记录用户账号和权限信息,有49个字段。如下图:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2 db表

db表是MySQL数据中非常重要的权限表。db表存储了用户能够访问那个数据库的权限,决定用户能从哪个主机存取哪个数据库。db表比较常用
user表中的权限是针对所有数据库的,如果user表中的Select_priv字段取值为Y,那么该用户可以查询所有数据库中的表。如果希望用户只对某个数据库有操作权限,那么需要将user表中对应的权限设置为N,然后在db表中设置对应数据库的操作权限。由此可知,用户先根据user表的内容获取权限,然后根据db表的内容获取权限。

DESCRIBE mysql.db;

在这里插入图片描述
表明:从哪一个ip地址(host)过来的用户(user),针对于某一个具体的数据库(Db),是否具备下列的权限

在这里插入图片描述

3.3 tables_priv表和columns_priv表

tables_priv表用来 对表设置操作权限 ,columns_priv表用来对表的 某一列设置权限 。tables_priv表和columns_priv表的结构分别如图:

desc mysql.tables_priv;

在这里插入图片描述
表明:从哪一个ip地址(host)过来的用户(user),针对于某一个具体的数据库(Db) 中的具体的某一个表(Table_name),是否具备下列的权限

在这里插入图片描述

desc mysql.columns_priv;

在这里插入图片描述

在这里插入图片描述
表明:从哪一个ip地址(host)过来的用户(user),针对于某一个具体的数据库(Db) 中的具体的某一个表(Table_name) 里面的某一个具体列(column_name),是否具备下列的权限

3.4 procs_priv表

procs_priv表可以对 存储过程和存储函数设置操作权限 ,表结构如图:

desc mysql.procs_priv;

在这里插入图片描述
在这里插入图片描述

4.访问控制

正常情况下,并不希望每个用户都可以执行所有的数据库操作。当MySQL允许一个用户执行各种操作时,它将首先核实该用户向MySQL服务器发送的连接请求,然后确认用户的操作请求是否被允许。这个过程称为MySQL中的访问控制过程。MySQL的访问控制分为两个阶段:连接核实阶段请求核实阶段。

4.1 连接核实阶段

在这里插入图片描述

4.2 请求核实阶段

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

5. 角色管理
5.1 角色的理解

在这里插入图片描述

5.2 创建角色

在这里插入图片描述

CREATE ROLE 'role_name'[@'host_name'] [,'role_name'[@'host_name']]...

角色名称的命名规则和用户名类似。如果host_name省略,默认为%role_name不可省略,不可为空。
在这里插入图片描述
在这里插入图片描述

5.3 给角色赋予权限

在这里插入图片描述

GRANT privileges ON table_name TO 'role_name'[@'host_name'];

上述语句中privileges代表权限的名称,多个权限以逗号隔开。可使用SHOW语句查询权限名称

SHOW PRIVILEGES\G

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

5.4 查看角色的权限

在这里插入图片描述

SHOW GRANTS FOR 'role_name';

在这里插入图片描述

只要你创建了一个角色,系统就会自动给你一个“USAGE”权限,意思是连接登录数据库的权限

5.5 回收角色的权限

在这里插入图片描述

REVOKE privileges ON tablename FROM 'rolename';

在这里插入图片描述
在这里插入图片描述

5.6 删除角色

在这里插入图片描述

DROP ROLE role [,role2]...

在这里插入图片描述

注意,如果你删除了角色,那么用户也就失去了通过这个角色所获得的所有权限

5.7 给用户赋予角色

角色创建并授权后,要赋给用户并处于激活状态才能发挥作用。

GRANT role [,role2,...] TO user [,user2,...];

在上述语句中,role代表角色,user代表用户。可将多个角色同时赋予多个用户,用逗号隔开即可

练习:给xsy01用户添加角色boss权限。
(1)使用GRANT语句给xsy01添加boss权限,SQL语句如下。

grant 'boss'@'%' to 'xsy01'@'%';

(2)添加完成后使用SHOW语句查看是否添加成功,SQL语句如下。

show grants for xsy01;

在这里插入图片描述

(3) 使用xsy01用户登录,然后查询当前角色,如果角色未激活,结果将显示NONE。SQL语句如下。

SELECT CURRENT_ROLE();# 查询当前已激活的角色

在这里插入图片描述
在这里插入图片描述

5.8 激活角色

方式1:使用set default role 命令激活角色

SET DEFAULT ROLE ALL TO 'kangshifu'@'localhost';

在这里插入图片描述
在这里插入图片描述

方式2:将activate_all_roles_on_login设置为ON

SET GLOBAL activate_all_roles_on_login=ON;

在这里插入图片描述

这条 SQL 语句的意思是,对所有角色永久激活

5.9 撤销用户的角色
REVOKE role FROM user;
5.10 设置强制角色(mandatory role)

方式1:服务启动前设置

[mysqld] 
mandatory_roles='role1,role2@localhost,r3@%.atguigu.com'

方式2:运行时设置

SET PERSIST mandatory_roles = 'role1,role2@localhost,r3@%.example.com'; #系统重启后仍然有效
SET GLOBAL mandatory_roles = 'role1,role2@localhost,r3@%.example.com'; #系统重启后失效
5.11 小结

在这里插入图片描述

6.配置文件的使用
6.1 配置文件格式

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

6.2 启动命令与选项组

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6.3特定MySQL版本的专用选项组

在这里插入图片描述

6.4同一个配置文件中多个组的优先级

在这里插入图片描述

6.5命令行和配置文件中启动选项的区别

在这里插入图片描述

7.系统变量(复习)
7.1系统变量简介

在这里插入图片描述

7.2查看系统变量

在这里插入图片描述

7.3设置系统变量
7.3.1通过启动选项设置

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

7.3.2服务器程序运行过程中设置

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值