MYSQL-用户权限的验证过程(转)

知识点

因为MySQL是使用User和Host两个字段来确定用户身份的,这样就带来一个问题,就是一个客户端到底属于哪个host。

    • 如果一个客户端同时匹配几个Host,对用户的确定将按照下面的优先级来排

      • 基本观点越精确的匹配越优先
      • Host列上,越是确定的Host越优先,[localhost, 192.168.1.1, wiki.yfang.cn] 优先于[192.168.%, %.yfang.cn],优先于[192.%, %.cn],优先于[%]
      • User列上,明确的username优先于空username。(空username匹配所有用户名,即匿名用户匹配所有用户)
      • Host列优先于User列考虑

      当你登录mysql服务器之后,你可以使用user()和current_user()来检查你登陆的用户。

      • user() 返回你连接server时候指定的用户和主机
      • current_user() 返回在mysql.user表中匹配到的用户和主机,这将确定你在数据库中的权限

      当你登录服务器并执行MySQL的命令时,系统将检查你当前的用户(current_user)是否有权限进行当前操作。

      • 首先检查user表中的全局权限,如果满足条件,则执行操作
      • 如果上面的失败,则检查mysql.db表中是否有满足条件的权限,如果满足,则执行操作
      • 如果上面的失败,则检查mysql.table_priv和mysql.columns_priv(如果是存储过程操作则检查mysql.procs_priv),如果满足,则执行操作
      • 如果以上检查均失败,则系统拒绝执行操作。

      测试过程

      创建3个用户名相同,HOST和权限都不同的USER

    • mysql> grant select on *.* to ‘‘@‘%‘ identified by ‘123‘;
      Query OK, 0 rows affected (0.00 sec)
      mysql> grant select,createon *.* to ‘bruce‘@‘10.20.0.232‘ identified by ‘123‘;
      Query OK, 0 rows affected (0.01 sec)
      mysql> grant select,create,deleteon *.* to ‘bruce‘@‘%‘ identified by‘123‘;
      Query OK, 0rows affected (0.00 sec)

      从另外一个机器登陆过来

    • [[email protected] ~]# mysql -ubruce -p -h10.20.0.231
      Enter password:
      Welcome to the MariaDB monitor.  Commands end with ; or \g.
      Your MySQL connection id is 5
      Server version: 5.5.20-log MySQL Community Server (GPL)
      This software comes with ABSOLUTELY NO WARRANTY. This is free software,
      and you are welcome tomodify and redistribute it under the GPL v2 license
      Type ‘help;‘ or ‘\h‘ for help. Type‘\c‘to clear the current inputstatement.
      MySQL [(none)]> show grants;
      +-------------------------------------------------------------------------------------------------------------------------+
      | Grants for [email protected]                                                                                            |
      +-------------------------------------------------------------------------------------------------------------------------+
      | GRANT SELECT, CREATEON *.* TO ‘bruce‘@‘10.20.0.232‘ IDENTIFIED BY PASSWORD‘*23AE809DDACAF96AF0FD78ED04B6A265E05AA257‘ |
      +-------------------------------------------------------------------------------------------------------------------------+
      1 row inset (0.00 sec)
      MySQL [(none)]> select user(), current_user();
      +-------------------+-------------------+
      | user()            | current_user()    |
      +-------------------+-------------------+
      | [email protected] | [email protected] |
      +-------------------+-------------------+
      1 row in set (0.03 sec)

      明确的user,host,进行精确匹配,找到用户为‘bruce‘@‘10.20.0.232‘

      删除掉这个用户再登陆

    • mysql> delete from mysql.userwhereuser=‘bruce‘andhost=‘10.20.0.232‘;
      Query OK, 1row affected (0.00 sec)
      mysql> flush privileges;
      Query OK, 0 rows affected (0.00 sec)
      
      [[email protected] ~]# mysql -ubruce -p -h10.20.0.231
      Enter password:
      Welcome to the MariaDB monitor.  Commands end with ; or \g.
      Your MySQL connection id is 6
      Server version: 5.5.20-log MySQL Community Server (GPL)
      This software comes with ABSOLUTELY NO WARRANTY. This is free software,
      and you are welcome tomodify and redistribute it under the GPL v2 license
      Type ‘help;‘ or ‘\h‘ for help. Type‘\c‘to clear the current inputstatement.
      
      MySQL [(none)]>show grants;
      +-----------------------------------------------------------------------------------------------------------------------+
      | Grants for [email protected]%                                                                                                    |
      +-----------------------------------------------------------------------------------------------------------------------+
      | GRANT SELECT, DELETE, CREATEON*.* TO ‘bruce‘@‘%‘ IDENTIFIED BYPASSWORD‘*23AE809DDACAF96AF0FD78ED04B6A265E05AA257‘ |
      +-----------------------------------------------------------------------------------------------------------------------+
      1 row inset (0.00 sec)
      MySQL [(none)]> select user(), current_user();
      +-------------------+----------------+
      | user()            | current_user() |
      +-------------------+----------------+
      | [email protected] | [email protected]%        |
      +-------------------+----------------+
      1 row in set (0.00 sec)

      此时匹配的用户是[email protected]%
      然后把这个用户也删除,再登陆

    • [[email protected] ~]# mysql -ubruce -p -h10.20.0.231
      Enter password:
      Welcome to the MariaDB monitor.  Commands end with ; or \g.
      Your MySQL connection id is 8
      Server version: 5.5.20-log MySQL Community Server (GPL)
      This software comes with ABSOLUTELY NO WARRANTY. This is free software,
      and you are welcome tomodify and redistribute it under the GPL v2 license
      Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘to clear the current inputstatement.
      MySQL [(none)]> show grants;
      +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
      | Grants for @%                                                                                                                                                                                       |
      +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
      | GRANT SELECT ON*.* TO‘‘@‘%‘ IDENTIFIED BY PASSWORD ‘*23AE809DDACAF96AF0FD78ED04B6A265E05AA257‘                                                                                                    |
      | GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, LOCK TABLES, CREATE VIEW, SHOW VIEW, CREATEROUTINE, EVENT, TRIGGER ON `test`.* TO‘‘@‘%‘    |
      | GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATETEMPORARY TABLES, LOCK TABLES, CREATE VIEW, SHOW VIEW, CREATEROUTINE, EVENT, TRIGGER ON `test\_%`.* TO‘‘@‘%‘ |
      +-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
      MySQL [(none)]> select user(), current_user();
      +-------------------+----------------+
      | user()            | current_user() |
      +-------------------+----------------+
      | [email protected] | @%             |
      +-------------------+----------------+
      1 row in set (0.00 sec)

      此时匹配的是‘‘@‘%‘ 用户

    • 对于空用户,默认有对test或test开头的数据库有权限

http://www.cnblogs.com/zuoxingyu/p/4935428.html

时间: 2024-10-09 03:29:40

MYSQL-用户权限的验证过程(转)的相关文章

MySQL 用户权限详细汇总(转)

1,MySQL权限体系 MySQL 的权限体系大致分为5个层级: 全局层级: 全局权限适用于一个给定服务器中的所有数据库.这些权限存储在mysql.user表中.GRANT ALL ON .和REVOKE ALL ON .只授予和撤销全局权限. 数据库层级: 数据库权限适用于一个给定数据库中的所有目标.这些权限存储在mysql.db表中.GRANT ALL ON db_name.和REVOKE ALL ON db_name.只授予和撤销数据库权限. 表层级: 表权限适用于一个给定表中的所有列.这

转 MySQL 用户权限详细汇总

http://blog.csdn.net/mchdba/article/details/45934981 1,MySQL权限体系 MySQL 的权限体系大致分为5个层级: 全局层级: 全局权限适用于一个给定服务器中的所有数据库.这些权限存储在mysql.user表中.GRANT ALL ON .和REVOKE ALL ON .只授予和撤销全局权限. 数据库层级: 数据库权限适用于一个给定数据库中的所有目标.这些权限存储在mysql.db表中.GRANT ALL ON db_name.和REVOK

MySQL 用户权限详细汇总

1,MySQL权限体系 mysql 的权限体系大致分为5个层级: 全局层级: 全局权限适用于一个给定服务器中的所有数据库.这些权限存储在mysql.user表中.GRANT ALL ON .和REVOKE ALL ON .只授予和撤销全局权限. 数据库层级: 数据库权限适用于一个给定数据库中的所有目标.这些权限存储在mysql.db表中.GRANT ALL ON db_name.和REVOKE ALL ON db_name.只授予和撤销数据库权限. 表层级: 表权限适用于一个给定表中的所有列.这

mysql用户权限

mysql> show grants for [email protected]'localhost';+----------------------------------------------------------------------------------------------------------------------------------------+| Grants for [email protected] |+---------------------------

mysql用户权限管理

mysql数据在实际生产环境中大量被使用,那平时在做好服务器上防火墙策略以外平时,对mysql下的用户权限也要严格管理,mysql的用户权限都是放在mysql.user这张表里,平时的用户权限管理都是隐式使用着这张表的,先说下权限: 权限 意义 select 查询 insert 插入 update 更新 delete 删除记录,一般用于清空表或者某一条记录 create 创建 drop 删除,从表空间里删除 grant 授予,一般用于给用户授权 references 引用 index 索引 al

MySQL用户权限导致的创建Trigger失败

说来惭愧,MySQL一直处于只会用,不怎么理解的阶段.甚至是一些较为深层次的管理,都不怎么熟悉,得加强啊! 近日,系统测试,使用MySQL数据库,需要在某个表上创建触发器,数据库是在本机安装.但是,无论如何都无法创建触发器,后台错误信息如下: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: TRIGGER command denied to user 'root'@'mortimer-PC' for table 't_user

Mysql用户&权限管理

1.创建用户(相关表mysql.user) localhost root 本机 127.0.0.1  root 本机 ::1 root 本机 % cheng 远程用户(任意ip) 192.168.1.55 jake 远程用户(指定ip) 1).创建本地用户(只能在本机登陆本机数据库) create user 'cheng'@'localhost' identified by '123456';指定密码"123456". insert into mysql.user(Host,User,

MySQL用户权限详解

如果需要查看MySQL用户权限,应该如何实现呢?下面就为您介绍查看MySQL用户权限的方法,并对授予MySQL用户权限的语句进行介绍,供您参考. 查看MySQL用户权限: show grants for 你的用户 比如:show grants for [email protected]'localhost'; Grant 用法 GRANT USAGE ON *.* TO 'discuz'@'localhost' IDENTIFIED BY PASSWORD '*C242DDD213BE9C6F8

nginx、php-fpm、mysql用户权限解析

这篇文章我们就特别来讲解下,nginx.php-fpm以及mysql运行在各个用户下的配置. 先来做个说明:nginx本身不能处理PHP,它只是个web服务器.当接收到客户端请求后,如果是php请求,则转发给php解释器处理,并把结果返回给客户端.如果是静态页面的话,nginx自身处理,然后把结果返回给客户端. Nginx下php解释器使用最多的就是fastcgi.一般情况nginx把php请求转发给fastcgi管理进程处理,fastcgi管理进程选择cgi子进程进行处理,然后把处理结果返回给

烂泥:nginx、php-fpm、mysql用户权限解析

本文首发于烂泥行天下. 前几天学习了,在nginx下搭建wordpress博客.在<烂泥:使用nginx利用虚拟主机搭建WordPress博客>文章中,我们特别提到了有关程序运行在哪个用户下面. 这篇文章我们就特别来讲解下,nginx.php-fpm以及mysql运行在各个用户下的配置. 先来做个说明:nginx本身不能处理PHP,它只是个web服务器.当接收到客户端请求后,如果是php请求,则转发给php解释器处理,并把结果返回给客户端.如果是静态页面的话,nginx自身处理,然后把结果返回