如何在 MySQL 中使用 SQL SECURITY DEFINER 特征定义的过程中检测真正的调用者名称?

Posted

技术标签:

【中文标题】如何在 MySQL 中使用 SQL SECURITY DEFINER 特征定义的过程中检测真正的调用者名称?【英文标题】:How to detect real invoker's name in procedure defined with SQL SECURITY DEFINER characteristic in MySQL? 【发布时间】:2016-01-20 18:12:42 【问题描述】:

简单来说,我有一个 mysql 过程 get_data(),它为用户选择过滤数据。自定义过滤条件存储在数据库表中。过程get_data() 应该获取当前用户的条件并通过添加WHERE 子句仅选择他的数据。

但是当我使用SQL SECURITY DEFINER 特征定义过程时,无法检测过程主体中的当前用户(调用者),因为函数current_user() 返回定义者的名称,当我使用SQL SECURITY INVOKER 特征定义过程时,过程失败,因为调用者在源表上没有SELECT 权限。

是否可以在 MySQL 中创建一个过程,从用户无法访问的表中为用户选择自定义数据?

目前,我已经定义了视图(每个用户一个),但是在查询条件不断变化的情况下维护它是很困难的。

【问题讨论】:

【参考方案1】:

您是否尝试过使用 user() 而不是 current_user()?

【讨论】:

是的。在我的例子中,user() 返回 'user1@localhost' 而 current_user() 返回 'user1@%'。可能解决方案没那么简单。 您为调用该程序的用户使用的登录名是什么?您如何登录?您用于创建程序的登录名是什么?

以上是关于如何在 MySQL 中使用 SQL SECURITY DEFINER 特征定义的过程中检测真正的调用者名称?的主要内容,如果未能解决你的问题,请参考以下文章