MySQL 用户账号管理(Accounts Management)

用户需要通过账号连接到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.rhkb.cn/news/135697.html

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

相关文章

43.MQ—RabbitMQ

目录 一、MQ—RabbitMQ。 (1)同步调用与异步调用。 (1.1)同步调用。 (1.2)异步调用。 (2)MQ之间的区别。 (3)RabbitMQ学习。 (3.1&#xf…

Ansys Zemax | 光学系统设计中如何使用玻璃替换方法来优化玻璃

在光学系统中选择最优玻璃材料时,Conrady d-D以及模型玻璃等传统的玻璃选择方法提供的帮助有限。本文介绍了如何使用玻璃替换方法进行直接玻璃优化,以及在考虑玻璃的可用性、成本及耐候性等因素时,如何进一步严格挑选玻璃。 简介 玻璃替换方法…

目标检测前言,RCNN,Fast RCNN,Faster RCNN

一、RCNN: 找到概率最高的目标之后,与其他目标进行IOU交并比计算,若高于一定值,则说明这两张图片预测的是同一个目标,则把概率低的目标删掉 二、Fast RCNN 因为是直接得到特征图之后进行映射,所以不限制输入…

电脑提示丢失MSVCP140.dll是什么意思,总结5个MSVCP140.dll丢失的解决分享

在计算机使用过程中,有时候会出现一些异常情况,比如丢失 MSVCP140.dll 文件。MSVCP140.dll 是 Microsoft Visual C 2015 Redistributable 的一部分,它包含了一些在 C 编程时需要的函数和类。许多程序和游戏都需要依赖这个文件来正常运行。一旦…

u盘内容防止复制(U盘内数据防拷贝的方法)

随着科技的发展,U盘已经成为我们日常生活和工作中不可或缺的一部分。然而,U盘的普及也带来了一些问题,如数据泄露、病毒传播等。因此,保护U盘中的数据安全变得尤为重要。 方法一:设置文件权限 打开U盘,找到…

华为aarch64架构的泰山服务器EulerOS 2.0 (SP8)系统离线安装saltstack3003.1实践

华为泰山服务器的CPU芯片架构为aarch64,所装系统为EulerOS 2.0 (SP8)aarch64系统,安装saltstack比较困难。本文讲解通过pip安装方式离线安装saltstack3003.1以进行集中化管理和维护。 一、系统环境 1、操作系统版本 [rootlocalhost ~]# cat /etc/os-r…

如何将本地的项目上传到Git

一、GitHub or GitLab or Gitee创建一个新的仓库 二、仓库路径创建成功后,将本地项目上传到git 1. 进入本地项目所在文件夹位置,右击 2.出现git命令框 输入git init 在当前项目的目录中生成本地的git管理(会发现在当前目录下多了一个.git文件…

Redis模块二:缓存分类 + Redis模块三:常见缓存(应用)

缓存大致可以分为两大类:1)本地缓存 2)分布式缓存 目录 本地缓存 分布式缓存 常见缓存的使用 本地缓存:Spring Cache 分布式缓存:Redis 本地缓存 本地缓存也叫单机缓存,也就是说可以应⽤在单机环…

DirectX12(d3d12)初始化

一、前置要求 Windows 10及以上(安装有DirectX12)VisualStudio 2022 二、DirectX12入门 1.引用头文件 #include<Windows.h> #include<d3d12.h> #include<dxgi1_4.h>2.注册窗口类并初始化窗口 这里我们调用Windows API 通过应用程序的句柄来注册一个唯一…

Maven 安装配置

Maven 安装配置 文章目录 Maven 安装配置一、下载 Maven二、解压Maven核心程序三、指定本地仓库四、配置阿里云镜像仓库4.1 将原有的例子配置注释掉4.2 加入新的配置 五、配置 Maven 工程的基础 JDK 版本六、配置环境变量6.1 检查 JAVAHOME 配置是否正确6.2 配置 MAVENHOME6.3 …

已解决 Kotlin Error: Type mismatch: inferred type is String but Int was expected

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页: &#x1f405;&#x1f43e;猫头虎的博客&#x1f390;《面试题大全专栏》 &#x1f995; 文章图文并茂&#x1f996…

007-第一代软件需求整理

第一代软件需求整理 文章目录 第一代软件需求整理项目介绍需求来源需求来源1&#xff1a;竞品软件分析需求来源2&#xff1a;医生&#xff08;市场&#xff09;需求来源3&#xff1a;项目组内部需求来源4&#xff1a;软件组内部需求来源5&#xff1a;软件开发成员需求来源6&…

Python 元组的常用方法

视频版教程 Python3零基础7天入门实战视频教程 下标索引用法和列表一样&#xff0c;唯一区别就是不能修改元素 实例&#xff1a; # 下标索引用法和列表一样&#xff0c;唯一区别就是不能修改元素 t1 ("java", "python", "c") # t1[1] "…

95.qt qml-诺谦通用可扩展多功能QML界面

支持如下所示: 1.可扩展多功能交互&#xff0c;用户可以根据自己喜欢使用常用功能&#xff0c;针对多功能项目非常有用&#xff01;2.登录用户信息显示&#xff0c;历史消息显示&#xff0c;皮肤黑白风格切换 如下图所示: 自带一个功能界面&#xff0c;可以通过功能界面添加不…

Python爬虫:获取必应图片的下载链接

文章目录 1. 前言2. 实现思路3. 运行结果 1. 前言 首先&#xff0c;说明一下&#xff0c;本篇博客内容可能涉及到版权问题&#xff0c;为此&#xff0c;小编只说明一下实现思路&#xff0c;至于全部参考代码&#xff0c;小编不粘贴出来。不过&#xff0c;小编会说明详细一些&a…

0918hw

字节序概念&#xff1a; 字节序是不同cpu主机&#xff0c;存储多字节整数序列的存储方式 1.大端存储&#xff1a;低字节序存储在地址高位 2.小端存储&#xff1a;低字节序存储在地址低位 3.无论大小端存储&#xff0c;首地址都是低地址&#xff0c;数据都是先读取低地址&am…

三维模型3DTILE格式轻量化压缩主要技术方法浅析

三维模型3DTILE格式轻量化压缩主要技术方法浅析 三维模型3DTILE格式轻量化压缩主要技术方法浅析 随着三维地理空间数据的应用日益广泛&#xff0c;为了更快速地传输和存储这些大规模数据&#xff0c;3DTile格式的轻量化压缩显得尤为重要。本文将浅析关于三维模型3DTile格式轻量…

Vulnhub系列靶机-Hackadmeic.RTB1

文章目录 Vulnhub系列靶机-Hackadmeic.RTB11. 信息收集1.1 主机扫描1.2 端口扫描1.3 目录爆破 2. 漏洞探测3. 漏洞利用3.1 反弹Shell 4. 内核提权 Vulnhub系列靶机-Hackadmeic.RTB1 1. 信息收集 1.1 主机扫描 arp-scan -l1.2 端口扫描 nmap -A -p- 192.168.188.184扫描到了…

7.代理模式

1.UML 2.代码 #include <iostream> using namespace std;class Subject{ public:virtual void Request() 0; };class RealSubject:public Subject { public:virtual void Request(){cout << "RealSubject" << endl;} }; class Proxy:public Subj…

前端项目开发流程

一 参加需求对称(评审)会议 时间&#xff1a;在产品设计完成以后&#xff0c;进入正式的开发流程之前 组织者&#xff1a;产品&项目经理 目的&#xff1a;统一大家对产品的认识&#xff0c;及时发现产品设计缺陷&#xff0c;尽可能降低后续修改需求的频率 参与者&#xff…