学习目标

  • 权限表及其用法
  • 账户管理
  • 权限管理
  • 访问控制

权限表

MySQL权限表存放在MySQL数据库里,由mysql_install_db脚本初始化。这些MySQL权限表分别为user、db、proxies_prv、servers、table_priv、 columns_priv、procs_priv表。

user表

user表记录允许连接到服务器上的用户账号信息,其中的权限是全局级的。  

该表一共有45个字段,分为四种字段类型:

  • 用户列:host、user、authentication_string。分别表示主机、用户名、密码。host和user为复合主键。登陆MySQL服务器必须匹配这三个字段,才允许用户建立连接;创建账户时保持了这三个字段的信息,修改密码需要修改authentication_string字段的值,使用SQL语句:
UPDATE mysql.user SET authentication_string=PASSWORD('密码') WHERE user='root';
 
  WAMP的MySQL5.7中,该表有两项记录,含义如下:
  ‘mysql.sys’@’localhost’:用于 sys schema中对象的定义。使用 mysql.sys 用户可避免DBA重命名或者删除root用户时发生的问题。该用户已被锁定,客户端无法连接。
  ‘root’@’localhost’:系统超级用户,推荐将root账号禁用或者删除,新建一个特权账号用于管理。
  • 权限列:数据类型为ENUM类型,Y表示拥有此权限,N表示没有权限。修改权限使用GRANT语句或者UPDATE语句更改表字段值进行修改.
  • 安全列

  

  

plugin为使用的安全验证插件,默认为mysql内置验证安全插件。

   使用命令查询mysql是否开启ssl支持。默认为禁用状态。

SHOW VARIABLES LIKE 'have_openssl';

  

  • 资源控制列
MAX_QUERIES_PER_HOUR    //每小时可发出的查询数
MAX_UPDATES_PER_HOUR //每小时可发出的更新数
MAX_CONNECTIONS_PER_HOUR //每小时可以链接服务器的次数
MAX_USER_CONNECTIONS //单一账户同时链接的数量

  

db表和servers表

db表存储了用户对某个数据库的操作权限,决定用户能够从哪个主机访问数据库。

servers表存储了主机和用户的对应关系,配合db表对给定主机上的数据库级操作权限进行进一步控制。

tables_priv表和columns_priv表

tableS_priv表用来对表设置操作权限。grantor表示修改该记录的用户。

columns_priv表用来对表中的某一列设置权限。

procs_priv表

该表对存储过程和函数设置操作权限。

账户管理

登陆和退出MySQL服务器

安装完成后mysql的超级用户默认密码为空,添加bin目录系统环境变量或者从wamp的控制台登录mysql服务器。

登陆:

完整语法格式:

mysql -h 主机 -u 用户名 -p密码 -P 端口号 数据库名 -e 执行SQL语句  //-p密码 中间不允许空格

 

登陆到myschool数据库:

登陆到myschool数据库并查询全部年级信息:

退出登录:mysql>exit

创建普通用户

创建用户的三种方式:

CREATE USER:在mysql.user表中添加用户。但是用户没有任何权限。

GRANT语句:添加用户的同时授予权限。

操作MySQL授权表:操作复杂。

1.使用CREATE USER创建用户(不推荐使用)

登陆数据库,创建用户tom、andy、mike,密码为123。

andy没有指定主机,默认为‘%’。(表示所有主机可以访问)

查询mysql.user表:

查询创建的三个用户,密码123被转换为:

所以在执行IDENTIFIED BY '密码'的时候,调用了PASSWORD()函数,生成明文密码的散列值。

使用‘123’密码的散列值设置sam用户的密码。使用IDENTIFIED BY PASSWORD。

CREATE USER 'sam'@'localhost' IDENTIFIED BY PASSWORD '*23AE809DDACAF96AF0FD78ED04B6A265E05AA257';

密码:

指定主机的表示方式:

"::1"、或者“127.0.0.1”、“localhost”:本机

“%”:所有主机

“192.168.10.%”:以192.168.10为网段的IP地址主机允许访问mysql服务器。

删除用户:

2.使用GRANT语句创建新用户(推荐使用)

使用CREATE USER创建的用户,需要使用GRANT命令进行授权。

使用GRANT语句创建的账户,在创建的时候可以同时进行授权,同时指定账户其他特性,包括安全连接、限制使用服务器资源等。

示例:创建tom用户,只能查询myschool.grade表数据。创建andy用户,只能向myschool.grade表添加和修改数据。创建sam用户,从任何一台主机登陆,对所有数据库和数据表都有CRUD权限。

#示例:
# 创建tom用户,只能查询myschool.grade表数据。
# 创建andy用户,只能向myschool.grade表添加和修改数据。
# 创建sam用户,从任何一台主机登陆,对所有数据库和数据表都有CRUD权限。
GRANT SELECT ON myschool.grade TO 'tom'@'localhost' IDENTIFIED BY '123';
GRANT INSERT,UPDATE ON myschool.grade TO 'andy'@'localhost' IDENTIFIED BY '123';
GRANT SELECT,INSERT,UPDATE,DELETE ON *.* TO 'sam'@'%' IDENTIFIED BY '123';

  

对tom用户进行测试:

删除用户:

DROP USER 'tom'@'localhost';
DROP USER 'andy'@'localhost';
DROP USER 'sam'@'%';

  

 3.直接操作user表(略,不推荐使用)

使用insert语句向mysql.user表插入用户。

root用户修改自身密码

 1.使用mysqladmin命令指定新密码

语法格式(在命令行窗口运行)

mysqladmin -u 用户名 -h localhost -p password  "新密码"

  

示例:

注意:新密码必须使用双引号;提示输入密码为旧密码。

2.修改mysql.user表

使用UPDATE语句修改root用户的密码。注意,5.7版本的mysql密码字段为:authentication_string,其余5.x版本的字段为password。

分为三步骤进行:第一步登陆;第二部UPDATE语句修改;第三部刷新权限表。注意在集成环境中SQL语句的字符串必须使用单引号,但是在控制台中单双引号都支持。

使用新密码登录:(-p后的密码不带空格)

3.使用SET语句修改密码

root用户登录到mysql服务器后使用SET命令修改:

修改完密码后需要刷新权限表或者重启mysql服务。

root用户修改普通用户密码

root用户拥有最高权限,可以使用SET、UPDATE和GRANT修改普通用户密码。

 1.使用SET命令修改

语法格式:

SET PASSWORD FOR '用户名'@‘主机’ = password('新密码')

  

如果是普通用户登录mysql服务器自行修改,语法格式如下:

SET PASSWORD = password('新密码')

  

示例:使用root用户修改tom的密码为456,在使用tom自行登录修改为123

示例中,使用root登陆,修改tom密码后,tom自行登录,再改回原密码123。

2.使用UPDATE语句修改

例如把tom用户的密码修改为888,修改后需要刷新权限表或者重启mysql服务。

UPDATE mysql.user SET authentication_string=PASSWORD('888') WHERE user='tom' AND host='localhost';
FLUSH PRIVILEGES;

  

3.使用GRANT语句修改

例如把tom的密码修改为tom123

GRANT USAGE ON myschool.grade TO 'tom'@'localhost' IDENTIFIED BY 'tom123';

  

普通用户修改密码

普通用户登录mysql服务器后,使用以下命令修改:

SET PASSWORD = password('新密码')

  

root用户密码遗失处理方法

1.停止mysql服务

如果mysql有注册为系统服务,使用命令net stop mysql停止服务。wamp则直接停止所有服务。

2.使用--skip-grant-tables选项启动mysql

在Linux系统中,使用mysqld_safe  --skip-grant-tables user=mysql启动。

初次使用,windows防火墙会提示是否允许该进程访问网络,选择允许。

3.另外打开一个命令行窗口,使用root空密码登录,执行UPDATE命令,更新user表的密码 

4.刷新权限表

1-4步骤如下图所示:

关闭所有命令行窗口,启动wamp,登陆mysql。

注意:可能导致mysql无法完全启动(不影响mysql操作),需要重启wamp或者windows系统。

授权管理

MySQL权限系统的主要功能是验证给定一台主机的用户,是否具有对数据库进行CRUD操作的权限。

MySQL的权限

账户权限信息保持在user、db、services、tables_priv、columns_priv、proc_priv表中。

1.权限

GRANT(授权)和REVOKE(取消授权)语句所涉及的权限名称如下表所示:

权限级别

权限说明

CREATE

数据库、表或索引

创建数据库、表或索引权限

DROP

数据库或表

删除数据库或表权限

GRANT OPTION

数据库、表或保存的程序

赋予权限选项

REFERENCES

数据库或表

ALTER

更改表,比如添加字段、索引等

DELETE

删除数据权限

INDEX

索引权限

INSERT

插入权限

SELECT

查询权限

UPDATE

更新权限

CREATE VIEW

视图

创建视图权限

SHOW VIEW

视图

查看视图权限

ALTER ROUTINE

存储过程

更改存储过程权限

CREATE ROUTINE

存储过程

创建存储过程权限

EXECUTE

存储过程

执行存储过程权限

FILE

服务器主机上的文件访问

文件访问权限

CREATE TEMPORARY TABLES

服务器管理

创建临时表权限

LOCK TABLES

服务器管理

锁表权限

CREATE USER

服务器管理

创建用户权限

PROCESS

服务器管理

查看进程权限

RELOAD

服务器管理

执行flush-hosts, flush-logs, flush-privileges, flush-status, flush-tables, flush-threads, refresh, reload等命令的权限

REPLICATION CLIENT

服务器管理

复制权限

REPLICATION SLAVE

服务器管理

复制权限

SHOW DATABASES

服务器管理

查看数据库权限

SHUTDOWN

服务器管理

关闭数据库权限

SUPER

服务器管理

执行kill线程权限

MySQL权限授权,主要是针对表和字段进行权限设定,如下表说明:

权限分布

可能的设置的权限

表权限

'Select', 'Insert', 'Update', 'Delete', 'Create', 'Drop', 'Grant', 'References', 'Index', 'Alter'

列权限

'Select', 'Insert', 'Update', 'References'

过程权限

'Execute', 'Alter Routine', 'Grant'

2.权限设定原则:

1.最小权限原则;

2.限制用户的登录主机;

3.删除没有密码的用户,删除、禁用root用户或者修改root用户密码;

4.每个用户的密码规则符合安全性要求;

5.定期清理未使用的用户;回收用户权限或者取消相应权限。

3.mysqladmin的使用

权限的实施一般采用SQL语句或者mysqladmin程序进行。

mysqladmin 工具的使用格式:

mysqladmin [OPTIONS] command command....
OPTIONS:
-u, --user=name 指定用户名
-h, --host=name 指定主机名
-p, --password 指定密码
-P, --port 指定端口

  

mysqladmin常用命令参数:

mysqladmin [OPTIONS] COMMAND COMMAND....
COMMAND:
create [DB_NAME]
drop [DB_NAME]
debug 打开调试日志并记录于error log中
status 输出服务器的基本状态信息
--sleep:status的子参数,多久刷新一次
--count:status的子参数,显示的批次
extended-status 显示扩展的状态信息,等于:SHOW GLOBAL STATUS;
flush-hosts 清空主机相关的缓存,包括:DNS解析缓存、连接错误次数过多而被拒绝访问mysqld的主机等
flush-logs 关闭日志,打开新日志对二进制、中继日志进行滚动
flush-privileges 刷新配置
flush-status 重置状态变量
flush-tables 关闭当前打开的表文件句柄
flush-threads 清空线程缓存池
kill 杀死指定的线程
password 修改指定用户的密码
ping 探测服务器是否在线
processlist 显示mysql线程列表
reload 相当于flush-privileges
refresh 相当于同时使用flush-logs和flush-hosts
shutdown 关闭mysql服务
start-slave 启动从服务器线程
stop-slave 关闭从服务器线程
variables 输出mysqld的服务器变量
version 显示mysql服务器版本

  

例如查看mysql的版本和mysql服务器内执行的线程信息:

授权

MySQL使用GRANT语句为用户授权,分别有5个层级的授权:全局、数据库、表、列、过程或者函数层级。

要使用GRANT或REVOKE,您必须拥有GRANT OPTION权限,并且您必须用于您正在授予或撤销的权限。

GRANT语法格式:

GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ...
ON [object_type] {tbl_name | * | *.* | db_name.*}
TO user [IDENTIFIED BY [PASSWORD] 'password']
[, user [IDENTIFIED BY [PASSWORD] 'password']] ...
[REQUIRE
NONE |
[{SSL| X509}]
[CIPHER 'cipher' [AND]]
[ISSUER 'issuer' [AND]]
[SUBJECT 'subject']]
[WITH with_option [with_option] ...] object_type = TABLE | FUNCTION | PROCEDURE with_option = GRANT OPTION #将自己的权限赋予其他用户
| MAX_QUERIES_PER_HOUR count #设置每小时可以执行count次查询
| MAX_UPDATES_PER_HOUR count #设置每小时可以执行count次更新
| MAX_CONNECTIONS_PER_HOUR count #设置每小时可以建立count个连接
| MAX_USER_CONNECTIONS count #设置单个用户可以同时建立count个连接

  

1.全局权限的授权和撤销

#授权全局权限
GRANT ALL ON *.* #撤销全局权限
REVOKE ALL ON *.*

  

2.数据库权限的授权和撤销

#授权数据库权限
GRANT ALL ON 数据库名.* #撤销数据库权限
REVOKE ALL ON 数据库名.*

  

3.数据库字段的授权和撤销

适用于给定表单一列。相关权限存储在mysql.columns_priv中;取消授权时,必须指定与被授权相同的列。

4.子程序的授权和撤销

CREATE ROUTINE, ALTER ROUTINE, EXECUTE和GRANT权限适用于已存储的子程序。这些权限可以被授予为全局层级和数据库层级。而且,除了CREATE ROUTINE外,这些权限可以被授予为子程序层级,并存储在mysql.procs_priv表中。

示例:创建新用户test,密码为123。test用户对所有数据库有查询、插入权限,并授予GRANT权限。

使用root用户登录,GRANT OPTION表示test用户可以创建其他用户,在user表中体现为grant_priv字段的值为Y。

收回权限

使用REVOKE语句取消用户的权限,权限会从db、servers、tables_priv、columns_priv表中删除,但是用户账号仍然存在于user表中,必须使用DROP语句删除账户记录。

1.收回用户的所有权限

REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...

  

2.收回指定权限

REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ...
ON [object_type] {tbl_name | * | *.* | db_name.*}
FROM user [, user] ...

  

示例:使用REVOKE撤销test用户的INSERT权限。

REVOKE INSERT ON *.* FROM 'test'@'localhost';

  

执行该语句前后user表中test字段的变化:

查看用户权限

可以使用SHOW GRANTS和SELECT 权限字段 FROM user表 WHERE user=‘用户名’  AND host=‘主机’。

示例:查看test用户的权限

或者

访问控制

当客户端连接到服务器时,MySQL访问控制有两个阶段:

  • 连接验证:连接到MySQL数据库服务器的客户端需要有一个有效的用户名和密码。此外,客户端连接的主机必须与MySQL授权表中的主机相匹配。与user表中的user、password和host进行验证。
  • 请求验证:当连接成功建立后,对于客户端发出的每个语句,MySQL会检查客户端是否具有足够的权限来执行该特定语句。 MySQL能够检查数据库,表和字段级别的权限。分别与db、tables_priv、columns_priv表中的权限进行验证。

综合练习

上机练习1:root用户和admin用户管理

需求描述:

  1. 修改root的密码,不允许为空密码
  2. root密码遗忘,需要重置root密码
  3. 使用root用户登录,创建admin用户,密码为:*****,允许从互联网访问,对myschool数据库有全部权限,不允许创建其他用户,每小时最大连接数为50个
  4. 从user表、table_priv和columns_priv表中查询admin用户的权限信息
  5. 使用SHOW GRANTS语句查看admin的权限信息
  6. 使用admin用户登录MySQL服务器
  7. 使用admin用户分别向grade表中插入一条数据(grade为实训)并查询结果,查询student表中的学号、学生姓名、电话号码信息
  8. 退出admin用户登录,使用root用户登录,并收回admin的其他权限,只保留查询权。确认admin的权限。
  9. 删除admin的账户信息:取消授权后查询相关权限表;删除用户后查询user表。

上机练习2:myschool数据库和guest用户

需求描述:

  1. 创建账户guest,允许通过互联网访问数据库,密码为123321
  2. 授权guest对myschool.student表有SELECT和INSERT的权限,同时对address字段有UPDATE权限
  3. 修改guest的密码为abc123
  4. 刷新权限表
  5. 查看guest用户的权限
  6. 收回guest用户的INSERT权限
  7. 删除guest账户信息

MySQL-05 用户管理的更多相关文章

  1. mysql之用户管理

    本文内容: 用户的介绍 查看用户 创建用户帐户 修改账户 删除帐户 关于匿名用户 首发日期:2018-04-19 用户的介绍: mysql的客户端连接是以用户名来登录服务端. 服务端可以对用户的权限来 ...

  2. MySQL 安装 用户管理 常用命令

    MySQL目录 数据库概览   数据库介绍 Why Choose MySQL MySQL的前世今生 MySQL的安装   Windows安装MySQL5.721 installer版 Windows安 ...

  3. Mysql的用户管理与授权

    Mysql用户管理 本人使用的是Mysql8.0的版本,可能会有一些语句不兼容: 1.用户管理 在Mysql中支持创建账户,并给账户分配权限:例如只拥有数据库A操作的权限.只拥有数据库B中某些表的权限 ...

  4. MySQL:用户管理

    用户管理部分 一.数据库不安全因素 非授权用户对数据库的恶意存取和破坏: 数据库中重要或敏感的数据被泄露: 安全环境的脆弱性: 二.数据库安全的常用方法 用户标识和鉴别[使用口令鉴别]::该方法由系统 ...

  5. 辛星解读mysql的用户管理

    可能做开发的多半不太关注这方面,可是要说到做运维.那就不能不关注了.由于我们都知道,root的权限太大了.不是随便能用的.我们平时最好用一些比較低的权限的用户.这样会让我们的安全性大大提高,也能防止我 ...

  6. mysql的用户管理(二)

    与权限相关的表由于经常需要用到,所以mysql直接将这些表在mysql启动时写到了内存中,避免每次验证权限时再从磁盘写数据. 当以下条件发生时发refresh权限表信息到内存: 1.对帐户的更改时,如 ...

  7. mongodb 学习笔记05 --用户管理

    csdn的markdown编辑器真有够烂的,这篇文章又给弄丢了 启用认证 mongod 启动默认没有开启权限,你须要指定 –auth 启动.或者在配置文件里设置security.authorizati ...

  8. mysql:用户管理、索引、视图、函数、存储过程

    #创建一个用户并设置密码,注意IP地址要是登录mysql电脑的IP地址 USE mysql CREATE USER lisi@'192.168.149.1' IDENTIFIED BY "1 ...

  9. 【MySQL】用户管理及备份

    "我们知道我们的最高权限管理者是root用户,它拥有着最高的权限,包括select.update.delete.grant等操作.一般在公司里DBA工程师会创建一个用户和密码,让你去连接数据 ...

  10. Mysql的用户管理

随机推荐

  1. NYOJ8——一种排序

    一种排序 时间限制:3000 ms  |  内存限制:65535 KB 难度:3  描述:现在有很多长方形,每一个长方形都有一个编号,这个编号可以重复:还知道这个长方形的宽和长,编号.长.宽都是整数: ...

  2. Vue-i18n实现语言切换

    方法1 Vue — i18n 国际化 全局配置 安 装 1.直接引入js文件 <script src="https://unpkg.com/vue/dist/vue.js"& ...

  3. display:inline-block的div 与 display:block的div之间有间隔问题(div与div之间有间隔的可能性)

    首先看一下我出现的问题如下图: 如上图所示,我的导航栏是由三部分组成的,三部分样式如下: .logo{ /*红框*/ position: relative; display: inline-block ...

  4. Codeforces - 702A - Maximum Increase - 简单dp

    DP的学习计划,刷 https://codeforces.com/problemset?order=BY_RATING_ASC&tags=dp 遇到了这道题 https://codeforce ...

  5. bzoj 2599: [IOI2011]Race【点分治】

    点分治,用一个mn[v]数组记录当前root下长为v的链的最小深度,每次新加一个儿子的时候都在原来儿子更新过的mn数组里更新ans(也就是查一下mn[m-dis[p]]+de[p]) 这里注意更新和初 ...

  6. The local variable fruit may not have been initialized 错误

    eclipse错误提示如图: 错误代码如图: 首先这错误的翻译是:局部变量"水果"尚未初始化,所以对象该如何初始化呢,我百度之后找到了答案,修改过后如下图所示. 这个错误的问题所在 ...

  7. 安装截图软件shutter

    直接进入软件中心安装吧 不知道软件中心安装的软件可以apt upgrade 命令更新么 应该是可以的,感觉软件中心就是个图形化的apt和新立得差不多 shutter可以放大缩小截图, ctrl + 鼠 ...

  8. mybatis使用要点(2019.5.19)

    接口入参 只有一个参数,叫啥都没问题 有两个参数以上,需使用@Param,否则名字依次为0.1.2和param1.param2.param3 一般用#,防sql注入:偶尔用$,比如需要动态表名等 接口 ...

  9. python堆排序实现TOPK问题

    # 构建小顶堆跳转def sift(li, low, higt): tmp = li[low] i = low j = 2 * i + 1 while j <= higt: # 情况2:i已经是 ...

  10. 洛谷 P1072 Hankson 的趣味题 || 打质数表的分解质因数

    方法就是枚举,根据b0和b1可以大大减小枚举范围,方法类似这个http://blog.csdn.net/hehe_54321/article/details/76021615 将b0和b1都分解质因数 ...