如何用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中配置计算字段
- 进入Hasura控制台,找到
users表 - 切换到Computed Fields标签,点击Add Computed Field
- 选择刚创建的
get_user_email函数,设置参数为id(users表的主键),给计算字段命名(比如conditional_email) - 在该计算字段的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
相关产品推荐
相关产品推荐

