MySQL普通用户无法本地登录的解决方法及MySQL的用户认证算法
在安装完成MySQL后,我们通常添加拥有相应权限的普通用户用来访问数据库。在使用普通用户本地登录数据库的时候,经常会出现怎么登录也无法登录的情况。
例如,我的MySQL中的用户为:
mysql> SELECT User, Host, Password FROM mysql.user; +------+------------------+-------------------------------------------+ | User | Host | Password | +------+------------------+-------------------------------------------+ | root | localhost | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 | | root | liao.localdomain | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 | | root | 127.0.0.1 | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 | | GaMe | % | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 | | root | % | *84BB5DF4823DA319BBF86C99624479A198E6EEE9 | | | localhost | | | | liao.localdomain | | +------+------------------+-------------------------------------------+
可以看到,我的数据库中有root用户,GaMe用户和匿名用户,GaMe用户的主机使用%代表所有主机。
GaMe用户的密码是'redhat', 匿名用户的密码为空
在本机使用GaMe账户登录数据库:
[root@liao ~]# mysql -uGaMe -p'redhat' ERROR 1045 (28000): Access denied for user 'GaMe'@'localhost' (using password: YES) [root@liao ~]# mysql -uGaMe -p'redhat' ERROR 1045 (28000): Access denied for user 'GaMe'@'localhost' (using password: YES)
结果是无论如何都提示登录被拒绝。
再次使用GaMe账户登录数据库,这次我使用空密码尝试
[root@liao ~]# mysql -uGaMe -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 59 Server version: 5.5.21-log Source distributionCopyright (c) 2000, 2011, 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>
登录成功了,使用USER()和CURRENT_USER()两个函数查看所使用的用户。
USER()函数返回你在客户端登陆时指定的用户名和主机名。
CURRENT_USER()函数返回的是MySQL使用授权表中的哪个用户来认证你的登录请求。
mysql> SELECT USER(), CURRENT_USER(); +----------------+----------------+ | USER() | CURRENT_USER() | +----------------+----------------+ | GaMe@localhost | @localhost | +----------------+----------------+ 1 row in set (0.00 sec)
这里发现,我使用'GaMe'@'localhost'这个账户登录数据库(因为在本地登陆时没指定主机,默认是以localhost登录),但是数据库使用的是''@'localhost'这个账户来进行登录认证,而''@'localhost'这个匿名用户是没有密码的,因此我输入空密码登录成功了。但是登录后,所对应的用户的匿名用户。
一般在MySQL在安装完毕后,我们使用mysql_install_db这个脚本生成授权表,会默认创建''@'localhost'这个匿名用户。正是因为这个匿名用户,影响了其他用户从本地登录的认证。
那么MySQL是如何进行用户身份认证呢?
通过Google查的资料,总结MySQL的简要认证算法如下:
- 当用户从客户端请求登陆时,MySQL将授权表中的条目与客户端所提供的条目进行比较,包括用户的用户名,密码和主机。
- 授权表中的Host字段是可以使用通配符作为模式进行匹配的,如test.example.com, %.example.com, %.com和%都可以匹配test.example.com这个主机。
- 授权表中的User字段不允许使用模式匹配,但是可以有一个空字符的用户名代表匿名用户,并且空字符串可以匹配所有的用户名,就像通配符一样。
- 当user表中的Host和User有多个值可以匹配客户端提供的主机和用户名时,MySQL将user表读入内存,并且按照一定规则排序,按照排序规则读取到的第一个匹配客户端用户名和主机名的条目对客户端进行身份验证。
排序规则:
- 对于Host字段,按照匹配的精确程度进行排序,越精确的排序越前,例如当匹配test.example.com这个主机时, %.example.com比%.com更精确,而test.example.com比%.example.com更精确。
- 对于User字段,非空的字符串用户名比空字符串匹配的用户名排序更靠前。
- User和Host字段都有多个匹配值,MySQL使用主机名排序最前的条目,在主机名字段相同时再选取用户名排序更前的条目。
- 因此,如果User和Host字段都有多个匹配值,主机名最精确匹配的条目被用户对用户进行认证。
了解了这个认证流程,就知道为什么GaMe登录失败了。
使用GaMe在本机登录数据时,不指定-h参数默认为localhost主机登录,而在MySQL中有两个匹配的条目:
- 'GaMe'@'%'
- ''@'localhost'
匿名用户能够匹配的原因上面说过,空字符串可以匹配所有的用户名,就像通配符一样。
根据MySQL认证时的排序规则,第一个条目的用户名排序更前,第二个条目的主机名更精确,排序更前。
而MySQL会优先使用主机名排序第一的条目进行身份认证,因此''@'localhost'被用户对客户端进行认证。因此,只有使用匿名用户的空密码才能登录进数据库。就会出现下面的情况了。
mysql> SELECT USER(), CURRENT_USER(); +----------------+----------------+ | USER() | CURRENT_USER() | +----------------+----------------+ | GaMe@localhost | @localhost | +----------------+----------------+ 1 row in set (0.00 sec)
解决的方法:删除匿名用户(仅仅为了安全也有这个必要)
为什么root用户不会受影响,而只有普通用户不能从本地登录?
因为mysql_install_db脚本会在授权表中生成'root'@'localhost'这个账户。同样的,使用root登录MySQL时,'root'@'localhost'和''@'localhost'都能匹配登录的账户,但是根据排序规则,主机名相同,而用户名非空字符串优先,因此'roo'@'localhost'这个条目的排序更靠前。使用root本地登录是不会被匿名用户遮盖。
转载于:https://www.cnblogs.com/linuxnote/p/3780244.html
MySQL普通用户无法本地登录的解决方法及MySQL的用户认证算法相关推荐
- mysql无法本地登陆_MySQL密码正确却无法本地登录的解决方法
MySQL root密码正确,却怎么也无法从本地登录MySQL,提示 复制代码 代码如下: ERROR 1045 (28000): Access denied for user 'root'@'loc ...
- mysql以user1登录_在mysql中创建用户后不能本地登录的解决方法
在安装完成MySQL后,我们通常添加拥有相应权限的普通用户用来访问数据库.在使用用户本地登录数据库的时候,经常会出现怎么登录也无法登录的情况,但是从其他的mysql客户端却可以登录. [root@my ...
- php5.5 mysql密码无法_MySQL密码正确却无法本地登录的解决方法
MySQL root密码正确,却怎么也无法从本地登录MySQL,提示 ERROR 1045 (28000): Access denied for user 'root'@'localhost' (us ...
- mysql连接数据库出现1251错误_连接MySQL数据库时出现#1251错误的解决方法
连接MySQL数据库时出现#1251错误的解决方法 连接MySQL数据库时常会出现如下的错误提示: #1251 - Client does not support authentication pro ...
- windows下本地或者远程连接MYSQL数据库,报1130错误的解决方法
windows下本地或者远程连接MYSQL数据库,报1130错误的解决方法 参考文章: (1)windows下本地或者远程连接MYSQL数据库,报1130错误的解决方法 (2)https://www. ...
- 共享未授予用户计算机登录,解决Win10 1909访问共享文件提示“未授予用户在此计算机上的请求登录类型”解决方法...
相信大家对于电脑非常不陌生吧,那你知道雨林木风Win10提示"未授予用户在此计算机上的请求登录类型"如何解决吗?是由于什么原因导致的呢?不知道了吧,其实局域网非常简单,大家只需要按 ...
- MySQL 1045登录失败解决方法
MySQL 1045登录失败解决方法 登录MySQL数据库出现:Error 1045错误,输入的用户名或密码错误被拒绝访问了 Error 1045错误: ERROR 1045 (28000): Acc ...
- 服务器连接显示18456,服务器:消息18456,级别16,状态1 用户‘sa’登录失败解决方法...
无法连接到服务器**: 服务器:消息18456,级别16,状态1 [Microsoft][ODBC SQL Server Driver][Sql server] 用户 'sa ...
- mysql 增删改查时的错误解决方法大全
mysql 增删改查时的错误解决方法大全 信息1:Error: Access denied for user: 'linanma@localhost' (Using password: YES ...
最新文章
- 划重点!《企业数字化升级之路》白皮书讲了哪些干货?
- 突破领域边界,探索文创文保新趋势
- SQL 学习笔记一 入门
- CTS(13)---CTS 测试之Media相关测试failed 小结(一)
- 【Paddle】实践作业——建立模型并测试100张图片
- yolo如何降低loss_YOLO训练中的问题与怀疑
- html dl dt dd 标签语法与使用
- Thinkphp6 获取当前协议+域名
- DELL戴尔笔记本关闭触摸板触控板WIN10
- 下列哪个不是python的第三方库_以下选项中,不是 Python 中用于开发用户界面的第三方库是()...
- 留痕笔记2.0升级到delphi11踩过的坑
- 两年工作经验的后端开发的工作方法小结
- 手机可以模拟NFC卡片吗?项目中如何解决不能模拟NFC Tag UID的问题
- CRM系统能给企业带来什么? CRM系统推荐
- Signing for “target“ requires a development team. Select a development team in the project editor.
- 直播App竞争激烈,请你分析,在这个红海市场中,各家App彼此竞争的关键因素有哪些?其中最重要的是什么?
- scratch3如何识别特殊按键
- [Java]Spring6(动力节点老杜)
- 前端-01-编写简单的导航栏
- php实训ppt,PHP动态网站开发实例教程教学全套课件(刘万辉)配套资料 任务3:运用目录与文件实现投票统计.ppt...