首页 > 其他分享 >保姆级教程——使用行级安全策略(RLS)管理用户数据

保姆级教程——使用行级安全策略(RLS)管理用户数据

时间:2024-05-30 09:31:02浏览次数:14  
标签:行级 users 安全策略 用户 profiles id auth public RLS

出于安全目的,auth模式不会在自动生成的API上公开。

尽管MemFireCloud提供了一个auth.users表,用于存储用户身份验证信息,但是当你希望通过API访问用户数据时,创建在public模式中的其他表也是有帮助的。 这意味着你可以在公共模式中创建自定义的表格,用于存储其他与用户相关的数据,以便通过API进行访问和操作。这样可以灵活地组织和管理你的用户数据,并与auth.users表中的用户身份验证信息结合使用。

创建用户表

当你创建用于存储用户数据的表时,参考auth.users表的主键可以确保数据完整性。 在引用auth.users时,还要指定on delete cascade子句。省略此子句可能会在删除用户时导致问题。

例如,一个public.profiles表可能如下所示:

create table public.profiles (
  id uuid references auth.users not null,
  first_name text,
  last_name text,

  primary key (id)
);

alter table public.profiles enable row level security;

info

如果设置了用户令牌使用服务密钥初始化客户端,不会覆盖行级安全(RLS)。如果用户使用客户端登录,MemFireCloud将遵循该用户的行级安全策略。

公共通道

由于启用了行级别安全性,因此可以通过API访问此表,但除非我们设置了一些策略,否则不会返回任何数据。 如果我们希望每个人都可以读取数据,但只允许登录用户更新自己的数据,则策略如下:

create policy "Public profiles are viewable by everyone."
  on profiles for select
  using ( true );

create policy "Users can insert their own profile."
  on profiles for insert
  with check ( auth.uid() = id );

create policy "Users can update own profile."
  on profiles for update
  using ( auth.uid() = id );

私人访问

如果数据只能由拥有数据的用户读取,我们只需要更改上面的for select查询。

create policy "Profiles are viewable by users who created them."
on profiles for select
using ( auth.uid() = id );

这种模式的好处是什么?我们现在可以通过API查询此表,我们不需要在API查询中包含数据过滤器-策略将为我们处理:

// This will return nothing while the user is logged out
const { data } = await supabase.from('profiles').select('id, username, avatar_url, website')

// After the user is logged in, this will only return
// the logged-in user's data - in this case a single row
const { error } = await supabase.auth.signIn({ email })
const { data: profile } = await supabase
  .from('profiles')
  .select('id, username, avatar_url, website')

绕过行级安全性

如果您需要获取完整的用户配置文件列表,我们将提供一个service_key,您可以使用它与API和客户端库一起绕过行级别安全性。

确保你从未公开披露过。但它可以在服务器端用于获取所有配置文件。

先进的技术

使用触发器

如果要将行添加到public。每次用户注册时,您都可以使用触发器。 然而,如果触发器失败,它可能会阻止用户注册,因此请确保代码经过良好测试。

例如:

-- inserts a row into public.users
create function public.handle_new_user()
returns trigger
language plpgsql
security definer set search_path = public
as $$
begin
  insert into public.profiles (id)
  values (new.id);
  return new;
end;
$$;

-- trigger the function every time a user is created
create trigger on_auth_user_created
  after insert on auth.users
  for each row execute procedure public.handle_new_user();

资料:MemFireCloud

标签:行级,users,安全策略,用户,profiles,id,auth,public,RLS
From: https://blog.csdn.net/weixin_44957042/article/details/139311724

相关文章

  • Javascript:如何替换 urls 和 youtube urls,并将 urls 替换为锚标签,将 youtube urls 替
    如果字符串返回:str=``https://www.google.comhttp://google.comhttps://www.youtube.com/live/gNIQWYgf-0https://www.youtube.com/embed/3ul2LYG6j14?si=fgxYHjyt6zBmoYErhttps://youtu.be/75Dhfjf6hfjfj这还必须考虑到......
  • URLSearchParams:url查询处理工具
    letparams=newURLSearchParams(a=1&b=2&c=3#hash)方法和属性:.get('').has('')//返回true/false.append(name,value)//向URL中添加新的参数.set(name,value)//设置指定参数的值,如果参数不存在则添加新参数.delete(name)//删除指定名称的参数.key()......
  • Windows无法访问共享文件夹,提示:你不能访问此共享文件夹,因为你组织的安全策略阻止未经
    1、问题描述Windows系统里访问局域网共享文件夹时,提示:“你不能访问此共享文件夹,因为你组织的安全策略阻止未经身份验证的来宾访问。这些策略可帮助保护你的电脑免受网络上不安全设备或恶意设备的威胁。”2、主要原因未启动启用策略:不安全的来宾登录3、解决方法1)Windows+R键,打开运......
  • openGauss 设置安全策略
    设置安全策略设置帐户安全策略设置帐号有效期设置密码安全策略详情查看:https://opengauss.org详情查看:https://docs-opengauss.osinfra.cn......
  • openGauss 行级访问控制
    行级访问控制行级访问控制特性将数据库访问控制精确到数据表行级别,使数据库达到行级访问控制的能力。不同用户执行相同的SQL查询操作,读取到的结果是不同的。用户可以在数据表创建行访问控制(RowLevelSecurity)策略,该策略是指针对特定数据库用户、特定SQL操作生效的表达式。当......
  • openGauss 设置帐户安全策略
    设置帐户安全策略背景信息openGauss为帐户提供了自动锁定和解锁帐户、手动锁定和解锁异常帐户和删除不再使用的帐户等一系列的安全措施,保证数据安全。自动锁定和解锁帐户为了保证帐户安全,如果用户输入密码次数超过一定次数(failed_login_attempts),系统将自动锁定该帐户,默认值......
  • openGauss 设置文件权限安全策略
    设置文件权限安全策略背景信息数据库在安装过程中,会自动对其文件权限(包括运行过程中生成的文件,如日志文件等)进行设置。其权限规则如下:数据库程序目录的权限为0750。数据库数据文件目录的权限为0700。数据库部署时通过创建xml配置文件中的tmpMppdbPath参数指定目录(若未指......
  • Linux启动过程以及7种运行级别
    Linux启动过程Linux启动需要经历一些步骤,这些步骤确保系统能够在各种不同的硬件和配置条件下可靠地启动和运行,并且具有足够的灵活性以适应不同的使用场景和需求,具体步骤如下:BIOS/UEFI初始化(硬件初始化):执行基本输入输出系统(BIOS)或统一可扩展接口(UEFI)中的初始化程序。这些程......
  • centos8报错错误:为 repo 'appstream' 下载元数据失败 : Cannot prepare internal mirr
    出现如下错误的错误:为repo‘appstream’下载元数据失败:Cannotprepareinternalmirrorlist:NoURLsinmirrorlist原因在2022年1月31日,CentOS团队终于从官方镜像中移除CentOS8的所有包。CentOS8已于2021年12月31日寿终正非,但软件包仍在官方镜像上保留了一段时间。现在......
  • uniapp-设置UrlSchemes从外部浏览器H5打开app
    需求:外部浏览器H5页面,跳转到uniapp开发的原生app内部。1、uniapp内部的配置:(1)打开manifest->App常用其他设置,如下,按照提示输入您要设置的urlSchemes:(2)填写配置之后,可到manifest->源码试图查看,如下:(3)uniapp中修改了manifest配置之后,一定要重新打包,然后再运行到手机,否则可......