java.sql.SQLException: Access denied for user 'xxxx'@'localhost'

688 阅读2分钟

由于临时需求改动,开发排期很紧张,需要迅速单独开发一个服务,于是我采用springboot来提供服务,在开发完成后和前端联调,本地调试一切正常,部署到了服务器当前端请求接口控制台报了个:

java.sql.SQLException: Access denied for user 'xxxx'@'localhost' (using password: YES)

这个报错信息很明显 意思就是说:

xxxx这个用户被拒绝访问数据库

我第一时间查看了我的配置文件: spring.datasource.name = root

确认是root并检索了我代码了都没有xxxx这个字段....

我配置的是root呀,那xxxx这个用户是哪来的?这不科学为什么?

后来发现这个xxxx是服务器的系统用户名,我顿时茅塞顿开,应该是错把系统用户当作数据库用户了,那到底是哪里出了问题?

spring.datasource.name = root 。

spring.datasource.name:

Datasource name to use if "generate-unique-name" is false,when using an embedded database,otherwise null.(如果“generate-unique-name”为false,则使用的数据源名称。默认为“testdb”.使用嵌入式数据库时,否则为 null)

由此得知,数据源 name属性是用来配置数据源或者嵌入式数据库的。而我则因为这个name,错把系统user当作数据库name,由此可以推论:如果没有配置嵌入数据库的情况下,name则会取到本机用户名。

spring.datasource.username:

妥妥的数据库登录用户名。

本地数据库免密登录:

问题是解决了,但我又萌生了另外一个问题,那为什么我本地这个配置却可以,按照现在的推断,应该在本地也会报这个错误才对?

后来又排查了一波,发现本地数据库做了免密登录,也就是跳过权限验证:skip-grant-tables

这样即使不配置用户密码依然可以成功访问数据库。

配置数据库用户密码(mysql 5.7.22):

1.首先通过在mysql.ini文件里配置跳过权限skip-grant-tables登录mysql。

2.user mysql; 

3.update mysql.user set authentication_string=password('xxxxx') where user='root' and Host ='localhost';

4.重启mysql服务

5.测试免密登录失败

6.用户名密码登录成功:   mysql -uroot -p 

                   password : xxxx