MemFire教程|PostgreSQL RLS介绍
前言
在使用MemFire Cloud的BaaS服务进行应用开发时,比较困扰开发者的是RLS的使用。本篇先从基本概念入手对RLS进行简要介绍,帮助大家理解RLS的工作机制和基本使用方法。
RLS是什么
全称:Row level security,行级安全,允许系统管理员为数据库表创建访问策略(policy),以约束数据的可见性。当为一个表创建了policy后,相当于为该表增加了一个高优先级的过滤器。当用户访问该表时,如果policy生效,则会根据policy中定义的过滤条件来决定用户可操作的数据集合。
如何开启RLS
RLS默认是不开启的,需要针对每个表执行如下语句来对该表开启RLS功能:
ALTER TABLE <name> ENABLE ROW LEVEL SECURITY
默认策略
当用户开启了RLS,但没有创建任何policy时,系统会启用默认策略。默认策略会拒绝用户访问该表中的任何数据。因此,在MemFire Cloud的应用中的表,如果启用RLS,至少要创建一条最简单的策略(如:允许任何人访问数据),否接口调试时会查询不到数据。
RLS 机制和 Grant指令有什么关系
grant是SQL标准语法,定义了一系列的数据访问权限的设置功能,比如允许用户对表执行查询操作,允许用户访问表中的哪些列。但是不能定义允许用户访问哪些行。
因此:RLS在某种程度上是对GRANT的一种补充,让用户能在行级别进行数据访问控制。
RLS不生效用户
RLS对三类用户不起作用:
- superuser
- owner
- 添加了bypassrls权限的用户
举例:
create table photos(username text, pic text);
insert into photos values('zhangsan', '1.jpg'), ('lisi', '2.jpg');create user zhangsan;
create user lisi;grant select on table photos to zhangsan;
grant select on table photos to lisi;-- 开启rls(没有创建policy的情况下,启用默认策略)
alter table photos ENABLE ROW LEVEL SECURITY;-- 以memfire用户查询数据(superuser)
select * from photos;-- 以zhangsan用户查询数据
set role zhangsan;
select * from photos;-- 将zhangsan设置为owner,再查询数据
set role memfire;
alter table photos owner to zhangsan;
set role zhangsan;
select * from photos;-- 给lisi赋予bypassrls权限
alter user lisi with bypassrls;
set role lisi;
select * from photos;
如果想对owner也启用rls,语法如下:
ALTER TABLE ... FORCE ROW LEVEL SECURITY.
Policy 解释
policy是RLS使用的核心,用户需要对数据进行访问控制时,允许哪些用户在对哪些数据有什么操作权限,全部通过policy定义。
语法
CREATE POLICY name ON table_name[ AS { PERMISSIVE | RESTRICTIVE } ][ FOR { ALL | SELECT | INSERT | UPDATE | DELETE } ][ TO { role_name | PUBLIC | CURRENT_ROLE | CURRENT_USER | SESSION_USER } [, ...] ][ USING ( using_expression ) ][ WITH CHECK ( check_expression ) ]
- name:同一个表上的policy不能重复,不同表的policy可以重复
- table_name:为哪个表创建policy
- AS,policy的生效模式,PERMISSIVE ,宽松模式,多个policy采用 or 进行组合判断,只要有一个policy过了就能访问数据;RESTRICTIVE,排他模式,必须满足的条件,当与其他policy组合使用时,使用 and 进行组合,只改条件不满足则其他条件再宽松也无用。默认PERMISSIVE 。
- For,对哪个操作生效,默认ALL
- TO,对哪个role生效,默认public
- USING:对表中的已有数据进行检查的语句
- WITH CHECK:对新数据进行检查的语句
举例
CREATE POLICY user_policy ON photosUSING (username = current_user)with check(true);select * from photos where username = current_user;
多条policy的生效机制
CREATE POLICY user_sel_policy ON photosFOR SELECTUSING (true);
CREATE POLICY user_mod_policy ON photosUSING (user_name = current_user);
上面这两条policy,第一条只对select操作生效,第二条对select、update、insert、delete都生效。
- 当执行select时,会用 or (PERMISSIVE )/ and(RESTRICTIVE )合并两个policy的条件。
- 当执行update、insert、delete时,只有第二条policy生效。
RLS的应用场景
RLS在MemFire Cloud中的核心用途就是多租户数据隔离,以todos为例,对todos表按用户不同进行了最简单的权限控制,即:每个人只能创建、查看、修改、删除自己的数据,对其他人均不可见:
create table public.todos (id bigint generated by default as identity primary key,user_id uuid references auth.users not null,task text check (char_length(task) > 3),is_complete boolean default false,inserted_at timestamp with time zone default timezone('utc'::text, now()) not null
);
create index idx_todos_uid on public.todos (user_id);
alter table public.todos enable row level security;create policy "个人只能创建自己的todos." on public.todos forinsert with check (auth.uid() = user_id);create policy "个人只能查看自己的todos. " on public.todos forselect using (auth.uid() = user_id);create policy "个人只能修改自己的todos." on public.todos forupdate using (auth.uid() = user_id);create policy "个人只能删除自己的todos." on public.todos fordelete using (auth.uid() = user_id);
MemFire教程|PostgreSQL RLS介绍相关推荐
- 微信开放平台 公众号第三方平台开发 教程一 平台介绍
教程导航: 微信开放平台 公众号第三方平台开发 教程一 平台介绍 微信开放平台 公众号第三方平台开发 教程二 创建公众号第三方平台 微信开放平台 公众号第三方平台开发 教程三 一键登录授权给第三方平台 ...
- 明日之后怎么跳过实名认证_明日之后新手教程能不能跳过 明日之后新手教程玩法介绍...
明日之后新手教程能不能跳过,明日之后游戏萌新注册账号后都会经历一段新手教程玩法才能正式体验游戏,不少小伙伴都最少花费30-50分钟才能完成,许多玩家都很好奇新手教程玩法能不能跳过,下面小编给大家带来明 ...
- word@tips官方文档和教程@软件界面介绍@功能区自定义@拼写检查@AI润色改进@ 图片顶部上方插入文字
文章目录 word 文档和教程 word软件界面元素 字符和标记 格式标记 段落标记(paragraph marks) 自定义功能区(Ribbon) 自定义功能区要点@层次关系 添加自定义选项卡(ta ...
- 我的世界租赁服务器重置,《我的世界》租赁服自动砍树命令教程 命令方块介绍...
<我的世界>租赁服自动砍树命令教程 命令方块介绍 2017-10-20 15:51:39来源:网易论坛编辑:评论(0) 一键命令方块 注意事项: 1.请将命令方块组放置在世界出生点区块,避 ...
- 精灵复兴 与服务器链接中断,精灵复兴一键服务端+视频架设教程+GM模式介绍+2036合成公式+客户端...
精灵复兴一键服务端+视频架设教程+GM模式介绍+2036合成公式+客户端 ---------------------------------------------------- 安装详解↓↓↓↓↓↓ ...
- 数据结构与算法(Java版) | 本套系列教程的内容介绍
文章目录 本套系列教程的内容介绍 第一章节:内容介绍和授课方式 第二章节:数据结构与算法的介绍 第三章节:稀疏数组和队列 第四章节:链表 第五章节:栈 第六章节:递归 第七章节:排序算法 第八章节:查 ...
- 递归神经网络教程(1)-RNN介绍
递归神经网络教程(1)-RNN介绍 Source: http://www.wildml.com/2015/09/recurrent-neural-networks-tutorial-part-1-in ...
- Cesium教程 (1) 界面介绍-3dtiles加载-更改鼠标操作设置
Cesium教程 (1) 界面介绍-3dtiles加载-更改鼠标操作设置 目录 1. 界面介绍 (7-8互换位置) 2. 数据转3dtiles 3. 代码详解 4. 其他 1. 界面介绍 (7-8互换 ...
- PostgreSQL索引介绍
梦中彩虹 博客园 首页 新随笔 联系 管理 随笔 - 131 文章 - 1 评论 - 14 PostgreSQL索引介绍 INDEX 索引是增强数据库性能的常用方法.索引使得数据库在查找和检索数据 ...
最新文章
- python如何调用文件进行换位加密_数据文件加密算法–换位加密法 | 学步园
- 用离散傅里叶变换来实现OFDM
- python: 关于解决‘\u‘开头的字符串转中文的方法
- 超图桌面版加载obj 3D模型
- Windows Terminal 完全配置教程(主题以及启动设置)
- 事件映射 消息映射_映射幻影收费站
- gradle官方文档_Spring Boot+Gradle+MyBatisPlus3.x搭建企业级的后台分离框架
- STM32H743+CubeMX-双路FDCAN同时工作的终极方案(裸机)
- [转载]Flex 2.0 实现SWF全屏
- Shell脚本编程之(四)善用判断式
- awk高级企业级使用案例
- dubbo的基于java的路由_1 | Dubbo:探讨标签路由的实现
- abb机器人指令手册_ABB机器人常见故障
- 基于《知网》的词汇语义相似度计算
- 计算机教室标语6个字,教室常用标语
- Android 打印之将文字转换成 Bitmap 图片,再转换成Bytes 数组 进行打印
- MOSFet cutoff frequency ( From google)
- 世界知名游戏公司简介(国内,欧美,日韩)
- 如何使移动设备字体大小自适应
- Mock工具介绍,为什么使用Mock?