热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

PostgreSQL最佳实践:用户权限管理

问题的起因:QQ群里有人提问怎么不让用户拥有建表权限?创建一个新用户后,用该用

作者:李晓光(黑哥)

昆明畅博科技有限公司

     问题的起因:QQ群里有人提问怎么不让用户拥有建表权限?创建一个新用户后,用该用户登录后可以创建表。

1 public权限解读

     用户默认情况下具有public权限,public默认具有创建和使用schema的权限,因此意味着可以在schema中创建对象(包括表)、列出schema中的对象,并在其权限允许时访问它们。

     所以创建数据库或schema完成后做的第一件事是

 1.1 创建数据库完成后

--回收schema的public权限

--revoke all on schema public from public; --正常情况使用这个

revoke all on schema public,tiger,tiger_data,topology from public; --使用postgis扩展使用这个

--从core数据库收回public的所有权限

    revoke all on database core from public;
    revoke all on database postgres from public;

    --重新将schema授予数据库所有者

    grant all on schema public,tiger,tiger_data,topology to 数据库所有者;

    1.2 创建schema完成后

      create schema history;
      revoke all on schema history from public;

      --重新将schema history授予数据库所有者

      grant all on schema history to 数据库所有者;

      2 测试

           假设现在有一数据库core.

      2.1 postgrese用户连接至core数据库

        psql -h localhost -p 5432 -U postgres -d core

        --创建一个名称sel的用户

          create user sel with nosuperuser nocreatedb nocreaterole noinherit login noreplication nobypassrls password '123';

          --允许连接至数据库core

            grant connect on database core to sel;

            --查看角色使用\duS+

              \duS+

              --或

                \duS+ sel

                --查看用户在schema的权限

                  \dp

                  --查看数据库的用户

                    \l+



                    **权限解释:**

                    r -- SELECT ("读")
                    w -- UPDATE ("写")
                    a -- INSERT ("追加")
                    d -- DELETE
                    D -- TRUNCATE
                    x -- REFERENCES
                    t -- TRIGGER
                    X -- EXECUTE
                    U -- USAGE
                    C -- CREATE
                    c -- CONNECT
                    T -- TEMPORARY
                    arwdDxt -- ALL PRIVILEGES (对于表,对其他对象会变化)

                    * -- 用于前述特权的授权选项

                    2.2 在另一个进程中运行

                      psql -h localhost -p 5432 -U sel -d core


                      drop table aaa;
                      create table aaa(
                      objectid integer
                      );
                      select * from features;

                      上面的sql报

                        ERROR: table "aaa" does not exist
                        ERROR: no schema has been selected to create in
                        ERROR: relation "features" does not exist

                        2.3 用postgrese用户登录core数据库为sel用户授权

                          psql -h localhost -p 5432 -U postgres -d core

                               您需要什么权限就授予什么权限,这里授予sel用户可以select public schema下的所有对象。

                            grant usage on schema public to sel;
                            grant select on all tables in schema public to sel;

                            2.4 再次转到在另一个进程中运行

                              psql -h localhost -p 5432 -U sel -d core


                              select * from features;
                              delete from features;

                                   现在已经可以正常查询数据了,但是此用户只有查询权限。

                              3 删除用户

                              3.1 使用postgrese用户连接至core数据库

                                   注意你授予用户什么权限必须在drop用户前先revoke,然后再删除,否则报依赖错。所以授权文件保存好以便将来删除用户,不然查询关联性非常麻烦。

                                psql -h localhost -p 5432 -U postgres -d core

                                --回收分配的权限并删除用户

                                  revoke select on all tables in schema public from sel;
                                  revoke usage on schema public from sel;
                                  revoke connect on database core from sel;
                                  drop role sel;

                                       另外,删除角色通常不仅仅是快速DROP ROLE的问题。角色拥有的任何对象都必须首先删除或重新分配给其他所有者;删除已用于拥有对象的角色的最一般方法是(见中文手册21.4):

                                    REASSIGN OWNED BY doomed_role TO successor_role;
                                    DROP OWNED BY doomed_role;
                                    DROP ROLE doomed_role;


                                    I Love PG

                                    关于我们

                                    中国开源软件推进联盟PostgreSQL分会(简称:中国PG分会)于2017年成立,由国内多家PostgreSQL生态企业所共同发起,业务上接受工信部中国电子信息产业发展研究院指导。中国PG分会是一个非盈利行业协会组织。我们致力于在中国构建PostgreSQL产业生态,推动PostgreSQL产学研用发展。



                                    欢迎投稿

                                    做你的舞台,show出自己的才华 。

                                    投稿邮箱:partner@postgresqlchina.com

                                                                   

                                                                     ——愿能安放你不羁的灵魂


                                    技术文章精彩回顾




                                    PostgreSQL学习的九层宝塔
                                    PostgreSQL职业发展与学习攻略
                                    搞懂PostgreSQL数据库透明数据加密之加密算法介绍
                                    一文读懂PostgreSQL-12分区表
                                    一文搞懂PostgreSQL物化视图
                                    PostgreSQL源码学习之:RegularLock
                                    Postgresql源码学习之词法和语法分析
                                    2019,年度数据库舍 PostgreSQL 其谁?
                                    Postgres是最好的开源软件
                                    PostgreSQL是世界上最好的数据库
                                    从Oracle迁移到PostgreSQL的十大理由
                                    从“非主流”到“潮流”,开源早已值得拥有

                                    PG活动精彩回顾




                                    创建PG全球生态!PostgresConf.CN2019大会盛大召开
                                    首站起航!2019“让PG‘象’前行”上海站成功举行
                                    走进蓉城丨2019“让PG‘象’前行”成都站成功举行
                                    中国PG象牙塔计划发布,首批合作高校授牌仪式在天津举行
                                    群英论道聚北京,共话PostgreSQL
                                    相聚巴厘岛| PG Conf.Asia 2019  DAY0、DAY1简报
                                    相知巴厘岛| PG Conf.Asia 2019 DAY2简报
                                    独家|硅谷Postgres大会简报
                                    PostgreSQL线上沙龙第一期精彩回顾
                                    PostgreSQL线上沙龙第二期精彩回顾
                                    PostgreSQL线上沙龙第三期精彩回顾
                                    PostgreSQL线上沙龙第四期精彩回顾
                                    PostgreSQL线上沙龙第五期精彩回顾
                                    PostgreSQL线上沙龙第六期精彩回顾
                                    直播回顾 | Bruce Momjian:原生分布式将在PG 14版本发布

                                    PG培训认证精彩回顾




                                    中国首批PGCA认证考试圆满结束,203位考生成功获得认证!
                                    中国第二批PGCA认证考试圆满结束,115位考生喜获认证!
                                    重要通知:三方共建,中国PostgreSQL认证权威升级!
                                    近500人参与!首次PGCE中级、第三批次PGCA初级认证考试落幕!
                                    通知:PostgreSQL技术能力电子证书上线!
                                    2020年首批 | 中国PostgreSQL初级认证考试圆满结束



                                    推荐阅读
                                    • 使用Ubuntu中的Python获取浏览器历史记录原文: ... [详细]
                                    • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
                                    • XML介绍与使用的概述及标签规则
                                      本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
                                    • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
                                    • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
                                    • Oracle seg,V$TEMPSEG_USAGE与Oracle排序的关系及使用方法
                                      本文介绍了Oracle seg,V$TEMPSEG_USAGE与Oracle排序之间的关系,V$TEMPSEG_USAGE是V_$SORT_USAGE的同义词,通过查询dba_objects和dba_synonyms视图可以了解到它们的详细信息。同时,还探讨了V$TEMPSEG_USAGE的使用方法。 ... [详细]
                                    • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
                                    • VScode格式化文档换行或不换行的设置方法
                                      本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
                                    • 向QTextEdit拖放文件的方法及实现步骤
                                      本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
                                    • Java序列化对象传给PHP的方法及原理解析
                                      本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
                                    • 开发笔记:加密&json&StringIO模块&BytesIO模块
                                      篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
                                    • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
                                    • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
                                    • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
                                    • 本文介绍了如何使用python从列表中删除所有的零,并将结果以列表形式输出,同时提供了示例格式。 ... [详细]
                                    author-avatar
                                    ShiZha0_625
                                    这个家伙很懒,什么也没留下!
                                    PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
                                    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有