代码之家  ›  专栏  ›  技术社区  ›  Piyush Chauhan

新行违反了表“故事”的行级安全策略

  •  0
  • Piyush Chauhan  · 技术社区  · 2 年前

    我正在写一个脚本,以管理员的身份从网络上删除数据并将数据插入数据库。我希望只有特定电子邮件的用户才能在表中插入任何新记录。

      const { data, error } = await supabase.auth.signInWithPassword({ // Sign in as admin user
        email: '[email protected]',
        password: '*********',
      })
      console.log('login data', data) // prints all the session and user object
      console.log('login error', error) // prints null
    
      if (!error && data.session?.access_token && data.session?.refresh_token) {
        const { data: setSessionData, error: setSessionError } = await supabase.auth.setSession({
          access_token: data.session?.access_token,
          refresh_token: data.session?.refresh_token,
        })
        console.log('last session', await supabase.auth.getSession())
        // prints 'last session { data: { session: null }, error: null }'
      }
    
      const { error: insertError } = await supabase.from('stories').insert([record]) // record is the object that is already created above this code.
      console.log('error', insertError) 
      /* prints 'error {
      code: '42501',
      details: null,
      hint: null,
      message: 'new row violates row-level security policy for table "stories"'
      }' 
      */
      const { error: logutError } = await supabase.auth.signOut()
      console.log('logutError', logutError) // prints 'logutError null' means working 
    

    登录和注销正在工作。我不知道为什么成功登录后getSession不起作用。

    以下是不允许插入的管理员插入策略。 See insert RLS policy

    我试着允许RLS策略用于所有匿名用户,它正在工作。但当我应用管理员仅插入策略时不起作用。

    0 回复  |  直到 2 年前
        1
  •  1
  •   dshukertjr    2 年前

    你可以使用 Service Roke Key 初始化您的Supadase实例以绕过RLS。

    getSession 不起作用,因为您是在节点环境中调用它,而不是在web上。如果要插入服务器中的数据,请启用RLS,不要设置任何策略。这样,数据就不会被公开,但您仍然可以使用服务角色密钥插入数据。

    推荐文章