代码之家  ›  专栏  ›  技术社区  ›  Alwaysblue

Postgres RLS策略禁用选择

  •  1
  • Alwaysblue  · 技术社区  · 2 年前

    我想禁用一个postgres策略 select 操作。

    为此,我编写了以下安全策略

    create policy "workspace_data_only"
    on "public"."services_connected"
    as restrictive
    for all
    to anon
    using ((workspace_id = (((current_setting('request.jwt.claims'::text, true))::json ->> 'workspace_id'::text))::bigint));
    
    CREATE POLICY "rls_no_read"
      ON public.services_connected FOR SELECT
      to anon
      USING (FALSE);
    

    但我仍然可以查询和获取数据。我做错了什么?

    0 回复  |  直到 2 年前
        1
  •  1
  •   Laurenz Albe    2 年前

    如果要禁用,则根本不需要任何策略 SELECT 。禁止行级安全性未明确允许的任何操作。

    请确保为表启用了行级安全性:

    ALTER TABLE services_connected ENABLE ROW LEVEL SECURITY;
    

    如果你还能 选择 从表中,您的用户必须免除行级安全性。这可能有几个原因:

    1. 用户是表的所有者。可以使用强制表所有者的行级安全性

      ALTER TABLE services_connected FORCE ROW LEVEL SECURITY;
      
    2. 该用户是超级用户。超级用户总是不受行级安全性的约束。

    3. 用户是用创建的

      CREATE ROLE ... BYPASSRLS;
      
    4. 配置参数 row_security 已禁用。