《PHP、MySQL和Apache入门经典(第5版)》一一2.8 MySQL权限系统简介

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介:

本节书摘来自异步社区出版社《PHP、MySQL和Apache入门经典(第5版)》一书中的第2章,第2.8节,作者: 【美】Julie C. Meloni,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.8 MySQL权限系统简介

PHP、MySQL和Apache入门经典(第5版)
MySQL权限系统总是起作用的。当你第一次尝试连接MySQL服务器的时候,并且对于每一个后续的动作,MySQL都会检查以下3件事情。

你从哪里访问(你的主机)?
你说你是谁(你的用户名和密码)?
允许你做什么(你的命令权限)?
所有这些信息都存储在一个名为mysql的数据库中,当安装MySQL的时候,自动创建该数据库。在mysql数据库中,有如下几个和权限相关的表。

columns_priv——为一个表中的具体字段定义用户权限。
db——为服务器上的所有数据库定义许可。
host——定义连接到一个具体数据库的、可接受的主机。
procs_priv——为存储例程定义用户权限。
tables_priv——为一个数据库中的具体的表定义用户权限。
user——为一个具体用户定义命令权限。
在本章中,当你向MySQL添加一些示例用户的时候,这些表将变得更为重要。现在,只需要记住这些表的存在,并且为了让用户完成操作,这些表中必须拥有相关的数据。

2.8.1 两步身份验证过程

正如你所了解的,在身份验证过程中,MySQL检查3件事情。和这3件事情相关的动作分如下两步执行。

1.MySQL查看你的连接所来自的主机,以及所使用的用户名和密码。如果主机允许连接,你的用户名对应的密码正确,并且用户名和分配给该主机的一个用户名匹配,MySQL就转到第二步。

2.对于你尝试执行的任何一条SQL命令,MySQL验证你能够对该数据库、表和字段执行此操作。如果步骤1失败,你将会看到一个相关的错误,并且不能继续步骤2。例如,假设你使用一个用户名joe和一个密码abc123连接到MySQL,并且想要访问一个名为myDB的数据库。如果由于如下原因导致这些连接变量的任何一个不正确,你都会接收到一条类似如下的错误消息。

密码不正确。
用户名joe不存在。
用户joe不能从localhost连接。
用户joe能够从localhost连接,但不能使用myDB数据库。
你可能看到如下的一条错误消息。

image

如果带有密码abc123的用户joe允许从localhost连接到myDB数据库,MySQL将会在这个过程的第二个步骤中检查joe所能执行的操作。为了便于说明,假设jow允许查询数据但是不允许插入数据。事件和错误的序列就会如下所示。

image

基于操作的许可在具有多层级管理的应用程序中很常见。例如,如果已经创建了包含个人财务数据的应用程序,你必须确保对记账级别的成员只赋予SELECT权限,而对具有安全许可的主管级成员赋予INSERT和DELETE权限。

在大多数情况下,当你通过一个Internet服务提供商访问MySQL的时候,只有一个用户和一个数据库可供使用。默认情况下,一个用户将能够访问该数据库中所有的表,并且允许执行所有的命令。在这种情况下,作为开发者,你的职责就是通过自己的编程开发出一个安全的应用程序。

然而,如果你是自己的服务器的管理员,或者Internet服务提供商允许你任意添加多个数据库和用户,并且可以修改自己的用户的访问权限,下面几个小节将带你学习如何做到这些。

2.8.2 添加用户

通过一个第三方应用程序来管理服务器,这为你提供了一个简单的方法来添加用户,只要使用一个类似向导的过程或一个图形化界面。然而,通过MySQL监视器添加用户并不难,尤其是如果你理解了MySQL所使用的安全检查点,这我们刚才已经学习过。

添加新用户的最简单的方法就是使用GRANT命令。作为root用户连接到MySQL,我们就可以使用一条命令来建立一个新用户。另一种方法是使用INSERT语句修改mysql数据库中所有相关的表,这需要我们知道用来存储许可的表的所有字段。第二种方法的效果和GRANT命令相同,但是比GRANT命令复杂得多。GRANT命令的简单语法如下。

image

下面是我们可以授予的一些常见的权限。如果需要完整的权限列表,请参考位于http://dev.mysql.com/doc/refman/5.5/en/grant.html的MySQL手册的GRANT条目。

ALL——授予用户所有常见权限。
ALTER——用户可以改变(修改)表、列和索引。
CREATE——用户可以创建数据库和表。
DELETE——用户可以从表中删除记录。
DROP——用户可以删除表和数据库。
FILE——用户可以读取和写入文件,这个权限用来导入或转储数据。
INDEX——用户可以添加或删除索引。
INSERT——用户可以向表中添加记录。
PROCESS——用户可以查看并停止系统进程,只有可信任的用户才能拥有此权限。
RELOAD——用户可以使用FLUSH语句,只有可信任的用户才能拥有此权限。
SELECT——用户可以从表中选取记录。
SHUTDOWN——用户可以关闭MySQL服务器,只有可信任的用户才能拥有此权限。
UPDATE——用户可以更新(修改)表中的记录。
例如,如果你想要创建一个带有99hjc!5密码的用户john,他在名为myDB的数据库中的所有表上都有SELECT和INSERT权限,并且希望这个用户能够从任何主机连接,那么,使用如下命令。

image

注意两个通配符和%的使用。这两个通配符用来代替值。在这个例子中,代替了数据库的全部表,而%代替了已知的世界中的所有主机的列表,这实际上是非常长的一个列表。

这里还有使用GRANT命令添加用户的另外一个例子。这次是添加一个带有密码45sdg11的用户jane,他在名为myCompany的数据库的一个名为employees的表上具有ALL权限。这个新的用户只能从一个特定的主机连接。

image

如果你知道janescomputer.company.com有一个IP地址63.124.45.2,可以用这个地址来替代命令中的主机名部分,命令如下所示。

image

添加用户的时候需要注意一点:总是使用密码并且确保这个密码是不易被破解的。

如果你使用GRANT命令来添加用户,改变会立即生效。要绝对确保这一点,你可以在MySQL监视器中使用一条FLUSH PRIVILEGES命令来重新载入授权表。

2.8.3 移除权限

移除权限和添加权限一样简单,只不过是使用REVOKE命令,而不是使用GRANT命令。REVOKE命令的语法如下。
image

我们授权许可来使用INSERT命令,采用同样的方式,我们也可以通过使用DELETE命令从mysql数据库的表中删除记录,从而取消前面的授权许可。然而,这需要你熟悉字段和表,并且使用REVOKE命令会更容易和安全。

要把用户john向myCompany数据库中的INSERT能力收回,可以使用如下一条REVOKE语句。

REVOKE INSERE
ON myCompany.*
FROM john@hostname
AI 代码解读

对权限表中的数据的修改会立刻生效,但是,为了让服务器立刻意识到你的修改,在MySQL监视器中可以使用FLUSH PRIVILEGES命令。

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
纯PHP+MySQL手搓高性能论坛系统!代码精简,拒绝臃肿
本内容分享了一套经实战验证的社交系统架构设计,支撑从1到100万用户的发展,并历经6次流量洪峰考验。架构涵盖客户端层(App、小程序、公众号)、接入层(API网关、负载均衡、CDN)、业务服务层(用户、内容、关系、消息等服务)、数据层(MySQL、Redis、MongoDB等)及运维监控层(日志、监控、告警)。核心设计包括数据库分库分表、多级缓存体系、消息队列削峰填谷、CQRS模式与热点数据动态缓存。同时提供应对流量洪峰的弹性伸缩方案及降级熔断机制,并通过Prometheus实现全链路监控。开源建议结构清晰,适合大型社交平台构建与优化。
88 11
MySQL原理简介—6.简单的生产优化案例
本文介绍了数据库和存储系统的几个主题: 1. **MySQL日志的顺序写和数据文件的随机读指标**:解释了磁盘随机读和顺序写的原理及对数据库性能的影响。 2. **Linux存储系统软件层原理及IO调度优化原理**:解析了Linux存储系统的分层架构,包括VFS、Page Cache、IO调度等,并推荐使用deadline算法优化IO调度。 3. **数据库服务器使用的RAID存储架构**:介绍了RAID技术的基本概念及其如何通过多磁盘阵列提高存储容量和数据冗余性。 4. **数据库Too many connections故障定位**:分析了MySQL连接数限制问题的原因及解决方法。
113 23
|
2天前
|
PHP
基于PHP开发的资源库系统源码
基于PHP开发的资源库系统源码
24 13
源码编译安装LAMP(HTTP服务,MYSQL ,PHP,以及bbs论坛)
通过以上步骤,你可以成功地在一台Linux服务器上从源码编译并安装LAMP环境,并配置一个BBS论坛(Discuz!)。这些步骤涵盖了从安装依赖、下载源代码、配置编译到安装完成的所有细节。每个命令的解释确保了过程的透明度,使即使是非专业人士也能够理解整个流程。
50 18
PHP 日志系统的最佳搭档:一个 Go 写的远程日志收集服务
为了不再 SSH 上去翻日志,我写了个 Go 小脚本,用来接收远程日志。PHP 负责记录日志,Go 负责存储和展示,按天存储、支持 API 访问、可远程管理,终于能第一时间知道项目炸了。
42 10
MySQL原理简介—9.MySQL索引原理
本文详细介绍了MySQL索引的设计与使用原则,涵盖磁盘数据页的存储结构、页分裂机制、主键索引设计及查询过程、聚簇索引和二级索引的原理、B+树索引的维护、联合索引的使用规则、SQL排序和分组时如何利用索引、回表查询对性能的影响以及索引覆盖的概念。此外还讨论了索引设计的案例,包括如何处理where筛选和order by排序之间的冲突、低基数字段的处理方式、范围查询字段的位置安排,以及通过辅助索引来优化特定查询场景。总结了设计索引的原则,如尽量包含where、order by、group by中的字段,选择离散度高的字段作为索引,限制索引数量,并针对频繁查询的低基数字段进行特殊处理等。
132 18
MySQL原理简介—9.MySQL索引原理
任务悬赏接单发布系统PHP源码
任务发布接单系统,目前最新最完善的一套源码,前后端全开源无加密,支持会员系统、 支持店铺认证 支持普通任务和线下任务 支持微信支付和支付宝支付 短信对接短信宝
47 13
如何排查和解决PHP连接数据库MYSQL失败写锁的问题
通过本文的介绍,您可以系统地了解如何排查和解决PHP连接MySQL数据库失败及写锁问题。通过检查配置、确保服务启动、调整防火墙设置和用户权限,以及识别和解决长时间运行的事务和死锁问题,可以有效地保障应用的稳定运行。
177 25
MySQL原理简介—12.MySQL主从同步
本文介绍了四种为MySQL搭建主从复制架构的方法:异步复制、半同步复制、GTID复制和并行复制。异步复制通过配置主库和从库实现简单的主从架构,但存在数据丢失风险;半同步复制确保日志复制到从库后再提交事务,提高了数据安全性;GTID复制简化了配置过程,增强了复制的可靠性和管理性;并行复制通过多线程技术降低主从同步延迟,保证数据一致性。此外,还讨论了如何使用工具监控主从延迟及应对策略,如强制读主库以确保即时读取最新数据。
MySQL原理简介—12.MySQL主从同步
PHP成绩查询系统源码
PHP成绩查询系统源码
585 3

推荐镜像

更多
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等