作者:Rahul Sisondia 译:徐轶韬
这是一个由3部分组成的博客系列:
第1部分:SYSTEM_USER动态权限
第2部分:撤销部分数据库对象权限
第3部分:如何为应用创建多个帐户?
要修改用户,您必须具有mysql schema的CREATE USER权限或UPDATE权限。我们添加了SYSTEM_USER动态权限,可以保护用户被其他具有CREATE USER权限的修改。没有SYSTEM_USER的帐户无法修改具有SYSTEM_USER权限的帐户,即使该帐户具有CREATE USER权限。
在本文中,我们将介绍第一个用例。下一篇博文中将介绍如何防止对mysql schema具有“UPDATE”权限的帐户对其他账户进行修改 。
SYSTEM_USER权限如何工作?
SYSTEM_USER权限强制执行以下约定:如果要修改具有SYSTEM_USER权限的用户,除了修改用户所需的权限之外,还需要具有SYSTEM_USER权限。换句话说,具有SYSTEM_USER和CREATE USER权限的用户可以修改具有SYSTEM_USER权限的用户。
让我们通过例子更好地理解:
以root用户身份创建两个用户。一个用户具有CREATE USER权限,另一个用户具有SYSTEM_USER权限。

现在,尝试从admin_user更改elite_user的密码。

返回root用户会话并创建另一个具有这两种权限的用户。

尝试通过新创建的power_user用户修改。

如果通过角色授予权限会怎样?
如果为用户授予角色,则用户仅在激活该角色后才能在给定会话中获取角色的功能。如果用户未直接授予SYSTEM_USER,仅通过一个或多个角色授予权限,则需要激活具有SYSTEM_USER的角色,否则用户的会话不具有SYSTEM_USER权限。一旦激活了这样的角色,用户就能够修改具有SYSTEM_USER权限的其他用户。
让我们通过例子来理解。
创建具有SYSTEM_USER权限的角色。将该角色授予我们在上一个示例中创建的admin_user。

即使授予admin_user角色,该用户也只能在激活该角色后修改elite_user。

什么时候可以向其他用户授予或撤消SYSTEM_USER权限?
仅当您具有使用GRANT OPTION授予的SYSTEM_USER权限时。正如我们所看到的,即使用户具有GRANT OPTION的SUPER权限,它也无法从其他用户撤消SYSTEM_USER。

如果用户具有带有GRANT OPTION的SYSTEM_USER,则可以从其他用户撤消SYSTEM_USER。

您可以通过函数或存储程序升级权限吗?
如果您具有SET_USER_ID权限,则可以使用DEFINER属性创建存储程序,并将DEFINER属性设置为任何用户。
这意味着您可以通过在definer属性中指定SYSTEM_USER,用户来授予自己SYSTEM_USER权限,是这样吗?
当然不是这样。要将DEFINER设置为具有SYSTEM_USER权限的用户,还必须具有SYSTEM_USER权限以及SET_USER_ID权限。
让我们通过例子来理解:
有三个用户。如此处所示,admin_user具有创建存储程序的权限,elite_user可以执行程序并具有SYSTEM_USER权限,而regular_user可以执行程序但没有SYSTEM_USER权限。

admin_user尝试使用具有SYSTEM_USER权限的定义程序创建存储程序,但它会收到错误。

试图在存储的程序中授予SYSTEM_USER权限也没有成功。

接受DEFINER属性的其他数据库对象的行为与上面演示的类似。这些对象是:function,view,trigger,event。
在角色的情况下会有一些有趣的场景。我不应该一个人玩得开心,所以我将这些场景留给你试试
哪些用户在新的或升级的MySQL安装中被授予SYSTEM_USER权限?
作为起点,必须至少有一个具有SYSTEM_USER权限的用户。在升级服务器时,具有SET_USER_ID权限的用户被授予SYSTEM_USER权限。如果没有用户具有SET_USER_ID权限,则具有SUPER权限的用户将被授予SYSTEM_USER权限。我们选择SET_USER_ID来做出此决定,因为它是管理权限之一。它使用户能够在视图或存储程序的DEFINER属性中指定任何帐户,这是SYSTEM_USER应用的操作。
SYSTEM_USER权限如何与system_user()函数或OS用户相关联?
SYSTEM_USER() 函数返回当前连接到服务器的mysql用户。它是user()函数的同义词。操作系统用户通常也称为系统用户。
您可能已经注意到,SYSTEM_USER权限与system_user()或OS用户无关。我们将该权限命名为“SYSTEM_USER”,因为它恰当地描述了意图。
结论
在这篇博文中,我们了解了SYSTEM_USER权限的目的以及它是如何工作的。在接下来的博客文章中,我们将进一步研究如何在数据库对象上创建部分撤销,以防止直接修改mysql schema中的用户。
在本系列的最后一篇博客文章中,我们将把各个部分组合在一起,为应用程序创建多个用户。
感谢您使用MySQL!




