MySQL 用户账号管理(Accounts Management)

news2024/12/23 17:26:11

用户需要通过账号连接到MySQL Server,本文总结了MySQL账号的常用管理操作。

目录

一、用户账号简介

二、账号创建

三、账号权限管理

3.1 权限赋予与回收

3.1.1 库级赋权

3.1.2 表级赋权

3.1.3 列级赋权

3.1.4 存储过程和函数赋权

3.1.5 权限查询

3.1.6 权限回收

3.2 通过角色集中管理权限

四、账号密码管理

4.1 修改账号密码

4.2 强制用户修改密码

4.3 强制密码复杂度

4.3.1 安装控制插件

4.3.2 设置强度控制变量

4.3.3 强度控制测试


一、用户账号简介

MySQL的账号信息存储在mysql.user表中,该表中包含了账号名称,密码,权限等相关信息,可以通过desc mysql.user命令来查看表的结构:

desc mysql.user;

注意该表的主键是Host,User组成的复合主键,这也代表了MySQL账号的组成结构,MySQL的账号由User和Host两部分组成,其格式为'User'@'Host',其中Host部分限制了用户可以登录的地址。这也意味着用户名相同并不代表是同一账号,'abc'@'host1'和'abc'@'host2'是两个完全无关的账号。

在登录的时候,MySQL需要对我们的账号进行验证,这个验证的操作是由专门的认证插件来完成的。通过show plugins我们可以看到MySQL的认证插件(Type为Authentication):

show plugins;

同时在我们创建账号时,认证插件会采用哈希算法对密码进行加密,并存储到mysql.user的authentication_string字段(如果是旧的MySQL版本,这个字段也可能是password):

select user,host,plugin,authentication_string from mysql.user where user='root';

上面查询中,plugin字段代表该账号登录时使用的验证插件。

MySQL的3种认证插件简介如下:

  • mysql_native_password:MySQL 8.0以前的默认认证插件,使用默认的哈希算法。
  • sha256_password:使用sha-256哈希算法,比mysql_native_password安全性更高。
  • caching_sha2_password:MySQL 8.0开始的默认认证插件,sha256_password的升级版,客户端必须配置使用SSL加密连接。

注意:如果MySQL从低版本升级到8.0时,由于默认认证插件的变化,可能导致之前的应用无法连接到数据库,此时可以配置SSL连接,或者将账号的认证插件降级到mysql_native_password保持兼容。

二、账号创建

用create user语句创建新的账号,通过identified by子句设置密码:

create user 'vincent'@'localhost' identified by 'password';

上述语句创建了一个用户名为vincent的账号,并且限制只能从本地(localhost)登录。这里的主机名也可以用IP地址、网段、域名等替代:

create user 'vincent'@'192.168.3.8' identified by 'password';

create user 'vincent'@'192.168.1.%' identified by 'password';

create user 'vincent'@'%.example.com' identified by 'password';

虽然账号名都是vincent,但他们都是独立的账号,只能从限定的Host登录,其中%代表通配符,如果主机名用%代替,那么则代表该用户可以从任何地方登录。

如果在创建账号时忽略了Host部分,则MySQL默认该账号可以从任何地方登录(host被设置为%):

create user 'vincent' identified by 'password';

select user,host from mysql.user where user='vincent';

在创建账号时,账号的认证插件会使用系统的默认设置(由参数 default_authentication_plugin控制):

show variables like 'default_authentication_plugin';

你也可以在创建账号时使用with ‘plugin’子句显式指定认证插件:

create user 'vincent'@'192.168.3.8' identified with 'sha256_password' by 'password';

上面显示指定了sha256_password作为改账号的认证插件。

三、账号权限管理

当账号刚创建时,默认只有一个USAGE权限,即仅可以连接到服务器。你还需要为账号进行赋权才可以使用,赋权时要遵循最小适用原则,即仅对用户赋予满足其需求的最小权限。

MySQL的权限有很多,可以通过show privileges命令查看所有的权限,权限后面有相应的注释:

show privileges;

上述命令查看的是权限明细,你也可以用关键字all来替代所有权限,all的权限非常高,慎用。即使要使用,也应限制在一定的范围内。

3.1 权限赋予与回收

权限的赋予是通过grant语句完成的,语句格式为:grant '权限' on '对象' to '账号';

我们先建一个测试数据库和表:

create database mydb;

use mydb;

create table mytable(id int primary key, name varchar(32));

下面演示几种常用的赋权操作:

3.1.1 库级赋权

可以用db_name.*来对某数据库下所有对象统一赋权:

grant select on mydb.* to 'vincent'@'localhost';

mydb.* 代表了mydb数据下所有的对象,上面语句赋予了查询该数据库下所有对象的权限。

如果有多项权限需要赋予,可以用逗号分隔:

grant insert,delete,update on mydb.* to 'vincent'@'localhost';

上述语句赋予了mydb数据库下所有对象的增、删、改权限。

给用户赋予数据库下所有对象(mydb.*)上的所有权限(all):

grant all on mydb.* to 'vincent'@'localhost';

权限all代表了数据库mydb下的所有权限,使用时要小心。

如果在赋权的语句后面跟上with grant option,则该用户可以继续为其他用户赋权,可能导致权限泛滥,不推荐使用:

grant all on mydb.* to 'vincent'@'localhost' with grant option;

3.1.2 表级赋权

有些时候,我可能想限制用户只能查询特定的表,我们可以用db_name.table来将权限限制在表级别:

给用户'vincent'@'localhost'赋予数据库mydb下mytable表的读取权限:

grant select on mydb.mytable to 'vincent'@'localhost';

3.1.3 列级赋权

如果我想将用户的选项限定到列,可以在相应的权限后指定列名:

给用户'vincent'@'localhost'赋予数据库mydb下mytable表name列的查询和更新权限:

grant select(id,name), update(name) on mydb.mytable to 'vincent'@'localhost';

上述select(id,name), update(name),将查询权限限定在id,name列,将更新权限限定在name列。

3.1.4 存储过程和函数赋权

如果要赋予存储过程或函数的相关权限,只需要带上procedure或function关键字即可:

grant execute on procedure sys.execute_prepared_stmt to 'vincent'@'localhost';

grant execute on function sys.version_patch to 'vincent'@'localhost';

3.1.5 权限查询

赋权后,我们可以通过show grants for '账号',来查询某账号被赋予权限:

show grants for 'vincent'@'localhost';

如果仅执行show grants; 命令(没有for子句),那么就是查询自己的权限。

3.1.6 权限回收

权限回收是通过revoke语句完成的,格式和赋权相同,只是将grant关键字替换为revoke,to关键字替换为from。格式为:revoke '权限' on '对象' from '账号';

revoke execute on procedure sys.execute_prepared_stmt from 'vincent'@'localhost';

3.2 通过角色集中管理权限

上面的示例都是针对账号直接赋权,如果有很多用户有相似的权限,那么为每个用户独立赋权就很麻烦了,这种场景可以利用角色(role)来集中管理权限。

角色(role)是权限的集合,你可以将权限赋给角色,然后将角色赋给账号,这会方便权限的集中管理,如果涉及通用权限调整,只需要调整角色的权限即可,部分用户如果需要特别的权限,可以单独赋予。

下面创建2个角色,分别对应普通用户组和管理员组:

create role user_group, admin_group;

普通组只有mydb下查询权限,管理员组具有所有权限:

grant select on mydb.* to user_group;

grant all on mydb.* to admin_group;

最后只要将角色赋给相应的账号即可:

grant user_group to 'vincent'@'localhost';

四、账号密码管理

在建立账号时,我们会指定密码,有时候这可能是一个初始密码,需要用户自己去修改。

4.1 修改账号密码

修改自己的密码通过set password语句来修改自己的密码,语句格式为:set password='密码';

下面的语句将自己账号的密码修改为vincent:

set password='vincnet';

如果你有权限替别人修改密码,可以用set password for或者alter user语句来修改别人的密码:

set password for 'vincent'@'localhost'='password';

alter user 'vincent'@'localhost' identified by 'password';

上面两个语句的效果是相同的,任意选择一种即可。

4.2 强制用户修改密码

某些场景我们需要强制用户修改密码,只需要将用户密码的状态设置为"过期",当密码的状态为过期时,账号允许连接至数据库,但是在修改密码前不会允许其他操作,由此来强制用户修改密码。

将单一账号密码状态设置为过期:

alter user 'vincent'@'localhost' password expire;

如果需要将一批账号同时设置为过期,可以通过update语句将myql.user表的password_expired字段批量设置为'Y',效果是一样的:

update mysql.user set password_expired='Y' where user='vincent' and host='localhost';

flush privileges;

update之后记得flush privileges重载权限表,否则不会生效。如果用alter user则不需要。

'vincent'@'localhost'密码失效后,执行其他语句报错(提示修改密码),只有修改密码后,限制才解除:

show databases;

set password='password';

show databases;

4.3 强制密码复杂度

通常情况下,MySQL是不会要求密码强度的,用户可以任意输入简单密码。如果要限制密码满足一定的强度规则,我们可以利用MySQL自带的validate_password插件来控制。

4.3.1 安装控制插件

默认该插件是没有安装的,我们要先安装该插件:

install plugin validate_password soname 'validate_password.so';


插件的目录可以通过变量plugin_dir来查看,在操作系统的该目录下,我们可以搜到该插件:

select @@plugin_dir;

cd /usr/local/mysql/lib/plugin/

ll | grep validate_password

4.3.2 设置强度控制变量

插件安装好之后,我们就可以查看相关的控制变量了,通过修改变量的值,可以控制修改密码的强度要求:

show variables like 'validate_password%';

各个变量含义说明如下:

  • validate_password_check_user_name:检查密码是否和用户名相似,默认就是打开的。
  • validate_password_dictionary_file:密码字典值,用来排除部分密码。
  • validate_password_length: 密码的最小长度。
  • validate_password_mixed_case_count:密码字母大小写混合数量,默认1代表至少1个大小字母和1个小写字母。
  • validate_password_mixed_number_count:密码必须包含的数字数量,默认1代表至少1个数字。
  • validate_password_special_char_count:密码至少包含的特殊字符数量,默认1代表至少1个特殊字符。
  • validate_password_policy:强度检测等级,有low, medium, strong共3个等级,默认为medium。

值为low时,仅检测一项密码长度。

值为medium时,检查密码长度,混合大小写,数字数量和特殊字符4项。

值为strong时,还会额外增加限制,密码不能与字典值文件(validate_password_dictionary_file)中密码相同,用来排除设置某些密码。

我们可以根据自己的需要修改这些,变量的值:

set global validate_password_length=10;

set global validate_password_mixed_case_count=2;

set global validate_password_number_count=2;

这里我修改了密码最小长度为10,必须有2个大小写混合,2个数字。

为了防止重启后丢失,推荐将其放到配置文件[mysqld]模块中:

[mysqld]
plugin-load-add=validate_password.so
validate_password_length=10
validate_password_mixed_case_count=2
validate_password_number_count=2
validate_password_special_char_count=1

4.3.3 强度控制测试

完成上面的配置后,密码强度控制就已经生效了。这些规则只会影响未来修改密码或者新建用户的操作,并不影响已有账户。

给vincent账号改一个简单的密码,提示密码不满足当前策略:

set password for 'vincent'@'localhost'='weakpassword';

可以通过函数validate_password_strength来评估密码的强度(0最弱,100最强):

select validate_password_strength('abc');

select validate_password_strength('Asda@#9asC7U');

只能设置满足强度的密码:

set password for 'vincent'@'localhost'='12aaAA@890';

密码'12aaAA@890',长度10位,包含5个数字,2个小写字母,2个小写字母,一个特殊字符,满足强度要求,修改成功。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringMVC自定义注解---[详细介绍]

一,对于SpringMVC自定义注解概念 是一种特殊的 Java 注解,它允许开发者在代码中添加自定义的元数据,并且可以在运行时使用反射机制来获取和处理这些信息。在 Spring MVC 中,自定义注解通常用于定义控制器、请求处理方法、参数或者…

Linux CentOS7系统运行级别

运行级别就是Linux操作系统当前正在运行的功能级别。在早期系统设置中,共设有七个运行级别,编号从0到6。系统可以引导到任何给定的运行级别。 每个运行级别指定不同的系统配置,并允许访问不同的进程组合。默认情况下,Linux会引导…

[C++ 网络协议] 多种I/O函数

1. Linux的send&recv函数 1.1 send函数和recv函数 #include <sys/socket.h> ssize_t send( int sockfd, //套接字文件描述符 const void* buf, //保存待传输数据的缓冲地址值 size_t nbytes, //待传输的字节数 int flags …

Layui快速入门之第六节 选项卡

目录 一&#xff1a;基本概念 选项卡依赖element模块 API 元素属性 基本使用&#xff1a; 二&#xff1a;选项卡风格 默认风格 简约风格 ​编辑 卡片风格 三&#xff1a;hash 状态匹配 四&#xff1a;tab相关操作 渲染 tab 添加 tab 删除 tab 切换 tab 自定义…

华为云云耀云服务器L实例评测 | 基于docker部署nacos2.2.3服务

#【有奖征文】华为云云服务器焕新上线&#xff0c;快来亲身感受评测吧&#xff01;# &#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&…

C++之哈希表、哈希桶的实现

哈希表、哈希桶的实现 哈希概念哈希冲突哈希函数哈希冲突解决闭散列哈希表闭散列实现哈希表的结构哈希表的插入哈希表的查找哈希表的删除 开散列开散列概念哈希表的结构哈希表的插入哈希表的查找哈希表的删除 哈希概念 顺序结构以及平衡树中&#xff0c;元素关键码与其存储位置…

Postman使用_Tests Script(断言测试)

断言测试可以在Collection、Folder和Request的 pre-request script 和 test script中编写&#xff0c;测试脚本可以检测请求响应的各个方面&#xff0c;包括正文、状态代码、头、cookie、响应时间等&#xff0c;只有测试符合自定义的要求后才能通过。 pm对象提供了测试相关功能…

LiveNVR监控流媒体Onvif/RTSP功能-支持海康摄像头海康NVR通过EHOME协议ISUP协议接入分发视频流或是转GB28181

LiveNVR支持海康NVR摄像头通EHOME接入ISUP接入LiveNVR分发视频流或是转GB28181 1、海康 ISUP 接入配置2、海康设备接入2.1、海康EHOME接入配置示例2.2、海康ISUP接入配置示例 3、通道配置3.1、直播流接入类型 海康ISUP3.2、海康 ISUP 设备ID3.3、启用保存3.4、接入成功 4、相关…

SadTalker 让图片说话

参考&#xff1a;https://github.com/OpenTalker/SadTalker 其他类似参考&#xff1a;https://www.d-id.com/ 输入图片加音频产生2d视频 安装使用 1、拉取github&#xff0c;下载对应安装库 2、下载对应模型baidu网盘 新建checkpoints&#xff0c;把下载sadtalker里模型拷贝进…

Docker 的使用

一、Docker 的作用和优势 软件集装箱化平台&#xff0c;可让开发者构建应用程序时&#xff0c;将它与环境一起打包到一个容器中&#xff0c;发布应用到任意平台中。 能在单台机器上运行多个Docker微容器&#xff0c;而每个微容器里都有一个微服务或独立应用&#xff0c; 如&am…

汽车行业新闻稿怎么写?怎么写关于汽车的新闻稿?

撰写汽车行业新闻稿需要遵循一定的结构和要点&#xff0c;以确保内容准确、清晰&#xff0c;并能吸引读者的兴趣。以下是关于汽车的新闻稿的一些写作要点和建议&#xff0c;接下来伯乐网络传媒就来给大家分享一下&#xff1a; 标题醒目&#xff1a;新闻稿的标题应该简洁明了&am…

多视角姿势估计:TEMPO: Efficient Multi-View Pose Estimation, Tracking, and Forecasting

论文作者&#xff1a;Rohan Choudhury,Kris Kitani,Laszlo A. Jeni 作者单位&#xff1a;Carnegie Mellon University 论文链接&#xff1a;http://arxiv.org/abs/2309.07910v1 内容简介&#xff1a; 1&#xff09;方向&#xff1a;多视角姿势估计模型 2&#xff09;应用&…

$value$plusargs字符串参数传递后如何随机

文章目录 前言一、背景二、解决办法总结 前言 在仿真过程中&#xff0c;经常在命令行通过$value$plusargs传递一个字符串到环境中&#xff0c;去选择不同的sequence&#xff0c;但是&#xff0c;有些时候需要随机选择其中某几个seq&#xff0c;而只有整数和枚举类型可以随机&a…

Ubuntu20.04安装Nvidia显卡驱动、CUDA11.3、CUDNN、TensorRT、Anaconda、ROS/ROS2

1.更换国内源 打开终端&#xff0c;输入指令&#xff1a; wget http://fishros.com/install -O fishros && . fishros 选择【5】更换系统源&#xff0c;后面还有一个要输入的选项&#xff0c;选择【0】退出&#xff0c;就会自动换源。 2.安装NVIDIA驱动 这一步最痛心…

腾讯mini项目-【指标监控服务重构】2023-08-03

今日已办 a&#xff0c;b两组的trace放到一个分支里 可以看到先前的没看到的 profile trace 的耗时&#xff0c;是由于时间跨度较长&#xff0c;没有滑动到 trace 末尾 明日待办 组长会议汇报项目进度和问题

我跟面试官说MySQL单表数据量不要超过两千万,面试官不信

&#x1f449;导读 作为一个合格的 DBA&#xff0c;在遇到线上单表数据量超过千万级别的时候&#xff0c;往往会建议用户通过分表来缩减单表数据量&#xff0c;当用户问为什么单表数据量不能超过千万时&#xff0c;DBA 往往会说&#xff1a;单表数据量超过千万&#xff0c;会影…

搜好货API接口解析,实现获得搜好货商品详情

要解析搜好货API接口并实现获取搜好货商品详情&#xff0c;你需要按照以下步骤进行操作&#xff1a; 了解搜好货开放平台&#xff1a;访问搜好货开放平台官网&#xff0c;找到API接口相关的开发者文档、指南等信息。注册开发者账号&#xff1a;在搜好货开放平台上注册一个开发…

C#开发的OpenRA游戏之调试菜单2

C#开发的OpenRA游戏之调试菜单2 前面已经分析了怎么样通过选项参数来打开这个调试界面,当创建游戏之后,从游戏里选择参数按钮,就会弹出下面的界面,如果没有选择调试参数是没有Debug这一页选项卡: 上面调试的选项是非常有用的,否则不能快速地测试游戏,不能快速地开发新的…

列表页面新增 字段查询 ,点击查询后,前端页面和后端控制台 出现红色报错信息,查询数据失败。

项目场景&#xff1a; 项目场景简述&#xff1a; 列表页面新增 字段查询 &#xff0c;点击查询后&#xff0c;前端页面和后端控制台 出现红色报错信息&#xff0c;查询数据失败。 问题描述 问题描述&#xff1a; <el-select v-model"dataForm.engineerId" clea…

类和对象(4)

文章目录 1. C/C内存分布2. C语言中动态内存管理方式&#xff1a;malloc/calloc/realloc/free3.C内存管理方式new/delete3.1 new/delete操作内置类型3.2 new/delete操作自定义类型 4. operator new和operator delete函数&#xff08;重点&#xff09;4.1底层原理 5.malloc/free…