13.MySQL用户管理

目录

  • MySQL用户管理
    • 用户
      • 用户信息
      • 创建用户
      • 修改用户密码
      • 删除用户
    • 数据库的权限
      • MySQL中的权限
      • 给用户授权
      • 回收权限

用户

用户信息

MySQL中的用户信息存储在默认数据库mysqluser表中。这个表记录了所有用户的详细信息,包括用户名、登录权限以及密码等。通过查看这个表的内容,可以了解到当前系统中所有的用户配置情况。

user表中,有几个关键字段需要特别注意:

  • user:表示该用户的用户名。
  • host:表示该用户可以从哪个主机登录。如果值为localhost,则表示只能从本机登录;如果值为%,则表示可以从任意地方登录。
  • authentication_string:表示该用户的密码经过加密后的值。
  • xxx_priv:表示该用户是否拥有对应权限。例如,Select_priv表示该用户是否具有查询权限。

为了避免输出过多的信息,我们通常只选择部分字段进行显示。比如,可以通过以下SQL语句来查看用户的基本信息:

SELECT user, host, authentication_string FROM mysql.user;

此外,MySQL中允许存在同名的用户,只要这些用户的登录主机不同即可。这是因为user表的主键是由user列和host列共同组成的复合主键。因此,同一个用户名可以出现在多个不同的主机条目中,每个条目代表一个独立的用户账户。

创建用户

创建用户的语法如下:

CREATE USER '用户名'@'登录主机' IDENTIFIED BY '密码';

其中,用户名是你希望创建的新用户的名称,登录主机指定了该用户可以从哪些主机登录。如果希望用户可以从任意地方登录,则可以将登录主机设置为%密码则是该用户的登录密码。

举个例子,假设我们要创建一个名为dragon的用户,并且允许该用户从任何地方登录,可以使用以下SQL语句:

CREATE USER 'dragon'@'%' IDENTIFIED BY 'your_password';

执行这条SQL语句后,新创建的用户信息会被写入到mysql.user表中。你可以通过查询该表来验证用户是否已经成功创建:

SELECT user, host, authentication_string FROM mysql.user WHERE user = 'dragon';

此时,你就可以使用新创建的普通用户来连接MySQL服务器了。如果你在Windows环境下也安装了MySQL,那么还可以通过命令行工具进行远程登录。

需要注意的是,创建用户的SQL语句不会被历史记录下来,因此不能通过上下箭头键进行追溯。此外,MySQL对密码的要求较高,如果设置的密码过于简单,可能会导致报错。这时,你可以选择将密码设置得更复杂一些,或者调整MySQL的密码策略设置。

为了了解当前的密码设置要求,可以通过以下命令查看全局变量:

SHOW VARIABLES LIKE 'validate_password%';

这将显示与密码验证相关的各种参数,帮助你更好地理解密码策略的具体要求。

修改用户密码

用户可以通过调用PASSWORD()函数来自行修改自己的密码。具体操作如下:

SET PASSWORD = PASSWORD('新密码');

这条命令会将当前用户的密码更新为你指定的新密码。PASSWORD()函数会对新密码进行加密处理,确保安全性。

对于超级用户(如root),他们有权修改任意用户的密码。超级用户可以通过以下方式修改其他用户的密码:

SET PASSWORD FOR '用户名'@'登录地址' = PASSWORD('新密码');

这里,用户名是你想要修改密码的用户的名称,登录地址指定了该用户可以从哪些主机登录。例如,如果你想将用户dragon的密码修改为new_password,并且该用户可以从任意地方登录,可以使用以下命令:

SET PASSWORD FOR 'dragon'@'%' = PASSWORD('new_password');

这样,用户dragon的密码就会被更新为new_password

需要注意的是,修改密码时应确保新密码符合MySQL的密码策略要求,以避免因密码过于简单而导致的错误。同样,可以通过以下命令查看当前的密码策略设置:

SHOW VARIABLES LIKE 'validate_password%';

这将帮助你了解当前的密码复杂度要求,从而设置合适的密码。

删除用户

删除用户的语法如下:

DROP USER '用户名'@'登录地址';

其中,用户名是要删除的用户的名称,登录地址指定了该用户可以从哪些主机登录。例如,如果你想删除之前创建的用户dragon,并且该用户可以从任意地方登录,可以使用以下命令:

DROP USER 'dragon'@'%';

执行这条SQL语句后,该用户在mysql.user表中的记录将会被删除,意味着该用户不再存在于系统中。你可以通过查询mysql.user表来验证用户是否已经被成功删除:

SELECT user, host FROM mysql.user WHERE user = 'dragon';

如果没有返回任何结果,则说明用户已成功删除。

需要注意的是,如果不指定登录地址,MySQL会默认删除登录地址为%的用户。例如,以下命令:

DROP USER 'dragon';

将删除登录地址为%的用户dragon。然而,如果存在多个同名但登录地址不同的用户,这种写法可能会导致误删。因此,在删除用户时,最好明确指定登录地址,以确保删除的是正确的用户。

此外,删除用户后,该用户的所有权限也会随之被撤销。这意味着该用户将无法再访问任何数据库或执行任何操作。因此,在删除用户之前,务必确认该用户确实不再需要使用。

数据库的权限

MySQL中的权限

MySQL提供了丰富的权限管理机制,允许管理员根据实际需求为用户分配不同的权限。这些权限决定了用户可以在数据库中执行哪些操作。MySQL的权限主要分为以下几个类别:

  1. 数据库级别的权限:这类权限适用于整个数据库,例如创建数据库、删除数据库等。
  2. 表级别的权限:这类权限适用于特定数据库中的表,例如查询、插入、更新、删除数据等。
  3. 列级别的权限:这类权限适用于表中的某些列,允许用户对特定列进行操作。
  4. 存储过程和函数的权限:这类权限适用于存储过程和函数,例如执行、修改等。
  5. 服务器管理权限:这类权限涉及服务器的整体管理,例如关闭服务器、刷新日志、创建用户等。

MySQL中的具体权限列表如下:

权限列名上下文
CREATECreate_priv数据库、表或索引
DROPDrop_priv数据库或表
GRANT OPTIONGrant_priv数据库、表或保存的程序
REFERENCESReferences_priv数据库或表
ALTERAlter_priv
DELETEDelete_priv
INDEXIndex_priv
SELECTSelect_priv
UPDATEUpdate_priv
CREATE VIEWCreate_view_priv视图
SHOW VIEWShow_view_priv视图
ALTER ROUTINEAlter_routine_priv保存的程序
CREATE ROUTINECreate_routine_priv保存的程序
EXECUTEExecute_priv保存的程序
FILEFile_priv服务器主机上的文件访问
CREATE TEMPORARY TABLESCreate_tmp_table_priv服务器管理
LOCK TABLESLock_tables_priv服务器管理
CREATE USERCreate_user_priv服务器管理
PROCESSProcess_priv服务器管理
RELOADReload_priv服务器管理
REPLICATION CLIENTRepl_client_priv服务器管理
REPLICATION SLAVERepl_slave_priv服务器管理
SHOW DATABASESShow_db_priv服务器管理
SHUTDOWNShutdown_priv服务器管理
SUPERSuper_priv服务器管理

需要注意的是,新创建的用户默认没有任何权限。因此,在创建用户后,必须为其授予相应的权限,以便用户能够执行所需的操作。

给用户授权

给用户授权是MySQL权限管理的重要组成部分。通过授权,管理员可以控制用户对数据库对象的访问和操作权限。授权的语法如下:

GRANT 权限列表 ON 库名.对象名 TO '用户名'@'登录地址' [IDENTIFIED BY '密码'];

其中,权限列表表示要授予用户的权限,多个权限之间用逗号分隔;库名.对象名指定了权限适用的数据库和对象,例如某个具体的表或视图;用户名@登录地址用于指定目标用户及其允许登录的主机;IDENTIFIED BY '密码'是可选的,如果用户不存在,则会创建该用户并设置密码。

举个例子,假设我们需要创建一个名为dragon的用户,并授予其在user_management数据库下所有对象的SELECT权限,可以使用以下命令:

GRANT SELECT ON user_management.* TO 'dragon'@'%' IDENTIFIED BY 'your_password';

执行这条命令后,用户dragon将能够在user_management数据库中查询所有表的数据。

为了验证授权是否成功,可以使用以下命令查看用户的现有权限:

SHOW GRANTS FOR 'dragon'@'%';

这条命令将列出用户dragon所拥有的所有权限。可以看到,默认情况下,新创建的用户会拥有USAGE权限,该权限仅允许用户登录数据库,而不能执行任何操作。

授权完成后,用户dragon将能够看到user_management数据库,并进入该数据库查看其下的所有表。然而,由于我们只授予了SELECT权限,该用户只能查询表中的数据,而不能进行修改。例如,尝试插入或更新数据时,用户将收到权限不足的错误提示。

如果我们希望用户dragon能够在user_management数据库中执行更多操作,可以授予其更多的权限。例如,以下命令将授予用户dragonuser_management数据库下的所有权限:

GRANT ALL PRIVILEGES ON user_management.* TO 'dragon'@'%';

执行这条命令后,用户dragon将能够对user_management数据库中的所有表进行增删改查等操作。

需要注意的是,授予权限时应遵循最小权限原则,即只授予用户完成任务所需的最低权限,以降低潜在的安全风险。同时,授予权限后,建议定期检查用户的权限设置,确保其仍然符合业务需求。

回收权限

回收权限是MySQL权限管理中的一个重要环节。当用户的权限不再需要时,及时回收权限可以有效降低安全风险,防止未经授权的操作发生。回收权限的语法如下:

REVOKE 权限列表 ON 库名.对象名 FROM '用户名'@'登录地址';

其中,权限列表表示要回收的权限,多个权限之间用逗号分隔;库名.对象名指定了权限适用的数据库和对象;用户名@登录地址用于指定目标用户及其允许登录的主机。

举个例子,假设我们希望回收用户dragonuser_management数据库下的所有权限,可以使用以下命令:

REVOKE ALL PRIVILEGES ON user_management.* FROM 'dragon'@'%';

执行这条命令后,用户dragon将不再拥有对user_management数据库中任何对象的访问权限。

需要注意的是,回收权限的语法与授权类似,只是将TO关键字替换为FROM,并且没有了IDENTIFIED BY '密码'字段。此外,回收权限后,用户在下次进入数据库时才能生效。如果用户正在使用对应数据库,回收权限后该用户仍然可能保留原有的权限,直到重新登录为止。

为了验证权限是否已被成功回收,可以使用以下命令查看用户的现有权限:

SHOW GRANTS FOR 'dragon'@'%';

这条命令将列出用户dragon当前拥有的所有权限。如果发现权限未被完全回收,可以再次执行REVOKE命令,确保所有不必要的权限都被移除。

在实际应用中,回收权限时应谨慎操作,避免误删重要权限。同时,建议定期审查用户的权限设置,确保其符合最新的业务需求和安全策略。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/83883.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/83883.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/83883.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式Session处理的五大主流方案解析

在分布式环境下,Session 处理的核心挑战是确保用户请求在不同服务器间流转时能保持会话状态一致。以下是主流解决方案及优缺点分析: 🔐 一、集中存储方案(主流推荐) Redis/Memcached 存储 原理:将 Session…

【数据分析】什么是鲁棒性?

引言 —— 为什么我们需要“抗折腾”的系统? 当你乘坐的飞机穿越雷暴区时机体剧烈颠簸,自动驾驶汽车在暴雨中稳稳避开障碍物,或是手机从口袋摔落后依然流畅运行——这些场景背后,都藏着一个工程领域的“隐形守护者”:…

altium designer2024绘制stm32过程笔记x`

学习视频:【Altium Designer 1小时(貌似不够)速成(可能不止一小时*~* 但我觉得仨小时肯定够了---来自up猪的自信!!)】https://www.bilibili.com/video/BV17E411x7dR?p2&vd_sourcea756421e0aaa64b2bba352eabfa26ed…

Java 类型参数 T、R 、 O 、K、V 、E 、? 区别

在 Java 泛型和函数式编程中,T、R 和 O 都是类型参数(Type Parameters),它们的主要区别在于命名约定和上下文含义,而不是语言层面的区别。它们可以互换使用,但通常遵循一定的命名习惯以提高代码可读性。 1.…

Komiko 视频到视频功能炸裂上线!

Komiko 平台作为行业的创新先锋,近日宣布推出全新的视频到视频(Video-to-Video)功能,这一举措犹如一颗重磅炸弹,瞬间在漫画、动画和插画创作的世界里掀起了惊涛骇浪,进一步巩固了其作为 AI 驱动的一体化创作…

Protobuf 中的类型查找规则

a.proto syntax "proto2"; //protoc3生成代码兼容proto2语法 package pkgA; message Example { }ba.proto package pkgB.pkgA; message Example { }b.proto syntax "proto3"; //protoc3生成代码兼容proto2语法 package pkgB; import "test1/a.pr…

KMeans 算法深度解析:从原理到实战

一、算法概述:无监督学习的聚类利器​ 在机器学习的无监督学习领域,聚类算法是探索数据内在结构的重要工具。KMeans 算法作为划分式聚类的代表,因其简单高效的特性,成为数据科学家工具箱中的必备技能。该算法通过将 n 个数据点划…

Chrome 浏览器前端与客户端双向通信实战

Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…

Server2003 B-1 Windows操作系统渗透

任务环境说明: 服务器场景:Server2003(开放链接) 服务器场景操作系统:Windows7 1.通过本地PC中渗透测试平台Kali对服务器场景Windows进行系统服务及版本扫描渗透测试,并将该操作显示结果中Telnet服务对应的…

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解

进来是需要留言的&#xff0c;先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码&#xff0c;输入的<>当成字符串处理回显到页面中&#xff0c;看来只是把用户输…

使用React+ant Table 实现 表格无限循环滚动播放

数据大屏表格数据&#xff0c;当表格内容超出&#xff08;出现滚动条&#xff09;时&#xff0c;无限循环滚动播放&#xff0c;鼠标移入暂停滚动&#xff0c;鼠标移除继续滚动&#xff1b;数据量小没有超出时不需要滚动。 *使用时应注意&#xff0c;滚动区域高度父元素高度 - 表…

机器人现可完全破解验证码:未来安全技术何去何从?

引言 随着计算机视觉技术的飞速发展&#xff0c;机器学习模型现已能够100%可靠地解决Google的视觉reCAPTCHAv2验证码。这标志着一个时代的结束——自2000年代初以来&#xff0c;CAPTCHA&#xff08;"全自动区分计算机与人类的图灵测试"的缩写&#xff09;一直是区分…

大模型安全测试报告:千问、GPT 全系列、豆包、Claude 表现优异,DeepSeek、Grok-3 与 Kimi 存在安全隐患

大模型安全测试报告&#xff1a;千问、GPT 全系列、豆包、Claude 表现优异&#xff0c;DeepSeek、Grok-3 与 Kimi 存在安全隐患 引言 随着生成式人工智能技术的快速演进&#xff0c;大语言模型&#xff08;LLM&#xff09;正在广泛应用于企业服务、政务系统、教育平台、金融风…

docker 部署redis集群 配置

docker的网络模式 网桥模式每次重启容器都有可能导致容器ip地址变化&#xff0c;需要固定ip的自己自定义网络&#xff0c;这里介绍的是默认网络模式 docker创建容器 docker run --name redis6379 -p 6379:6379 -p 16379:16379 -v /etc/redis/redis6379:/etc/redis -d --r…

LabVIEW的AMC架构解析

此LabVIEW 程序基于消息队列&#xff08;Message Queue&#xff09;机制构建 AMC 架构&#xff0c;核心包含消息生成&#xff08;MessageGenerator &#xff09;与消息处理&#xff08;Message Processor &#xff09;两大循环&#xff0c;通过队列传递事件与指令&#xff0c;实…

数据库管理与高可用-MySQL主从复制与读写分离

目录 #1.1MySQL主从复制原理 1.1.1MySQL支持的复制类型 1.1.2复制的工作过程 #2.1MySQL读写分离原理 2.1.1常见的MySQL读写分离为为两种 #3.1主从复制读写分离的实验案例 1.1MySQL主从复制的原理 MySQL 主从复制是一种常用的数据同步机制&#xff0c;用于将主数据库&#xf…

Python60日基础学习打卡Day45

之前的神经网络训练中&#xff0c;为了帮助理解借用了很多的组件&#xff0c;比如训练进度条、可视化的loss下降曲线、权重分布图&#xff0c;运行结束后还可以查看单张图的推理效果。 如果现在有一个交互工具可以很简单的通过按钮完成这些辅助功能那就好了&#xff0c;他就是…

React项目的状态管理:Redux Toolkit

目录 1、搭建环境 2、Redux Toolkit 包含了什么 3、使用示例 &#xff08;1&#xff09;创建user切片 &#xff08;2&#xff09;合并切片得到store &#xff08;3&#xff09;配置store和使用store 使用js来编写代码&#xff0c;方便理解一些 1、搭建环境 首先&#xf…

父组件prop传向子组件的值,被子组件直接v-model绑定 功能不生效

隐式修改组件属性会导致功能异常 实际操作中发现&#xff0c;即便是父组件把简单数据通过prop传给了子组件&#xff0c;子组件再使用v-model绑定&#xff0c;也不行&#xff0c;响应式还是对异常 原vue2业务中存在组件定义某个类型为Object的属性&#xff0c;然后将该属性对象…

c#bitconverter操作,不同变量类型转byte数组

缘起:串口数据传输的基础是byte数组&#xff0c;write(buff,0,num)或者writeline(string)&#xff0c;如果是字符串传输就是string变量就可以了&#xff0c;但是在modbus这类hex传递时&#xff0c;就要遇到转换了&#xff0c;拼凑byte数组时需要各种变量的值传递&#xff0c;解…