MySQL 中的权限管理及验证流程

目录
  • 引言
  • 权限的验证流程
    • 第一层:用户登录
    • 第二层:全局权限
    • 第三层:数据库级别权限
    • 第四层 :数据表级权限
    • 第五层:字段级权限
    • 第六层:对象级权限
  • 总结

引言

某天,女朋友突然问你:“还有多少私房钱?”这个时候惊恐的你该怎么办呢?直接把余额给她看?显然很不符合我们的性格;如果这个时候能有一个临时的支付宝账号,让她看不到真实的余额该有多好啊!

这样的账号就涉及到了数据库的权限问题,下面我们一起来讨论一下 MySQL 中的权限管理。

权限的验证流程

通常,我们提及数据库中的权限的时候,我们想到的可能是 MySQL 数据库中的 user 表。但是,我想告诉你的是 MySQL 数据库中的权限验证不仅仅只有一个 user 表这么简单,我们可以通过下图深入了解一下 MySQL 数据库的认证体系。

通过上图,我们可以清晰地看到,MySQL 数据的权限认证过程并不是只有一个 user 表在起作用。

第一层:用户登录

在用户登录 MySQL 数据库的时候,首先会将用户输入的用户名密码以及 Host 跟 mysql 数据库中的 user 表中的 Host、User 以及 Password 三个字段相匹配,这一步是判断用户是否拥有登录权限。

如果匹配不成功,将会报一个 ERROR 1045 (28000): Access denied for user 'xiaoyang'@'localhost' (using password: YES) 错误。一旦 MySQL 认为用户没有登录权限,将会直接拒绝登录。

[root@dxd ~]# mysql -uxiaoyang -pxiaoyang
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1045 (28000): Access denied for user 'xiaoyang'@'localhost' (using password: YES)

第二层:全局权限

当用户通过了第一层用户登录验证之后,将会直接在 user 表中匹配全局权限,一旦匹配成功之后就会对全局所有的数据库都拥有相应的权限。例如,只给 xiaoyang 这个用户设置一个全局可读权限,那么 xiaoyang 将拥有全局可读权限。

使用 root 用户创建 xiaoyang 用户:

创建一个用户,Create User创建的用户默认没有任何权限

mysql> CREATE USER ‘xiaoyang’@’localhost’ IDENTIFIED BY ‘Xiangyang123!’;
Query OK, 0 rows affected (0.00 sec)

使用 xiaoyang 用户测试查看权限:

mysql> select * from test01.city;
ERROR 1142 (42000): SELECT command denied to user ‘xiaoyang’@’localhost’ for table ‘city’

使用 root 用户给 xiaoyang 用户授权:

  • 将 xiaoyang 这个用户设置一个全局可读权限

mysql> update mysql.user set Select_priv=’Y’ where User=’xiaoyang’;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0

  • 刷新权限,使其生效

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

测试 xiaoyang 查看权限:

  • 测试查看权限

mysql> select * from test01.city;
+——+———————+———+
| id | name | fid |
+——+———————+———+
| 1 | 徐汇区 | 1 |
| 2 | 浦东新区 | 1 |
| 3 | 青浦区 | 1 |
+——+———————+———+
3 rows in set (0.00 sec)

通过上面的例子可以看出,当 xiaoyang 这个用户拥有一个全局可读权限之后,就可以查看所有数据库中的所有数据了。设想一下,如果 xiaoyang 这个用户没有全局权限,怎么办?

第三层:数据库级别权限

如果全局权限验证失败,将会进入数据库级权限验证,这个层级的权限是设置某个用户针对于某个数据库的权限。例如:xiaoyang 这个用户只允许操作 test01 这个数据库,我们来看一下它的实现过程。

将 xiaoyang 用户设置 test01 数据库的查询权限:

  • 添加查看权限(清空了其他的所有权限之后添加)

mysql> insert into mysql.db (Host,User,Select_priv,Db) values(‘localhost’, ‘xiaoyang’, ‘Y’, ‘test01’);
Query OK, 1 row affected (0.00 sec)

  • 查看添加的权限

mysql> select Host,User,Select_priv,Db from mysql.db;
+—————-+———————-+——————-+——————————+
| Host | User | Select_priv | Db |
+—————-+———————-+——————-+——————————+
| localhost | xiangyang | Y | test01 |
+—————-+———————-+——————-+——————————+

3 rows in set (0.00 sec)

使用 xiaoyang 用户查看 test01 数据中任意表的数据:

  • 查看test01数据,有权限

mysql> select * from test01.city;
+——+———————+———+
| id | name | fid |
+——+———————+———+
| 1 | 徐汇区 | 1 |
| 2 | 浦东新区 | 1 |
| 3 | 青浦区 | 1 |
+——+———————+———+
3 rows in set (0.00 sec)

  • 查看其他数据库的数据,是没有权限的

mysql> select * from vue.sp_goods;
ERROR 1142 (42000): SELECT command denied to user ‘xiaoyang’@’localhost’ for table ‘sp_goods’

通过这个案例,我们可以看出数据库级别的权限只对某一个数据库起作用,而设置数据库级别的权限时底层操作的正是 mysql.db 数据表,也就是说在 mysql.db 数据表中设置了对应的权限之后,该用户将对这个数据库中所有的数据都拥有该权限。

在实际应用场景中,如果某一个用户只允许操作某一个数据库,而其他数据库是一个没有权限的状态,这个时候就需要用到数据库级权限。

如果要求只允许某个表拥有权限怎么办呢?

第四层 :数据表级权限

数据表级权限是用来定义某个数据表的权限的,具体定义在 mysql.tables_priv 数据表中,当数据库级权限验证失败之后就会验证表级权限。例如:要求 xiaoyang 这个用户只允许查看 test01 数据库中的 city 表,这个权限的实现具体如下。

将 xiaoyang 用户设置 test01 数据库中 city 数据表的查询权限:

  • 增加数据表级权限(其他权限全部清除)

mysql> INSERT INTO mysql.tables_priv (Host, Db, User, Table_name, Table_priv) VALUES (‘localhost’, ‘test01’, ‘xiaoyang’, ‘city’, ‘Select’);
Query OK, 1 row affected (0.00 sec)

使用 xiaoyang 用户查询 test01 数据库中 city 数据表的数据:

  • 查看 test01 数据库中 city 数据表有权限

mysql> select * from test01.city;
+——+———————+———+
| id | name | fid |
+——+———————+———+
| 1 | 徐汇区 | 1 |
| 2 | 浦东新区 | 1 |
| 3 | 青浦区 | 1 |
+——+———————+———+
3 rows in set (0.00 sec)

  • 查看其他相同数据库中其他表是没有权限的

mysql> select * from test01.info;
ERROR 1142 (42000): SELECT command denied to user ‘xiaoyang’@’localhost’ for table ‘info’

通过这个案例,我们可以了解到的是 mysql.tables_priv 数据表主要是用来针对某一个数据表来设置权限的。它比数据库级权限更加地精细化。

在实际应用场景中,如现在有一个访客浏览记录表,一般要求只允许查看和添加,不允许有其他修改操作;还有例如订单数据表,一般只允许添加、查看和修改,不允许删除等应用场景,数据表级权限有着不可替代的作用。

再试想一下,如果想要 xiaoyang 用户对订单数据表中的余额字段只能查看,又该如何呢?

第五层:字段级权限

字段级权限控制的主要是某一个字段的操作权限,当数据库需要针对某个具体的字段做权限控制之时,就需要使用字段级权限(注意:设置字段级权限的数据表在 mysql.columns_priv 数据表中,但是 mysql.tables_priv 需要首先添加 column_priv 权限才能生效)。

例如:要求 xiaoyang 这个用户,只允许查看 sp_order 数据表中的 order_price 字段。

设置 xiaoyang 这个用户对 sp_order 数据表中的 order_price 字段的可读权限:

  • 在 mysql.tables_priv 数据表中添加字段查看权限

mysql> INSERT INTO mysql.tables_priv (Host, Db, User, Table_name, Column_priv) VALUES (‘localhost’, ‘test01’, ‘xiaoyang’, ‘sp_order’, ‘Select’);
Query OK, 1 row affected (0.00 sec)

  • 在 mysql.columns_priv 中添加字段查看权限

mysql> INSERT INTO mysql.columns_priv (Host, Db, User, Table_name, Column_name, Column_priv) VALUES (‘localhost’, ‘test01’, ‘xiaoyang’, ‘sp_order’, ‘order_price’, ‘Select’);
Query OK, 1 row affected (0.00 sec)

测试该字段的可读权限:

  • 查看 order_price 字段,可以正常查看

mysql> select order_price from vue.sp_order;
+——————-+
| order_price |
+——————-+
| 222.00 |
+——————-+
27 rows in set (0.00 sec)

  • 查看其他字段,没有权限

mysql> select id from vue.sp_order;
ERROR 1143 (42000): SELECT command denied to user ‘xiaoyang’@’localhost’ for column ‘id’ in table ‘sp_order’

通过这个案例,可以看出字段级权限主要是控制某一个字段的权限。在实际应用中,通常用来控制某个字段。例如:控制订单表中的金额字段无法修改,而其他字段不受影响,这时就可以使用字段级权限。

第六层:对象级权限

上文中我们介绍了全局、数据库级、数据表级以及字段级的权限,除此之外,还有一个是用来管理数据库存储过程和存储函数权限的权限,及对象级权限(该权限相关的数据表是 mysql.procs_priv )。

举个例子:超级管理员创建一个名为 select_city 的存储过程,只给 xiaoyang 这个用户使用该函数的权限,不给修改权限,具体操作如下。

  • root 用户创建存储过程:

mysql> delimiter 
mysql> CREATE PROCEDURE select_city(IN city_id INTEGER)
-> BEGIN
-> select * FROM city WHERE id = city_id;
-> END
mysql>CREATEPROCEDUREselect​c​​ity(INcity​i​​dINTEGER)
−>BEGIN
−>select∗FROMcityWHEREid=city​i​​d;
−>END
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;

设置 xiaoyang 用户的权限:

mysql> use mysql;

  • 增加存储过程权限

mysql> INSERT INTO procs_priv (Host, Db, User, Routine_name, Routine_type, Proc_priv) VALUES (‘localhost’, ‘test01’, ‘xiaoyang’, ‘select_city’, ‘PROCEDURE’, ‘Execute’);
Query OK, 1 row affected (0.00 sec)

存储过程可以正常使用:

  • 选择数据库

mysql> use test01;
Database changed

  • 使用存储过程

mysql> call select_city(1);
+——+—————-+———+
| id | name | fid |
+——+—————-+———+
| 1 | 徐汇区 | 1 |
+——+—————-+———+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.00 sec)

无法删除存储过程:

  • 删除存储过程显示无权限

mysql> DROP PROCEDURE select_city;
ERROR 1370 (42000): alter routine command denied to user ‘xiaoyang’@’localhost’ for routine ‘test01.select_city’

通过上面这个案例可以得出:mysql.procs_priv 数据表主要是用来控制存储过程的权限的。

在实际应用中,我们需要注意存储过程权限一旦授予之后,自动会将数据库的查看权限一并授予,但是会显示数据表为空。

mysql> use test01;
Database changed
mysql> show tables;
Empty set (0.00 sec)

总结

数据的权限主要分为六个层级:

  • 第一层是登录验证,验证失败则立即退出;
  • 第二层的权限为全局权限,这个层级的权限覆盖整个数据库;
  • 第三层的权限是数据库级别的权限,这个层级的权限是针对于某一个数据库的;
  • 第四层级是数据表级的权限,这个层级的权限主要针对于数据表;
  • 第五层权限是字段级的权限,主要针对于某一个字段的,需要注意的是字段级的权限需要依赖于第四层数据表级查看权限,没有数据表级查看权限,字段级权限无法生效;
  • 最后一个对象级权限,这个权限主要是针对于存储函数和存储过程的,只有拥有该权限,才能够操作数据库存储函数或存储过程。

但是,在实际应用中,我们不需要将权限设置得过于精细化,因为过于精细化容易造成权限交叉并且设置权限的管理也会是相当的麻烦。

以上就是MySQL 中的权限管理及验证流程的详细内容,更多关于MySQL权限管理验证的资料请关注我们其它相关文章!

(0)

相关推荐

  • Mysql 用户权限管理实现

    1. MySQL 权限介绍 mysql中存在4个控制权限的表,分别为user表,db表,tables_priv表,columns_priv表,我当前的版本mysql 5.7.22 . mysql权限表的验证过程为: 先从user表中的Host,User,Password这3个字段中判断连接的ip.用户名.密码是否存在,存在则通过验证. 通过身份认证后,进行权限分配,按照user,db,tables_priv,columns_priv的顺序进行验证.即先检查全局权限表user,如果user中对应的

  • MySQL用户账户管理和权限管理深入讲解

    前言 MySQL 的权限表在数据库启动的时候就载入内存,当用户通过身份认证后,就在内存中进行相应权限的存取,这样,此用户就可以在数据库中做权限范围内的各种操作了. 下面话不多说了,来一起看看详细的介绍吧 mysql 的权限体系大致分为5个层级: 全局层级 全局权限适用于一个给定服务器中的所有数据库.这些权限存储在mysql.user表中.GRANT ALL ON *.*和REVOKE ALL ON *.*只授予和撤销全局权限. 数据库层级 数据库权限适用于一个给定数据库中的所有目标.这些权限存储

  • MySQL创建用户和权限管理的方法

    一.如何创建用户和密码 1.进入到mysql数据库下 mysql> use mysql Database changed 2.对新用户增删改 1.创建用户 # 指定ip:192.118.1.1的chao用户登录 create user 'chao'@'192.118.1.1' identified by '123'; # 指定ip:192.118.1.开头的chao用户登录 create user 'chao'@'192.118.1.%' identified by '123'; # 指定任何i

  • 详解MySQL 用户权限管理

    前言: 不清楚各位同学对数据库用户权限管理是否了解,作为一名 DBA ,用户权限管理是绕不开的一项工作内容.特别是生产库,数据库用户权限更应该规范管理.本篇文章将会介绍下 MySQL 用户权限管理相关内容. 1.用户权限简介 当我们创建过数据库用户后,还不能执行任何操作,需要为该用户分配适当的访问权限. 关于 MySQL 用户权限简单的理解就是数据库只允许用户做你权利以内的事情,不可以越界.比如只允许你执行 select 操作,那么你就不能执行 update 操作.只允许你从某个 IP 上连接

  • mysql用户权限管理实例分析

    本文实例讲述了mysql用户权限管理.分享给大家供大家参考,具体如下: 本文内容: 什么是用户权限 恰当的用户权限 查看权限 修改权限 删除权限 首发日期:2018-04-19 什么是用户权限: 每个用户都有自己的用户权限,这些用户权限比如有查询表权限.修改表权限.插入表权限.新增用户权限等等. 具体的权限: 恰当的用户权限: 多数用户只需要对表进行读和写,但少数用户甚至需要能创建和删除表: 某些用户需要读表,但可能不需要更新表: 对于大多数用户,应该只提供对表的读写,不应该允许他们创建表.修改

  • MySQL用户权限管理详解

    用户权限管理主要有以下作用: 1. 可以限制用户访问哪些库.哪些表 2. 可以限制用户对哪些表执行SELECT.CREATE.DELETE.DELETE.ALTER等操作 3. 可以限制用户登录的IP或域名 4. 可以限制用户自己的权限是否可以授权给别的用户 一.用户授权 复制代码 代码如下: mysql> grant all privileges on *.* to 'yangxin'@'%' identified by 'yangxin123456' with grant option;  

  • MySQL 中的权限管理及验证流程

    目录 引言 权限的验证流程 第一层:用户登录 第二层:全局权限 第三层:数据库级别权限 第四层 :数据表级权限 第五层:字段级权限 第六层:对象级权限 总结 引言 某天,女朋友突然问你:“还有多少私房钱?”这个时候惊恐的你该怎么办呢?直接把余额给她看?显然很不符合我们的性格:如果这个时候能有一个临时的支付宝账号,让她看不到真实的余额该有多好啊! 这样的账号就涉及到了数据库的权限问题,下面我们一起来讨论一下 MySQL 中的权限管理. 权限的验证流程 通常,我们提及数据库中的权限的时候,我们想到的

  • 浅谈vue权限管理实现及流程

    一.整体思路 后端返回用户权限,前端根据用户权限处理得到左侧菜单:所有路由在前端定义好,根据后端返回的用户权限筛选出需要挂载的路由,然后使用 addRoutes 动态挂载路由. 二.实现要点 (1)路由定义,分为初始路由和动态路由,一般来说初始路由只有 login,其他路由都挂载在 home 路由之下需要动态挂载. (2)用户登录,登录成功之后得到 token,保存在 sessionStorage,跳转到 home,此时会进入路由拦截根据 token 获取用户权限列表. (3)全局路由拦截,根据

  • MySQL数据库用户权限管理

    目录 1.用户管理 1.1.创建用户 1.2.删除用户 1.3.修改用户密码 2.权限管理 2.1.授予权限 grant 2.2.取消权限 revoke 2.3.刷新权限 flush 3.密码丢失的解决方案 1.用户管理 mysql的用户信息保存在了mysql.user中: select * from mysql.user\G *************************** 5. row *************************** Host: localhost User:

  • 详细解读MySQL中的权限

    一.前言 很多文章中会说,数据库的权限按最小权限为原则,这句话本身没有错,但是却是一句空话.因为最小权限,这个东西太抽象,很多时候你并弄不清楚具体他需要哪些权限. 现在很多mysql用着root账户在操作,并不是大家不知道用root权限太大不安全,而是很多人并不知道该给予什么样的权限既安全又能保证正常运行.所以,本文更多的是考虑这种情况下,我们该如何简单的配置一个安全的mysql.注:本文测试环境为mysql-5.6.4 二.Mysql权限介绍 mysql中存在4个控制权限的表,分别为user表

  • 深入解析vue中的权限管理

    目录 vue要做权限管理该怎么做? 一.是什么 二.如何做 接口权限 路由权限控制 菜单权限 方案一 方案二 按钮权限 方案一 方案二 小结 vue要做权限管理该怎么做? 一.是什么 权限是对特定资源的访问许可,所谓权限控制,也就是确保用户只能访问到被分配的资源 而前端权限归根结底是请求的发起权,请求的发起可能有下面两种形式触发 页面加载触发 页面上的按钮点击触发 总的来说,所有的请求发起都触发自前端路由或视图 所以我们可以从这两方面入手,对触发权限的源头进行控制,最终要实现的目标是: 路由方面

  • C#权限管理和设计浅谈

    此文主要想和大家分享的是这段时间,对权限管理和设计的断断续续的思考学习,和个人的一些软件开发等方面的看法. 提到'权限管理和设计',大家可能会第一时间想到这园子里的 吉日嘎拉,在这方面他可以算是'大牛'或专家 --他的'通用权限管理系统',究竟做的怎样,看看他的博客就差不多可以知道了(貌似我在给他做推广,呵呵...,but in fact,is not),别的暂且不敢说,最起码可以看出他研究的比较深入和狂热,其系统也具有一定的'成熟度',用他的话来说--就是在努力做到他的极致.他做的是通用权限管

  • 一款不错的android6.0、7.0权限管理器推荐

    一款不错的android6.0.7.0权限管理器PermissionsCheckerUtil 初始化权限管理器:构造方法 private final Context mContext; public PermissionsCheckerUtil(Context mContext) { this.mContext = mContext; } 判断使用的权限集合是否已经全部允许 // 判断权限集合 public boolean lacksPermissions(String... permissio

  • MySQL中的用户创建与权限管理

    目录 一.用户管理 1.创建MySQL用户 2. 删除MySQL用户 3. 修改MySQL用户 二.权限管理 1. 权限说明 2. 权限保存位置(了解) 3. 给用户授权 4. 查询用户权限 5. with grant option选项 6.revoke回收权限 一.用户管理 在mysql库里有个user表可以查看已经创建的用户 1.创建MySQL用户 注意:MySQL中不能单纯通过用户名来说明用户,必须要加上主机.如hhy@10.1.1.1 基本语法: mysql> create user '

随机推荐