MySQL Study之--MySQL普通用户无法本地登陆


      在安装完毕MySQL后,我们通常加入拥有对应权限的普通用户用来訪问数据库。在使用用户本地登录数据库的时候,常常会出现怎么登录也无法登录的情况,可是从其他的mysqlclient却能够登录。

故障现象:

[root@mysrv ~]# mysql -u root -poracle

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 10

Server version: 5.6.25-enterprise-commercial-advanced-log MySQL Enterprise Server - Advanced Edition (Commercial)

Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.



mysql> select version()\g

+-------------------------------------------+

| version()                                 |

+-------------------------------------------+

| 5.6.25-enterprise-commercial-advanced-log |

+-------------------------------------------+

1 row in set (0.00 sec)



创建用户并授权

mysql> grant all on prod.* to 'rose'@'%' identified by 'rose';

Query OK, 0 rows affected (0.01 sec)



mysql> show grants for rose;

+-----------------------------------------------------------------------------------------------------+

| Grants for rose@%                                                                                   |

+-----------------------------------------------------------------------------------------------------+

| GRANT USAGE ON *.* TO 'rose'@'%' IDENTIFIED BY PASSWORD '*86F57026C60B8CE1038EFB3B9383EC573979A7BD' |

| GRANT ALL PRIVILEGES ON `prod`.* TO 'rose'@'%'                                                      |

+-----------------------------------------------------------------------------------------------------+

2 rows in set (0.00 sec)



mysql> select user,host from user;

+-------+-----------+
| user | host |
+-------+-----------+
| jerry | % |
| rose | % |
| tom | % |
| tom1 | % |
| tom2 | % |
| root | 127.0.0.1 |
| root | ::1 |
| | localhost |
| jerry | localhost |
| root | localhost |
| scott | localhost |
| tom | localhost |
| | mysrv |
| root | mysrv |
+-------+-----------+
14 rows in set (0.00 sec)

用户登陆:


[root@mysrv ~]# mysql -u rose -prose

ERROR 1045 (28000): Access denied for user 'rose'@'localhost' (using password: YES)          
---登陆失败!


[root@mysrv ~]# mysql -u rose -p     

Enter password: 


Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 22

Server version: 5.6.25-enterprise-commercial-advanced-log MySQL Enterprise Server - Advanced Edition (Commercial)

Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use prod;

ERROR 1044 (42000): Access denied for user ''@'localhost' to database 'prod'--



---在不用password的情况下能够登陆,但没有权限訪问,应该是匿名用户的身份 !


远程登陆:




---远程登陆成功!


一、登录后查看mysql.user表的情况



能够看到,我的数据库中有rose用户和匿名用户localhost;

mysql> show grants for rose;

+-----------------------------------------------------------------------------------------------------+

| Grants for rose@%                                                                                   |

+-----------------------------------------------------------------------------------------------------+

| GRANT USAGE ON *.* TO 'rose'@'%' IDENTIFIED BY PASSWORD '*86F57026C60B8CE1038EFB3B9383EC573979A7BD' |

| GRANT ALL PRIVILEGES ON `prod`.* TO 'rose'@'%'                                                      |

+-----------------------------------------------------------------------------------------------------+

2 rows in set (0.00 sec)



二、在本机用rose用户登录。发现不用password能够登录。

[root@mysql01 ~]# mysql -urose -p

Enter password: 



mysql> select user(),current_user();

+----------------+----------------+

| user()         | current_user() |

+----------------+----------------+

| rose@localhost | @localhost     |

+----------------+----------------+

1 row in set (0.00 sec)



登录成功了,使用USER()和CURRENT_USER()两个函数查看所使用的用户。

USER()函数返回你在client登陆时指定的username和主机名。

CURRENT_USER()函数返回的是MySQL使用授权表中的哪个用户来认证你的登录请求。

这里发现,我使用'rose'@'localhost'这个账户登录数据库(由于在本地登陆时没指定主机。默认是以localhost登录),可是数据库使用的是''@'localhost'这个账户来进行登录认证。而''@'localhost'这个匿名用户是没有password的,因此我输入空password登录成功了。可是登录后,所相应的用户的匿名用户。

一般在MySQL在安装完成后,我们使用mysql_install_db这个脚本生成授权表,会默认创建''@'localhost'这个匿名用户。

正是由于这个匿名用户,影响了其它用户从本地登录的认证。

那么MySQL是怎样进行用户身份认证呢?



        一、当用户从client请求登陆时,MySQL将授权表中的条目与client所提供的条目进行比較,包含用户的username,password和主机。授权表中的Host字段是能够使用通配符作为模式进行匹配的。如test.example.com, %.example.com, %.com和%都能够匹配test.example.com这个主机。

授权表中的User字段不同意使用模式匹配,可是能够有一个空字符的username代表匿名用户。而且空字符串能够匹配全部的username。就像通配符一样。

当user表中的Host和User有多个值能够匹配client提供的主机和username时,MySQL将user表读入内存,而且依照一定规则排序,依照排序规则读取到的第一个匹配clientusername和主机名的条目对client进行身份验证。



       二、排序规则:对于Host字段,依照匹配的精确程度进行排序。越精确的排序越前,比如当匹配test.example.com这个主机时, %.example.com比%.com更精确,而test.example.com比%.example.com更精确。对于User字段,非空的字符串username比空字符串匹配的username排序更靠前。

User和Host字段都有多个匹配值,MySQL使用主机名排序最前的条目,在主机名字段同样时再选取username排序更前的条目。

因此,假设User和Host字段都有多个匹配值,主机名最精确匹配的条目被用户对用户进行认证。



了解了这个认证流程,就知道为什么server登录失败了。

     使用GaMe在本机登录数据时,不指定-h參数默觉得localhost主机登录,而在MySQL中有两个匹配的条目:'rose'@'%'  和 ''@'localhost'

匿名用户可以匹配的原因上面说过,空字符串可以匹配全部的username,就像通配符一样。

依据MySQL认证时的排序规则,第一个条目的username排序更前。第二个条目的主机名更精确。排序更前。

而MySQL会优先使用主机名排序第一的条目进行身份认证。因此''@'localhost'被用户对client进行认证。

因此,仅仅有使用匿名用户的空password才干登录进数据库。

就会出现以下的情况了。

    解决办法:删除匿名用户(只为了安全也有这个必要)

为什么root用户不会受影响,而仅仅有普通用户不能从本地登录?

由于mysql_install_db脚本会在授权表中生成'root'@'localhost'这个账户。

相同的。使用root登录MySQL 时,'root'@'localhost'和''@'localhost'都能匹配登录的账户,可是依据排序规则,主机名相同。而username非空字符串优先。因此'root'@'localhost'这个条目的排序更靠前。

使用root本地登录是不会被匿名用户遮盖。


解决方法:

授权rose用户本地登陆:
mysql> grant all on prod.* to 'rose'@'localhost' identified by 'rose';

Query OK, 0 rows affected (0.01 sec)

从本地登陆:
[root@mysrv ~]# mysql -u rose -prose

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 26

Server version: 5.6.25-enterprise-commercial-advanced-log MySQL Enterprise Server - Advanced Edition (Commercial)

Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.


mysql> use prod;

Database changed

mysql> show tables;

+----------------+

| Tables_in_prod |

+----------------+

| t1             |

+----------------+

1 row in set (0.00 sec)



mysql> select * from t1;


+------+-------+

| id   | name  |

+------+-------+

|   10 | tom   |

|   20 | jerry |

|   30 | rose  |

+------+-------+

3 rows in set (0.00 sec)



---登陆成功!


MySQL Study之--MySQL普通用户无法本地登陆的更多相关文章

  1. MySQL Study之--MySQL用户及权限管理

    MySQL Study之--MySQL用户及权限管理     MySQLserver通过MySQL权限表来控制用户对数据库的訪问.MySQL权限表存放在mysql数据库里.由mysql_install ...

  2. MySQL Study之--MySQL schema_information数据库

    MySQL Study之--MySQL schema_information数据库       information_schema数据库是在mysql的版本号5.0之后产生的,一个虚拟数据库,物理上 ...

  3. MySQL Study之--MySQL压力測试工具mysqlslap

    MySQL Study之--MySQL压力測试工具mysqlslap 一.Mysqlslap介绍     mysqlslap是MySQL5.1之后自带的benchmark基准測试工具,类似Apache ...

  4. MySQL Study之--Mysql无法启动“mysql.host”

    MySQL Study之--Mysql无法启动"mysql.host" 系统环境: 操作系统:RedHat EL55 DB Soft:  Mysql 5.6.4-m7 通过源代码包 ...

  5. MySQL Study之--MySQL下图形工具的使用(MySQL Administrator)

    MySQL Study之--MySQL下图形工具的使用(MySQL Administrator) 系统环境:     操作系统: Windows  7(64) 下载地址:http://www.soft ...

  6. MySQL Study之--MySQL体系结构深入解析

    MySQL Study之--MySQL体系结构深入解析 MySQL体系架构 由连接池组件.管理服务和⼯工具组件.sql接口组件.查询分析器组件.优化器组件.缓冲组件.插件式存储引擎.物理⽂文件组成.m ...

  7. mysql创建新用户及新用户不能本地登陆的问题

    最近在搭建hadoop集群,主节点上面安装的MySQL数据库,对着方面不熟悉,为hive.Ooize等服务统一使用的root账号和密码,为了安全一些库对于某些用户是不可见的,所以需要针对不同的服务设置 ...

  8. mac下mysql重置密码及使用用户和密码登陆

    回车后 登录管理员权限 sudo su回车后输入以下命令来禁止mysql验证功能 ./mysqld_safe --skip-grant-tables &回车后mysql会自动重启(偏好设置中m ...

  9. MySQL普通用户无法本地登录的解决方法及MySQL的用户认证算法

    在安装完成MySQL后,我们通常添加拥有相应权限的普通用户用来访问数据库.在使用普通用户本地登录数据库的时候,经常会出现怎么登录也无法登录的情况. 例如,我的MySQL中的用户为: mysql> ...

随机推荐

  1. WinForm 控件键盘消息处理剖析(转)

    一直想整理键盘事件的调用顺序,刚好看见园子里的这篇文章,写的不错,就转载了:http://www.cnblogs.com/tedzhao/archive/2010/09/07/1820557.html ...

  2. Shuffle机制

    一个map task处理一个切片Split,切片是一个范围的数据,和blocksize大小没有必然关系. 1.每个map有一个环形内存缓冲区,用于存储任务的输出.默认大小100MB(io.sort.m ...

  3. 再谈git的http服务

    因为git服务器搬迁,需要重新安装git服务器,在网上搜索了下,发现之前的方法太复杂,复杂到自己都没彻底弄明白.其实通过git自带的git-http-backend脚本配合apache2的http服务 ...

  4. Error:不能将"char*"类型的值分配到"LPSTR"类型的实体 也许 "char*"类型的实参与"LPCWSTR"类型的形参不兼容

    http://www.myexception.cn/ruby-rails/1876106.html 选择“XXX项目”->“属性”->“配置属性”->“常规”选项中,把“使用 Uni ...

  5. webpack3--配置多入口和多出口

    上一篇我们稍微提到了webpack.config.js.今天主要来说下如何配置多入口,多出口. 我们之前写到的webpack.config.js,具体代码如下: module.exports = { ...

  6. 解决DoubanFM第三方客户端UI线程与工作线程交互问题

    最新文章:Virson's Blog 首先要感谢yk000123的慷慨开源,开源地址见:http://doubanfm.codeplex.com/ 最近正好在学习WPF,然后在Codeplex上找到了 ...

  7. git patch 使用

    使用git的时候,需要删除几个id,会对到之前的代码,但又想保留现在的代码,以便后面从新合并,所以就将现在的代码打包成patch,留到下次合并. 参考链接 http://www.jianshu.com ...

  8. 第三百八十四节,Django+Xadmin打造上线标准的在线教育平台—路由映射与静态文件配置以及会员注册

    第三百八十四节,Django+Xadmin打造上线标准的在线教育平台—路由映射与静态文件配置以及会员注册 基于类的路由映射 from django.conf.urls import url, incl ...

  9. Eclispe IDE集成Maven

    Eclipse提供了一个很好的插件m2eclipse 无缝将Maven和Eclipse集成在一起. m2eclipse一些特点如下 您可以从Eclipse运行Maven目标. 可以使用其自己的控制台查 ...

  10. 高校区LAN局域网校内网组建实践经验

    项目描述: ●校区计算机网络组建与管理和维护. 主要内容: 1.电脑故障诊断与排除与维护. 2.修复局域网内的故障电脑. 3.局域网架设虚拟系统. 4.局域网升级. 5.局域网基础架构. 6.电脑系统 ...