[[toc]]
适用范围
mysql 8.0
问题概述
在生产环境中,为了方便管理权限,通常会使用权限! 但在mysql 中同样的权限,直接授权给用户,用户可以登录使用! 而如果把权限授权给角色,在把角色授权给用户,用户却不能登录!
mysql> show grants for matomo_admin ;
+-----------------------------------------------------+
| Grants for matomo_admin@% |
+-----------------------------------------------------+
| GRANT USAGE ON *.* TO `matomo_admin`@`%` |
| GRANT `matomo_admin_role`@`%` TO `matomo_admin`@`%` |
+-----------------------------------------------------+
2 rows in set (0.00 sec)
mysql> show grants for matomo_admin_role ;
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Grants for matomo_admin_role@% |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| GRANT PROCESS, CREATE USER ON *.* TO `matomo_admin_role`@`%` |
| GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES, EXECUTE, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, TRIGGER ON `matomo`.* TO `matomo_admin_role`@`%` WITH GRANT OPTION |
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
2 rows in set (0.00 sec)
#指定数据库无法登录
[root@S2AVDXCOMSDB01 run]# mysql -umatomo_admin -p"matomo_Admin.3312" -h172.18.190.84 -P3312 -D matomo
mysql: [Warning] Using a password on the command line interface can be insecure.
ERROR 1044 (42000): Access denied for user 'matomo_admin'@'%' to database 'matomo'
问题原因
这是因为当您向用户帐户授予角色时,并不会在用户帐户连接到数据库服务器时自动使角色变为活动状态。
如果您调用该 CURRENT_ROLE() 函数,它将返回 NONE ,这意味着没有活动角色。
mysql> SELECT current_role();
+----------------+
| current_role() |
+----------------+
| NONE |
+----------------+
1 row in set (0.00 sec)
解决方案
- 需要指定每次用户帐户连接到数据库服务器时应激活哪些角色,请使用该 SET DEFAULT ROLE 语句。
以下语句为 matomo_admin@’%’ 帐户的所有分配角色设置默认值。
SET DEFAULT ROLE ALL TO matomo_admin@'%';
mysql> select CURRENT_ROLE() ;
+-------------------------+
| CURRENT_ROLE() |
+-------------------------+
| `matomo_admin_role`@`%` |
+-------------------------+
1 row in set (0.00 sec)
2.定义强制角色
[mysqld]
mandatory_roles='role1,role2@localhost,matomo_admin_role@%'
然后重启DB
3.用户登录服务器时是否启用自动激活所有授予的角色,这优先于用 指定的默认角色SET DEFAULT ROLE。
[mysqld]
activate_all_roles_on_login=ON
然后重启DB
参考文档
https://dev.mysql.com/doc/refman/8.0/en/set-default-role.html
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




