从 01 开始 从 01 开始
首页
  • 计算机简史
  • 数字电路
  • 计算机组成原理
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • MySQL
  • Git
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 输入法
  • 浏览器
  • 终端软件
  • 装机
  • 笔记类软件
  • Markdown
  • 微信
  • 各大平台
  • RSS
  • Office
  • 手机
  • 校招
  • 五险一金等
  • 职场规划
  • 关于离职
  • 杂谈
  • 教程简介
  • 英语学习方法论
  • 字母
  • 音标
  • 单词
  • 语法
  • 英语兔的相关视频
  • Larry 想做技术大佬的相关视频
  • 驾驶技能
  • 住房相关
  • 厨艺
  • 关于税
  • 理财
  • 睡眠
  • 皮肤
  • 口腔健康
  • 学会呼吸
  • 健身日志
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • 三国杀
  • 关于本站
  • 关于我
  • 网站动态
  • 友人帐
  • 打赏
  • 如何搭建一个博客
  • 关于邮件服务器
  • 本站的分享资料
  • 年度总结

    • 2022 年度总结
    • 2023 年度总结
  • 文章分类
  • 文章标签
  • 文章归档

PeterJXL

首页
  • 计算机简史
  • 数字电路
  • 计算机组成原理
  • 操作系统
  • Linux
  • Docker
  • 计算机网络
  • 计算机常识
  • MySQL
  • Git
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 输入法
  • 浏览器
  • 终端软件
  • 装机
  • 笔记类软件
  • Markdown
  • 微信
  • 各大平台
  • RSS
  • Office
  • 手机
  • 校招
  • 五险一金等
  • 职场规划
  • 关于离职
  • 杂谈
  • 教程简介
  • 英语学习方法论
  • 字母
  • 音标
  • 单词
  • 语法
  • 英语兔的相关视频
  • Larry 想做技术大佬的相关视频
  • 驾驶技能
  • 住房相关
  • 厨艺
  • 关于税
  • 理财
  • 睡眠
  • 皮肤
  • 口腔健康
  • 学会呼吸
  • 健身日志
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • 三国杀
  • 关于本站
  • 关于我
  • 网站动态
  • 友人帐
  • 打赏
  • 如何搭建一个博客
  • 关于邮件服务器
  • 本站的分享资料
  • 年度总结

    • 2022 年度总结
    • 2023 年度总结
  • 文章分类
  • 文章标签
  • 文章归档
  • 计算机历史

  • 数字电路

  • 计算机组成原理

  • 操作系统

  • Linux

  • 计算机网络

  • Git

  • 计算机小知识

  • MySQL

    • 教程概述
    • 数据的存储
    • 数据库的安装
    • 数据库的启停与连接
    • 数据库的管理
    • SQL概述
    • 表的管理
    • seletct基础
    • 运算符
    • 聚合查询
    • 排序
    • 数据的插入
    • 数据的删除
    • 数据的更新
    • 事务
    • 视图
    • 子查询
    • 函数
    • 谓词
    • CASE表达式
    • 集合运算
    • 联结-join
    • SQL入门小结
    • 更多数据库
    • MySQL的数据类型
    • 命令行的一些用法
    • 用户与权限管理
      • 用户管理
      • 权限管理
      • 参考
    • MySQL的权限管理
    • mysqldump
    • mysqladmin
    • Liquibase
    • 表注释与字段注释
    • 编码类型
  • 计算机基础
  • MySQL
2024-01-21
目录

用户与权限管理

# 275.用户与权限管理

‍

用户与权限管理主要有以下作用:

  1. 对用户进行增删改查
  2. 对用户进行密码管理
  3. 限制用户登录的IP或域名
  4. 限制用户访问哪些库、哪些表
  5. 限制用户对哪些表执行SELECT、CREATE、DELETE、DELETE、ALTER等操作
  6. 限制用户自己的权限是否可以授权给别的用户

‍

‍

‍

# 用户管理

‍

‍

‍

# 查看当前用户

mysql> select user();
+----------------+
| user()         |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec)
1
2
3
4
5
6
7

‍

‍

# 查看所有用户

select user, host from mysql.user;
+------------------+-----------+
| user             | host      |
+------------------+-----------+
| mysql.infoschema | localhost |
| mysql.session    | localhost |
| mysql.sys        | localhost |
| root             | localhost |
+------------------+-----------+
1
2
3
4
5
6
7
8
9

‍

‍

‍

# 创建用户

在对 MySQL 的日常管理和操作中,为了避免有人恶意使用 root 用户控制数据库,我们通常创建一些具有适当权限的用户,尽可能地不用或少用 root 用户登录系统,以此来确保数据的安全访问。

-- 命令格式:
CREATE USER 'username'@'host' IDENTIFIED BY 'password';
1
2

字段说明:

  • username:用户名
  • host:指定该用户在哪个主机(IP或域名)上可以登录。如果是本地用户可用localhost,如果想让该用户可以从任意远程主机登陆,可以使用通配符%
  • password:登录密码

‍

‍

‍

举例:

CREATE USER 'dog'@'localhost' IDENTIFIED BY 'Aa123456';
CREATE USER 'pig'@'192.168.1.101' IDENDIFIED BY 'Aa123456';
CREATE USER 'pig'@'%' IDENTIFIED BY 'Aa123456';
1
2
3

‍

‍

# 删除用户

语法:

drop user '用户名'@'IP 地址';
1

‍

‍

# 修改用户名

--语法:
rename user '用户名'@'IP 地址' to '新用户名'@'IP 地址';


-- 例如:
rename user 'pig'@'%' to 'pig2'@'%';
1
2
3
4
5
6

‍

‍

‍

# 修改密码

语法:

alter user '用户名'@'IP 地址' identified by '新密码'; 

-- 例如:
alter user 'pig2'@'%' identified by 'Aa123456';
1
2
3
4

‍

ps:在MySQL5版本中,还有如下方式修改密码

  • set password for 用户名@localhost = password('新密码');
  • update user表,例如:update user set password=password('Aa12345') where user='root' and host='localhost';

但其实不推荐这样做,首先这两个命令在MySQL8不能用,而alter语句在 MySQL 5.7 开始就能用了;

其次,update user表需要的权限比较高,而在工作中为了安全,我们通常是不能使用root等权限比较高的用户;

‍

‍

这里说个题外话:工作中是如何管理数据库密码的

  1. 密码分成两半,保存在安全部门中。
  2. 如果要使用,需要两人申请密码;
  3. 输入密码时,一人输入一半(不能明文输入)
  4. 定期修改密码

‍

# 刷新权限

在修改完用户密码后,需要刷新权限,以使修改生效:

FLUSH PRIVILEGES;
1

‍

‍

# 限制登录次数

随着MySQL 数据库被越来越多的金融场景使用,类似连续输错银行卡密码而导致的锁卡功能呼之欲出。

MySQL 从 8.0.19 开始,就推出了类似策略:Failed-Login Tracking and Temporary Account Locking 。 翻译过来就是 失败登录追踪和临时密码锁定,后面我们简称为:FLTTAL 。

‍

举例:

alter user 'pig2'@'%' failed_login_attempts 3 password_lock_time 3;
1

说明:

  • failed_login_attempts N:N代表输错次数。输错N次则禁用。
  • password_lock_time N:代表禁用天数
  • failed_login_attempts 和 password_lock_time 必须同时不为 0 ,FLTTAL 才能生效。(反之,如果想要取消用户的登录限制,则设置为0)
  • 被禁用后,即使输入正确密码也无法登录。
  • 任意一次成功登录,FLTTAL 计数器重置。例如 failed_login_attempts 设置为 3 ,前两次密码连续输错,第三次输入正确的密码,FLTTAL 计数器会重置。

‍

测试:

mysql -upig2 -p111 -P3307
mysql -upig2 -p111 -P3307
mysql -upig2 -p111 -P3307
ERROR 3955 (HY000): Access denied for user 'pig2'@'localhost'. Account is blocked for 3 day(s) (3 day(s) remaining) due to 3 consecutive failed logins.
1
2
3
4

‍

‍

‍

ps:也可以在创建用户的时候,就指定登录次数:

create user 'pig'@'%' identified by 'Aa123456' failed_login_attempts 3 password_lock_time 3;
1

如果创建新用户不指定 failed_login_attempts 和 password_lock_time ,则默认关闭 FLTTAL 。

‍

# 解除禁用

有如下方法:

  1. 到期自动解除
  2. 让管理员执行unlock命令,alter user pig2@'%' account unlock;
  3. 执行 FLUSH PRIVILEGES,刷新用户权限数据
  4. 管理员重新更改 failed_login_attempts 或者 password_lock_time 选项,FLTTAL 计数器重置。
  5. 重启MySQL

‍

‍

# DBA

在数据库领域中,还有一种称为DBA的角色。DBA全称Database Administrator,数据库管理员,通常由运维人员负责。

开发人员平时没有root权限,只有一个普通用户的权限,只对某个数据库有权限

‍

# 权限管理

‍

# 授权

默认情况下新用户是没有任何操作权限的:


mysql> use shop;
ERROR 1044 (42000): Access denied for user 'pig'@'%' to database 'shop'

mysql> use mysql;
ERROR 1044 (42000): Access denied for user 'pig'@'%' to database 'mysql'
1
2
3
4
5
6

‍

此时就得授权。语法:

grant 权限 列名 on 数据库名.表名 to '用户名'@'IP 地址' with grant option;
1

说明:

  • 权限:例如select权限,update权限,多个权限用逗号分割。授权全部权限则使用all privileges
  • 列名:可选项,表示权限作用于哪些列上,省略该参数时,表示作用于整个表;
  • 数据库名.表名(或存储过程名):对哪个数据库的哪张表(或存储过程)有权限,可以用星号 * 表示所有。
  • to:将权限授予哪个用户
  • with grant option:可选项,表示允许用户将自己的权限授权给其它用户
  • 授权后,记得刷新下权限FLUSH PRIVILEGES;

权限是可以叠加的,不会覆盖之前授予的权限,比如你给用户添加一个select权限,后来又给用户添加了一个update权限,那么该用户就同时拥有了select和update权限。

‍

‍

‍

举例:将所有数据库的所有操作权限,授权给pig2用户

grant all privileges on *.* to 'pig2'@'%'  with grant option;
1

‍

MySQL 中可以授予的权限有如下几组:

  • 列权限,和表中的一个具体列相关。例如,可以使用 UPDATE 语句更新表 students 中 name 列的值的权限。
  • 表权限,和一个具体表中的所有数据相关。例如,可以使用 SELECT 语句查询表 students 的所有数据的权限。
  • 数据库权限,和一个具体的数据库中的所有表相关。例如,可以在已有的数据库 mytest 中创建新表的权限。
  • 用户权限,和 MySQL 中所有的数据库相关。例如,可以删除已有的数据库或者创建一个新的数据库的权限。

‍

这里列出部分权限,更多可以参考官方文档 (opens new window):

Privilege Grant Table Column Context
ALL [PRIVILEGES] Synonym for “ all privileges ” Server administration
ALTER Alter_priv Tables
ALTER ROUTINE Alter_routine_priv Stored routines
CREATE Create_priv Databases, tables, or indexes
CREATE ROLE Create_role_priv Server administration
..... ..... ......

‍

‍

‍

# 查看用户权限

show grants for '用户名'@'IP地址';
1

‍

例如:

-- 新建一个用户来测试:
create user 'testgrant'@'%' identified by 'Aa123456';

-- 授权:
grant select,create,drop,update,alter on *.* to 'testgrant'@'%' with grant option;

-- 查看权限:
show grants for 'testgrant'@'%';
+---------------------------------------------------------------------------------------+
| Grants for testgrant@%                                                                |
+---------------------------------------------------------------------------------------+
| GRANT SELECT, UPDATE, CREATE, DROP, ALTER ON *.* TO `testgrant`@`%` WITH GRANT OPTION |
+---------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
1
2
3
4
5
6
7
8
9
10
11
12
13
14

‍

‍

# 回收权限

-- 语法:
revoke 权限名 on *.* from '用户名'@'IP地址';

-- 例如从testgrant用户手里回收create权限
revoke create on *.* from 'testgrant'@'%';



-- 再次查看(如果没生效,则刷新下 flush privileges;):
show grants for 'testgrant'@'%';
+-------------------------------------------------------------------------------+
| Grants for testgrant@%                                                        |
+-------------------------------------------------------------------------------+
| GRANT SELECT, UPDATE, DROP, ALTER ON *.* TO `testgrant`@`%` WITH GRANT OPTION |
+-------------------------------------------------------------------------------+
1 row in set (0.00 sec)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

‍

‍

# 参考

mysql grant 用户权限总结_mysqlgrant-CSDN博客 (opens new window)

新特性解读 | MySQL 8.0 新密码策略(终篇) - 知乎 (opens new window)

‍

上次更新: 2024/1/23 16:20:41
命令行的一些用法
MySQL的权限管理

← 命令行的一些用法 MySQL的权限管理→

Theme by Vdoing | Copyright © 2022-2024 | 粤 ICP 备 2022067627 号-1 | 粤公网安备 44011302003646 号 | 点击查看十年之约
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式