【问题标题】:Role based authentication in SupabaseSupabase 中基于角色的身份验证
【发布时间】:2023-01-24 02:29:00
【问题描述】:

我正在尝试在 supabase 中制定政策,其中具有管理员角色的用户只能获得角色为“代理”的员工列表

有一个“用户”表,我正在尝试添加以下策略

"(auth.email() in (select users.email from users where users.role = 'admin')) and (role = 'agent')

用户表有以下列

名字 |姓 |角色 |电邮 |密码

但是我在用户表消息上得到无限递归。

如何在此处创建基于角色的策略? 提前致谢!

【问题讨论】:

标签: supabase supabase-database


【解决方案1】:

在对将设置 RLS 的表执行查询时,这是一个已知问题,因为策略查找也受策略约束。您将需要将查询移动到安全定义器函数中,并改为调用策略中的函数以避免无限递归。

CREATE OR REPLACE FUNCTION admin_only(email string)
  returns boolean AS
$$
  EXISTS (select users.email from users 
  where users.role = 'admin'
  and users.email = email)
$$ stable language sql security definer;

然后在您的政策中添加

admin_only(auth.email())

当您检查users.role是否为admin但同时您正在检查role是否也是agent时,我对您尝试应用的政策感到有些困惑,这是否意味着用户可以分配多个角色?

【讨论】:

  • 我正在检查请求 JWT 中的角色是否是管理员,这意味着只有管理员可以查询此资源,并且 api 应该只返回“角色”是代理的行。听起来很奇怪,但我是 supabase 的新手,正在尝试解决这个问题。
  • 另外,supabase 中的安全定义函数在哪里?
  • @Yash 您可以通过此视频了解如何在 Supabase 中创建安全定义器函数 youtu.be/0N6M5BBe9AE?t=356 您还可以使用 SQL 创建函数,正如 Andrew 所解释的那样!
  • 我在 supabase 中遇到错误:failed to run sql query: syntax error at or near "EXISTS"
  • @jopfre 我遇到了同样的问题,这个答案对我有帮助。结果比我想象的要简单得多。 stackoverflow.com/questions/73264248/…
【解决方案2】:

只需在EXISTS之前添加SELECT声明

【讨论】:

    猜你喜欢
    • 2016-01-03
    • 1970-01-01
    • 1970-01-01
    • 2014-04-04
    • 2015-05-17
    • 1970-01-01
    • 2021-11-22
    • 2019-10-10
    • 2017-08-03
    相关资源
    最近更新 更多