Mysql 8.0前后,实现创建用户,指定用户只能访问指定的数据库中的表

最近在做公司项目的过程中,出现了这样的需求。第三方系统需要将数据写到我们的业务系统中,由于目前这些数据没有实际的使用场景,在讨论下,为简单快捷,选择第二种方案,即不书写接口,第三方系统通过数据库直接将数据写入到业务系统的数据库中。但是呢又不能将ROOT用户分配给第三方,所以在数据库建立私有用户,指定用户只能访问指定的数据库中的表。

我们的数据库版本 MySQL 8.0.19

1、已有数据库就不进行创建啦,名称(dbTestErp)

2、创建用户并设置密码

create user usertwo@'%' identified by 'test%^*';

'%' - 所有情况都能访问
'localhost' - 本机才能访问
'192.168.0.1' - 指定 ip 才能访问

3、授予该用户访问该数据库时的权限

grant select,insert on dbTestErp.stsalesOrderitems to usertwo@'%' with grant option;

//将数据库的所有权限赋给这个用户
grant all privileges on dbTestErp.stsalesOrderitems to usertwo@'%' with grant option;

'%' - 所有情况都能访问
'localhost' - 本机才能访问
'192.168.0.1' - 指定 ip 才能访问
例子:
1、grant all privileges on dbTestErp.stsalesOrderitems to usertwo@'%' with grant option; 
2、grant all privileges on dbTestErp.stsalesOrderitems to usertwo@localhost with grant option;
3、grant all privileges on dbTestErp.stsalesOrderitems to usertwo@192.168.0.1 with grant option;

3.1注:最好不要将所有权限赋值给除root以外的用户

在MySQL8.0中,如果创建了用户并授予了 all 权限,那么即便用 root 用户也可能无法删除这些用户。会报 ERROR 1227 (42000): Access denied; you need (at least one of) the SYSTEM_USER privilege(s) for this operation

【原因】由于MySQL 8.0新增了一个SYSTEM_USER权限,如果创建用户并授予 all 权限时,就会赋予SYSTEM_USER权限,而root用户并没有这个权限,所以无法删除其他用户

【解决】授予root用户SYSTEM_USER,然后删除其他用户

show grants for 'root'@'%';
grant SYSTEM_USER on *.* to 'root'@'%';
flush privileges;
drop user 'test'@'%';

3.2、with grant option 可以省略,也可以加,但是加后会出现一些问题。
with grant option 这个选项表示该用户可以将自己拥有的权限授权给别人。注意:经常有人在创建操作用户的时候不指定with grant option 选项导致后来该用户不能使用GRANT命令创建用户或者给其它用户授权。

3.3、下面为MySQL 5.7 授权命令

grant all privileges on dbTestErp.stsalesOrderitems to usertwo@'%' identified by 'test%^*';

当在 MySQL 8.0.19 中使用上述命令时会出现下面的错误。查看数据库版本,高版本数据库不能按照上面的方式进行授权;
在高版本中修改用户权限,必须分两步来实现设置用户权限【先创建用户、再对该用户分配用户权限】

> 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'identified by 'test%^*'' at line 1

4、刷新权限,否则可能无法立即生效。

flush privilege;

注:双方传数时,若是数据库的版本一个为5.x.x,另一个为8.x.x ,会报出下面错误

Client does not support authentication protocol requested by server; consider upgrading MySQL client.

  MySQL 8之前的版本中加密规则是mysql_native_password,而在MySQL 8之后,加密规则是caching_sha2_password,所以需要改变MySQL的加密规则

ALTER USER 'usertwo'@'%' IDENTIFIED WITH mysql_native_password BY 'test%^*';
posted @ 2023-03-04 22:54  悟自省  阅读(168)  评论(0编辑  收藏  举报