Pg权限分为两部分,一部分是“系统权限”或者数据库用户的属性,可以授予role或user(两者区别在于login权限);一部分为数据库对象上的操作权限。对超级用户不做权限检查,其它走acl。对于数据库对象,开始只有所有者和超级用户可以做任何操作,其它走acl。在pg里,对acl模型做了简化,组和角色都是role,用户和角色的区别是角色没有login权限。
可以用下面的命令创建和删除角色,
CREATE ROLE name;
DROP ROLE name;
为了方便,也可以在 shell 命令上直接调用程序 createuser 和 dropuser,这些工具对相应命令提供了封装:
createuser name
dropuser name
数据库对象上的权限有:SELECT,INSERT, UPDATE,DELETE,RULE, REFERENCES,TRIGGER,CREATE, TEMPORARY,EXECUTE,和 USAGE等,具体见下面定义
typedefuint32AclMode; /* a bitmask of privilege bits */
#define ACL_INSERT (1<<0) /* for relations */
#define ACL_SELECT (1<<1)
#define ACL_UPDATE (1<<2)
#define ACL_DELETE (1<<3)
#define ACL_TRUNCATE (1<<4)
#define ACL_REFERENCES (1<<5)
#define ACL_TRIGGER (1<<6)
#define ACL_EXECUTE (1<<7) /* for functions */
#define ACL_USAGE (1<<8) /* for languages, namespaces, FDWs, and
* servers */
#define ACL_CREATE (1<<9) /* for namespaces and databases */
#define ACL_CREATE_TEMP (1<<10) /* for databases */
#define ACL_CONNECT (1<<11) /* for databases */
#define N_ACL_RIGHTS 12 /* 1 plus the last 1<<x */
#define ACL_NO_RIGHTS 0
/* Currently, SELECT ... FOR UPDATE/FOR SHARE requires UPDATE privileges */
#define ACL_SELECT_FOR_UPDATE ACL_UPDATE
我们可以用特殊的名字 PUBLIC 把对象的权限赋予系统中的所有角色。 在权限声明的位置上写 ALL,表示把适用于该对象的所有权限都赋予目标角色。
beigang=# grant all on schema csm_ca to public;
GRANT
beigang=# revoke all on schema csm_ca from public;
REVOKE
beigang=#
每种对象的all权限定义如下:
/*
* Bitmasks defining "all rights" for each supported object type
*/
#define ACL_ALL_RIGHTS_COLUMN (ACL_INSERT|ACL_SELECT|ACL_UPDATE|ACL_REFERENCES)
#define ACL_ALL_RIGHTS_RELATION (ACL_INSERT|ACL_SELECT|ACL_UPDATE|ACL_DELETE|ACL_TRUNCATE|ACL_REFERENCES|ACL_TRIGGER)
#define ACL_ALL_RIGHTS_SEQUENCE (ACL_USAGE|ACL_SELECT|ACL_UPDATE)
#define ACL_ALL_RIGHTS_DATABASE (ACL_CREATE|ACL_CREATE_TEMP|ACL_CONNECT)
#define ACL_ALL_RIGHTS_FDW (ACL_USAGE)
#define ACL_ALL_RIGHTS_FOREIGN_SERVER (ACL_USAGE)
#define ACL_ALL_RIGHTS_FUNCTION (ACL_EXECUTE)
#define ACL_ALL_RIGHTS_LANGUAGE (ACL_USAGE)
#define ACL_ALL_RIGHTS_LARGEOBJECT (ACL_SELECT|ACL_UPDATE)
#define ACL_ALL_RIGHTS_NAMESPACE (ACL_USAGE|ACL_CREATE)
#define ACL_ALL_RIGHTS_TABLESPACE (ACL_CREATE)
用户的属性可参见下图:
视图 pg_roles提供访问数据库角色有关信息的接口。 它只是一个 pg_authid 表的公开可读部分的视图,把口令字段用空白填充了。
名字 |
类型 |
引用 |
描述 |
rolname |
name |
|
角色名 |
rolsuper |
bool |
|
有超级用户权限的角色 |
rolcreaterole |
bool |
|
可以创建更多角色的角色 |
rolcreatedb |
bool |
|
可以创建数据库的角色 |
rolcatupdate |
bool |
|
可以直接更新系统表的角色。(除非这个字段为真,否则超级用户也不能干这个事情。) |
rolcanlogin |
bool |
|
可以登录的角色,也就是说,这个角色可以给予初始化会话认证的标识符。 |
rolpassword |
text |
|
不是口令(总是 ********) |
rolvaliduntil |
timestamptz |
|
口令失效日期(只用于口令认证);如果没有失效期,为 NULL |
rolconfig |
text[] |
|
运行时配置变量的会话缺省 |
下面实验验证
先创建一个角色xxx,再创建一个超级用户csm、普通用户csm_ca,csm用户创建一个数据库testdb,在这个数据库里创建一个schema:csm_ca,然后赋予普通用户csm_ca操作数据库testdb里schema:csm_ca里的表的权限。
1
Create role:
testdb=# create role xxx with superuser;
CREATE ROLE
2
Create user:
testdb=# create user csm with superuser password 'csm';
CREATE ROLE
testdb=# create user csm_ca with password 'csm_ca';
CREATE ROLE
testdb=#
3
验证
testdb=# \du
角色列表
-[ RECORD 1 ]--------------------------------------
角色名称 | csm
属性 | 超级用户
成员属于 | {}
-[ RECORD 2 ]--------------------------------------
角色名称 | csm_ca
属性 |
成员属于 | {}
-[ RECORD 3 ]--------------------------------------
角色名称 | postgres
属性 | 超级用户, 建立角色, 建立 DB, Replication
成员属于 | {}
-[ RECORD 4 ]--------------------------------------
角色名称 | xxx
属性 | 超级用户, 无法登录
成员属于 | {}
testdb=# SELECT * FROM pg_roles;
-[ RECORD 1 ]---------+---------
rolname | postgres
rolsuper | t
rolinherit | t
rolcreaterole | t
rolcreatedb | t
rolcreatedblink | t
rolcreatepublicdblink | t
roldroppublicdblink | t
rolcatupdate | t
rolcanlogin | t
rolreplication | t
rolconnlimit | -1
rolpassword | ********
rolvaliduntil |
rolconfig |
oid | 10
-[ RECORD 2 ]---------+---------
rolname | csm
rolsuper | t
rolinherit | t
rolcreaterole | f
rolcreatedb | f
rolcreatedblink | f
rolcreatepublicdblink | f
roldroppublicdblink | f
rolcatupdate | t
rolcanlogin | t
rolreplication | f
rolconnlimit | -1
rolpassword | ********
rolvaliduntil |
rolconfig |
oid | 24598
-[ RECORD 3 ]---------+---------
rolname | csm_ca
rolsuper | f
rolinherit | t
rolcreaterole | f
rolcreatedb | f
rolcreatedblink | f
rolcreatepublicdblink | f
roldroppublicdblink | f
rolcatupdate | f
rolcanlogin | t
rolreplication | f
rolconnlimit | -1
rolpassword | ********
rolvaliduntil |
rolconfig |
oid | 24599
-[ RECORD 4 ]---------+---------
rolname | xxx
rolsuper | t
rolinherit | t
rolcreaterole | f
rolcreatedb | f
rolcreatedblink | f
rolcreatepublicdblink | f
roldroppublicdblink | f
rolcatupdate | t
rolcanlogin | f
rolreplication | f
rolconnlimit | -1
rolpassword | ********
rolvaliduntil |
rolconfig |
oid | 24600
postgres=# \c beigang
You are now connected to database "beigang" as user "csm".
5
Csm用户在beigang里创建schema: csm_ca
beigang=#
beigang=#
beigang=# create schema csm_ca;
CREATE SCHEMA
beigang=#
6
验证模式csm_ca和用户csm_ca
beigang=# \dn
架构模式列表
名称 | 拥有者
--------+----------
csm_ca | csm
dbo | postgres
public | postgres
sys | postgres
(4 行记录)
beigang=# \du
角色列表
角色名称 | 属性 | 成员属于
----------+------------------------------------------+----------
csm | 超级用户 | {}
csm_ca | | {}
postgres | 超级用户, 建立角色, 建立 DB, Replication | {}
xxx | 超级用户, 无法登录 | {}
beigang=#
7
超级用户csm给普通用户csm_ca授予操作schema csm_ca的权限
beigang=# grant all on schema csm_ca to csm_ca;
GRANT
beigang=# grant all on all tables in schema csm_ca to csm_ca;
GRANT
beigang=#
8
pg中组就是role,操作见以下
beigang=# grant xxx to csm_ca;
GRANT ROLE
beigang=# revoke xxx from csm_ca;
REVOKE ROLE
beigang=#
参考:
Pg documentation
src/include/nodes/parsenodes.h
src/include/utils/acl.h
----------------
转载请著明出处,来自以下博客或mail至beigaang@gmail.com联系:
blog.csdn.net/beiigang
beigang.iteye.com
相关推荐
PostgreSQL是通过角色来管理数据库访问权限的,我们可以将一个角色看成是一个数据库用户,或者一组数据库用户。角色可以拥有数据库对象,如表、索引,也可以把这些对象上的权限赋予其它角色,以控制哪些用户对哪些...
18. 数据库角色和权限 19. 管理数据库 20. 用户认证 21. 区域 22. 日常数据库维护工作 23. 备份与恢复 24. 高可用性与负载均衡 25. 监控数据库的活动 26. 监控磁盘使用情况 27. 可靠性和预写式日志 28. ...
数据库角色和权限 19. 管理数据库 20. 用户认证 21. 区域 22. 日常数据库维护工作 23. 备份与恢复 24. 高可用性与负载均衡 25. 监控数据库的活动 26. 监控磁盘使用情况 27. 可靠性和预写式日志 28. 回归...
技术路线 Asp.net Core Mvc EntityFrameworkCore Bootstrap AdminLTE PostgreSQL 实现功能 组织机构管理 角色管理 用户管理 功能管理 权限管理
包含前端、后端、移动开发、操作系统、人工智能、物联网、信息化管理、数据库、硬件开发、大数据、课程资源、音视频、网站开发等各种技术项目的源码。包括STM32、ESP8266、PHP、QT、Linux、iOS、C++、Java、python、...
管理和运行 PostgreSQL docker 容器的 Ansible 角色。 有关使用 docker 镜像的。 角色变量 docker_postgres__name (默认值:postgres):此名称用于主文件夹路径的名称和容器的名称。 docker_postgres__image ...
实现功能:管理员管理、角色管理、部门管理,可操作本部门及子部门数据;菜单管理、定时任务、参数管理、字典管理、系统日志,没有数据权限;业务功能,按照用户数据权限,查询、操作数据【没有本部门数据权限,也能...
C#课设项目-基于ASP.NET开发的EasyCms后台权限管理系统源码+项目说明+sql数据库.zipC#课设项目-基于ASP.NET开发的EasyCms后台权限管理系统源码+项目说明+sql数据库.zipC#课设项目-基于ASP.NET开发的EasyCms后台权限...
用户管理:管理员工账户、角色和权限。 文档管理:存储、检索和共享办公文档。 任务管理:分配、跟踪和报告任务进度。 日程管理:安排会议、提醒和个人日程。 通讯协作:即时消息、邮件和视频会议。 技术栈 编程语言...
角色对应用程序授权(多个前台应用公用一个后台权限管理系统) 部门对用户授权 7. 提供字典表用于前台网站个性化配置 8. 完全响应式布局(支持电脑、平板、手机等所有主流设备) 9. 内置多数据源支持,配置简单...
任务分配: 实现将任务分配给特定用户的功能,可以通过角色进行权限管理。 状态跟踪: 任务的状态应包括待处理、进行中、已完成等,用户可以根据状态筛选任务。 报告生成: 实现生成任务完成报告的功能,报
## 权限管理 用户管理 角色管理 菜单管理 通用字典 登录日志 异常日志 Hangfire定时任务 单位组织 职位信息 代码生成辅助 ## CMS内容管理 栏目管理 文章管理 模板管理 模板匹配 静态页面生成(可以...
6. 权限控制与安全:系统对不同角色的用户设置不同的访问权限,确保患者信息的隐私和安全。 7. 通知提醒系统:系统向患者发送就诊提醒、用药提醒等重要通知。 8. 移动访问支持:系统支持移动端访问,方便医护人员...
8. 权限和角色管理:确保不同角色的用户(如患者、医生、管理员)访问相应功能的权限控制。 这个医疗报销系统的设计不仅提升了患者的报销体验,同时为医疗机构提供了一种高效、透明的报销管理解决方案。此外,系统...
6. 用户权限管理:根据用户等级或角色,系统可以授予不同的权限,如管理版块、审核帖子等。 7. 积分与徽章:系统可能包含积分系统和徽章系统,以奖励用户的活跃参与和贡献。 8. 私信通讯:用户可以通过私信功能与...
4、支持枚举用户、密码、哈希、权限、角色、数据库、数据表和列 5、支持自动识别密码哈希格式并通过字典破解密码哈希。 6、支持完全地下载某个数据库中的某个表、也可以只下载某个表中的某几列。 7、支持在数据库...
通用的权限管理模块,基于Apache Shiro的 用户-角色-权限(RBAC)的细粒度权限控制 大量配置示例,根据需求,自由优化、调整,达到最佳性能 大量前端模块化开发示例,积极在探索前端最佳的架构,与后台最佳的交互,...
支持枚举用户、密码、哈希、权限、角色、数据库、数据表和列。 支持自动识别密码哈希格式并通过字典破解密码哈希。 支持完全地下载某个数据库中的某个表,也可以只下载某个表中的某几列,甚至只下载某一列中的部分...
安装插件前言这个是本系统的前端 :功能模块运营管理用户:登录各模块数据管理用户角色和权限配置课程类型配置运营界面配置普通用户:登录,密码修改和重置(注册未实现,企业按照统一分配或其它方式,所以未实现)组织...
7. **用户访问控制**:根据不同用户角色设置访问权限,保护敏感数据。 8. **移动设备兼容**:优化移动端访问体验,适应各种屏幕尺寸。 技术栈通常涉及: - Python编程语言:作为主要的后端逻辑和数据处理语言。 - ...