You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Hasura配置列级条件访问控制:Manager角色仅同组织可见邮箱列

实现Hasura列级条件值返回(Manager角色按组织控制email可见性)

完全可以实现你要的需求,核心是通过自定义SQL函数+Hasura计算字段来封装条件逻辑,替代直接访问原email列,具体步骤如下:

步骤1:创建SQL函数判断组织归属并返回对应值

假设你的表结构是:

  • users表:id, name, email, organization_id(关联组织表的外键)
  • organizations表:id(组织ID)
  • Hasura会话中已配置当前用户的x-hasura-user-id和x-hasura-organization-id(从JWT或会话变量中获取)

以PostgreSQL为例创建SQL函数:

CREATE OR REPLACE FUNCTION get_user_email(user_id INT)
RETURNS TEXT AS $$
DECLARE
    current_user_org_id INT;
    target_user_org_id INT;
BEGIN
    -- 从Hasura会话获取当前登录Manager的组织ID
    SELECT current_setting('hasura.session.x-hasura-organization-id')::INT INTO current_user_org_id;
    -- 获取被查询用户的组织ID
    SELECT organization_id INTO target_user_org_id FROM users WHERE id = user_id;
    -- 对比组织ID,相同返回email,否则返回NULL
    IF current_user_org_id = target_user_org_id THEN
        RETURN (SELECT email FROM users WHERE id = user_id);
    ELSE
        RETURN NULL;
    END IF;
END;
$$ LANGUAGE plpgsql STABLE;

步骤2:在Hasura中配置计算字段

  1. 进入Hasura控制台,找到users表
  2. 切换到Computed Fields标签,点击Add Computed Field
  3. 选择刚创建的get_user_email函数,设置参数为id(users表的主键),给计算字段命名(比如conditional_email)
  4. 在该计算字段的Permissions设置中,给Manager角色授予Select权限

步骤3:调整原email列的权限(可选)

如果想完全替换原email列的访问逻辑:

  • 移除Manager角色对users表email列的Select权限
  • 前端查询时改用conditional_email字段,不满足组织归属条件时会自动返回NULL

简化方案:用视图直接封装逻辑(适合简单场景)

如果不需要复杂逻辑,也可以通过创建视图实现:

CREATE VIEW users_with_conditional_email AS
SELECT
    id,
    name,
    CASE
        WHEN (current_setting('hasura.session.x-hasura-organization-id')::INT = organization_id) THEN email
        ELSE NULL
    END AS email
FROM users;

在Hasura中添加这个视图,给Manager角色授予视图的Select权限,查询该视图时email会根据组织归属返回对应值或NULL。

注意:需确保Hasura会话中正确传递了当前用户的组织ID,可通过JWT token注入或自定义会话变量配置实现。

内容的提问来源于stack exchange,提问作者alexanoid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 11:12:19