【MySQL从入门到精通】【高级篇】(四)MySQL权限管理与控制

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 上篇文章我们介绍了MySQL中用户的创建,修改以及删除。这篇文章接着来学习MySQL的权限管理与控制。

1. 简介

上篇文章我们介绍了MySQL中用户的创建,修改以及删除。这篇文章接着来学习MySQL的权限管理与控制。

2. 环境

环境 版本
Red Hat 4.8.5-39
MySQL 5.7

3. 权限管理

MySQL的权限管理简单的理解就是MySQL允许你做你权利以内的事情,不可以越界, 比如只允许你执行SELECT 操作,那么你就不能执行UPDATE 操作,只允许你从某台机器上连接MySQL,那么你就不能从除那台机器以外的其他机器连接MySQL。创建一个新账号之后,默认情况下只有information_schema数据库的权限,如果想要该用户可以操作其他数据库,这需要给用户分配特定的权限。

3.1. 权限列表

MySQL到底都有哪些权限呢?

mysql> show privileges;

GRANT和REVOKE语句中可以使用的权限如下:

权限 user表中对应的列 权限的范围
CREATE Create_priv 数据库、表或索引
Drop Drop_priv 数据库,表或视图
GRANTOPTION Grant_priv 数据库,表或存储过程
REFERENCES Reference_priv 数据库或表
EVENT Event_priv 数据库
ALTRE Alter_priv 数据库
DELETE Delete_priv

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权限如何分布

权限分布 可能的设置权限
表权限 SELECT、INSERT、UPDATE、DELETE、CREATE、DROP、GRANT、REFERENCES、INDEX、ALTER
列权限 SELECT、INSERT、UPDATE、REFERENCES
过程权限 EXEUTE、ALTER ROUTINE、GRANT

2.2. 授予权限的原则

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

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

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

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

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

2.3. 授予权限

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

授权命令:

GRANT 权限1,权限2,...权限n ON 数据库名称.表名称 TO 用户名@用户地址 [IDENTIFIED BY '密码

授权时如果发现没有该用户,则会直接新建一个用户。

比如:

给zhang3用户用本地命令行方式,授予test这个库下所有表的查插删改的权限。

GRANT SELECT,INSERT,DELETE,UPDATE ON test.* TO zhang3 IDENTIFIED BY 'Abc123456@';

授予通过网络方式登录的zhangsan用户,对所有库所有表的全部权限,密码设为 Abc123456@,这里唯独不包括grant的权限。

GRANT ALL PRIVILEGES ON *.* TO zhangsan@'%' IDENTIFIED BY 'Abc123456@';

可以使用GRANT重复给用户添加权限,权限叠加,比如你先给用户添加一个SELECT权限,然后 又给用户添加一个INSERT权限,那么该用户就同时拥有了SELECT和INSERT权限。

2.4. 查看权限

查看当前用户权限

SHOW GRANTS;

查看某用户全局权限

SHOW GRANTS FOR 'user'@'主机地址'

建议大家尽量使用数据库自己的角色和用户机制来控制访问权限,不要轻易用root账号,因为root账号密码放在代码里面不安全,一旦泄露,数据库就会完全失去保护。

2.5. 收回权限

收回权限就是取消已经赋予用户的某些权限,收回用户不必要的权限可以在一定程度上保证系统的安全性。MySQL中使用REVOKE语句取消用户的某些权限,使用REVOKE收回权限之后,用户账户记录将从db、host、tables_priv和column_priv表中删除,但是用户账户记录仍然在user表中保存(删除user表中的用户信息使用DROP USER语句)。

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

收回命令:

REVOKE 权限1,权限2,...,权限n ON 数据库名称.表名称 FROM 用户名称@用户地址;

举例:

#收回全库全表的所有权限
REVOKE ALL PRIVILEGES ON *.* FROM zhang3@'%';

而且,MySQL的权限控制功能十分完善,应该尽量使用,可以提高效率,而且安全可靠。

3. 权限表

MySQL服务器通过权限表来控制用户对数据库的访问,权限表存放在mysql数据库中,MySQL数据库系统会根据这些权限表的内容为每个用户赋予相应的权限。这些权限表最重要的是user表、db表。除此之外,还有table_priv表、column_priv表和proc_priv表。在MySQL启动时,服务器将这些数据库中权限信息读入内存。

表名 描述
user 用户账号及权限信息
global_grants 动态全局授权
db 数据库层级的权限
tables_priv 表层级的权限
columns_priv 列层级的权限
procs_priv 存储过程和函数权限
proxics_priv 代理用户的权限

下面以db表为例进行说明。

其中,zhang3这个账号拥有test库下的查删改插的权限。

总结

本文详细介绍了如何给用户分配权限以及收回权限

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
安全 关系型数据库 MySQL
PHP与MySQL交互:从入门到实践
【9月更文挑战第20天】在数字时代的浪潮中,掌握PHP与MySQL的互动成为了开发动态网站和应用程序的关键。本文将通过简明的语言和实例,引导你理解PHP如何与MySQL数据库进行对话,开启你的编程之旅。我们将从连接数据库开始,逐步深入到执行查询、处理结果,以及应对常见的挑战。无论你是初学者还是希望提升技能的开发者,这篇文章都将为你提供实用的知识和技巧。让我们一起探索PHP与MySQL交互的世界,解锁数据的力量!
|
4月前
|
关系型数据库 MySQL 数据库
MySQL基本操作入门指南
MySQL基本操作入门指南
138 0
|
4月前
|
SQL 关系型数据库 MySQL
MySQL入门到精通
MySQL入门到精通
|
6月前
|
SQL 关系型数据库 MySQL
「Python入门」python操作MySQL和SqlServer
**摘要:** 了解如何使用Python的pymysql模块与MySQL数据库交互。首先,通过`pip install pymysql`安装模块。pymysql提供与MySQL的连接功能,例如创建数据库连接、执行SQL查询。在设置好MySQL环境后,使用`pymysql.connect()`建立连接,并通过游标执行SQL(如用户登录验证)。注意防止SQL注入,使用参数化查询。增删改操作需调用`conn.commit()`来保存更改。pymssql模块类似,但导入和连接对象创建略有不同。
76 0
「Python入门」python操作MySQL和SqlServer
|
6月前
|
SQL 关系型数据库 MySQL
【MySQL从入门到精通】常用SQL语句分享
【MySQL从入门到精通】常用SQL语句分享
75 2
|
7月前
|
关系型数据库 MySQL 数据库
『Django』模型入门教程-操作MySQL
一个后台如果没有数据库可以说废了一半。日常开发中大多数时候都在与数据库打交道。Django 为我们提供了一种更简单的操作数据库的方式。 在 Django 中,模型(Model)是用来定义数据库结构的类。每个模型类通常对应数据库中的一个表,类的属性对应表中的列。通过定义模型,Django 的 ORM(Object-Relational Mapping)可以将 Python 对象映射到数据库表,并提供一套 API 来进行数据库操作。 本文介绍模型的用法。
|
7月前
|
Java 关系型数据库 MySQL
Mybatis入门之在基于Springboot的框架下拿到MySQL中数据
Mybatis入门之在基于Springboot的框架下拿到MySQL中数据
60 4
|
6月前
|
存储 关系型数据库 MySQL
MySQL小白教程:从入门到查询高手
MySQL小白教程:从入门到查询高手
|
7月前
|
关系型数据库 MySQL 数据库
轻松入门:使用Docker安装MySQL数据库的完全指南
轻松入门:使用Docker安装MySQL数据库的完全指南
|
7月前
|
SQL 关系型数据库 MySQL
MySQL数据库数据模型概念入门及基础的SQL语句2024
MySQL数据库数据模型概念入门及基础的SQL语句2024
45 0