postgresql|数据库|角色(用户)管理工作---授权和去权以及usage和select两种权限的区别

news2024/11/17 3:47:10

前言:

postgresql做为一个比较复杂的关系型的重型数据库,不管是安装部署,还是后期的运行维护,都还是有比较多的细节问题需要引起关注。

例如,用户权限的合理分配,那么,什么是权限的合理分配呢? 自然是权限的最小化原则,也就是说每个用户能够完成其权限范围内的工作,而不会由于黑客攻击,漏洞等原因造成安全方面的危险。

在写这篇文章之前,仅仅是对于一些普通用户简单的随便赋权就完事了,而这样的管理工作显然是不够的,因此,本文将对postgresql数据库内的用户赋权和去权做一个相对完整的总结,并通过示例说明 usage权限和select权限的不同。

一,

用户的权限有哪些?

SELECT:该权限用来查询表或是表上的某些列,或是视图,序列。
INSERT:该权限允许对表或是视图进行插入数据操作,也可以使用COPY FROM进行数据的插入。
UPDATE:该权限允许对表或是或是表上特定的列或是视图进行更新操作。
DELETE:该权限允许对表或是视图进行删除数据的操作。
TRUNCATE:允许对表进行清空操作。
REFERENCES:允许给参照列和被参照列上创建外键约束。
TRIGGER:允许在表上创建触发器。
CREATE:对于数据库,允许在数据库上创建Schema;对于Schema,允许对Schema上创建数据库对象;对于表空间,允许把表或是索引指定到对应的表空间上。
CONNECT:允许用户连接到指定的数据库上。
TEMPORARY或是TEMP:允许在指定数据库的时候创建临时表。
EXECUTE:允许执行某个函数。
USAGE:对于程序语言来说,允许使用指定的程序语言创建函数;对于Schema来说,允许查找该Schema下的对象(不包括授权后的新建对象);对于序列来说,允许使用currval和nextval函数;对于外部封装器来说,允许使用外部封装器来创建外部服务器;对于外部服务器来说,允许创建外部表。
ALL PRIVILEGES:表示一次性给予可以授予的权限。

OK,增删改查也就是select ,update,insert,delete  和usage应该是可以归于一类的,而select和usage是十分相似的,至少在schema下,两者是基本雷同的,但需要注意的是,授权后的新建对象,比如新建表,usage是无权查询的,而select显然是不存在此类问题的。

二,

正确的只读用户赋权

1,

第一种赋权

usage---使用权+select查询权

先创建相关schema,名为mytest,相关role,名为test

test=# \c test
You are now connected to database "test" as user "postgres".
test=# create schema mytest;
CREATE SCHEMA
test=# \du
                                        List of roles
     Role name      |                         Attributes                         | Member of 
--------------------+------------------------------------------------------------+-----------
 drmc               |                                                            | {}
 pg1                | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 pms30              | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
 postgres           | Superuser                                                  | {}
 postgres_exporter  |                                                            | {}
 postgres_exporter1 |                                                            | {}
 power_common       |                                                            | {}
 power_tf           |                                                            | {}
 zsk                |                                                            | {}
test=# create user test with password '123456';
CREATE ROLE

赋权:

test=# grant USAGE on SCHEMA mytest to test;
GRANT
test1=> grant SELECT on ALL tables in schema mytest to test;

测试就不演示了,只是需要注意一点,要赋权两个,usage和select,两者缺一不可,也就是说必须是两个命令!!!!!

OK,以上是用户test赋权select到test数据库下的mytest这个schema,下面为了继续测试,删除test这个用户。

2,

强制删除已赋权过的用户

OK,删除的时候报错了,这就让人比较无语了,报错说的是名为test的数据库有5个对象依赖于用户test,不过还是有解决办法的

postgres=# drop user test;
2023-08-09 01:15:34.031 CST [14975] ERROR:  role "test" cannot be dropped because some objects depend on it
2023-08-09 01:15:34.031 CST [14975] DETAIL:  5 objects in database test
2023-08-09 01:15:34.031 CST [14975] STATEMENT:  drop user test;
ERROR:  role "test" cannot be dropped because some objects depend on it
DETAIL:  5 objects in database test

强制删除:

需要reassign和drop owner by以及drop user  三条命令,缺一不可。

postgres=# \c test
You are now connected to database "test" as user "postgres".
test=# \dn
List of schemas
  Name  | Owner 
--------+-------
 mytest | test
 public | pg1
(2 rows)

test=# REASSIGN OWNED BY test TO postgres;
REASSIGN OWNED
test=# \dn
  List of schemas
  Name  |  Owner   
--------+----------
 mytest | postgres
 public | pg1
(2 rows)
test=# drop owned BY test cascade;
NOTICE:  drop cascades to 4 other objects
DETAIL:  drop cascades to table mytest.dept
drop cascades to table mytest.emp
drop cascades to table mytest.bonus
drop cascades to table mytest.salgrade
DROP OWNED

OK,查询test这个用户是否删除:

可以看到,确实没有了,有强迫症的人士就非常舒服了。

但特别需要注意,该强制删除用户因为是级联删除,因此,很大概率会把依赖的schema和table都删除,所以此方式强制删除用户需要提前备份,防止发生不测

test1=# \du+
                                               List of roles
     Role name      |                         Attributes                         | Member of | Description 
--------------------+------------------------------------------------------------+-----------+-------------
 drmc               |                                                            | {}        | 
 pg1                | Superuser, Create role, Create DB, Replication, Bypass RLS | {}        | 
 pms30              | Superuser, Create role, Create DB, Replication, Bypass RLS | {}        | 
 postgres           | Superuser                                                  | {}        | 
 postgres_exporter  |                                                            | {}        | 
 postgres_exporter1 |                                                            | {}        | 
 power_common       |                                                            | {}        | 
 power_tf           |                                                            | {}        | 
 zsk                |                                                            | {}        | 

3,

第二种赋权

grant select+ owner

test=# create user test with password '123456';
CREATE ROLE
test=# \c
You are now connected to database "test" as user "postgres".
test=# grant SELECT on ALL tables in schema mytest to test;
GRANT
test=# set search_path to mytest ;
SET
test=# alter schema mytest owner to test;
ALTER SCHEMA

测试:

test=> \c
You are now connected to database "test" as user "test".

test=> set search_path to mytest ;
SET
test=> \dp
                                  Access privileges
 Schema |   Name   | Type  |     Access privileges     | Column privileges | Policies 
--------+----------+-------+---------------------------+-------------------+----------
 mytest | bonus    | table | postgres=arwdDxt/postgres+|                   | 
        |          |       | test=r/postgres           |                   | 
 mytest | dept     | table | postgres=arwdDxt/postgres+|                   | 
        |          |       | test=r/postgres           |                   | 
 mytest | emp      | table | postgres=arwdDxt/postgres+|                   | 
        |          |       | test=r/postgres           |                   | 
 mytest | salgrade | table | postgres=arwdDxt/postgres+|                   | 
        |          |       | test=r/postgres           |                   | 
(4 rows)

test=> \dn
List of schemas
  Name  | Owner 
--------+-------
 mytest | test
 public | pg1
(2 rows)

test=> set search_path to mytest ;
SET
test=> select * from emp;
 empno | ename  |    job    | mgr  |  hiredate  |   sal   |  comm   | deptno 
-------+--------+-----------+------+------------+---------+---------+--------
  7369 | SMITH  | CLERK     | 7902 | 1980-12-17 |  800.00 |         |     20
  7499 | ALLEN  | SALESMAN  | 7698 | 1981-02-20 | 1600.00 |  300.00 |     30
  7521 | WARD   | SALESMAN  | 7698 | 1981-02-22 | 1250.00 |  500.00 |     30
  7566 | JONES  | MANAGER   | 7839 | 1981-04-02 | 2975.00 |         |     20
  7654 | MARTIN | SALESMAN  | 7698 | 1981-09-28 | 1250.00 | 1400.00 |     30
  7698 | BLAKE  | MANAGER   | 7839 | 1981-05-01 | 2850.00 |         |     30
  7782 | CLARK  | MANAGER   | 7839 | 1981-06-09 | 2450.00 |         |     10
  7788 | SCOTT  | ANALYST   | 7566 | 0087-04-19 | 3000.00 |         |     20
  7839 | KING   | PRESIDENT |      | 1981-11-17 | 5000.00 |         |     10
  7844 | TURNER | SALESMAN  | 7698 | 1981-09-08 | 1500.00 |    0.00 |     30
  7876 | ADAMS  | CLERK     | 7788 | 0087-05-23 | 1100.00 |         |     20
  7900 | JAMES  | CLERK     | 7698 | 1981-12-03 |  950.00 |         |     30
  7902 | FORD   | ANALYST   | 7566 | 1981-12-03 | 3000.00 |         |     20
  7934 | MILLER | CLERK     | 7782 | 1982-01-23 | 1300.00 |         |     10
(14 rows)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/853099.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用js开发交互式地图应用

引言: 如今,地图应用已经成为我们日常生活中重要的一部分。无论是寻找路线、查看附近的商店还是探索未知的地区,地图应用都帮助我们轻松实现这些需求。在本文中,我们将学习使用js开发一个交互式地图应用,并加入代码示例…

小红书种草笔记怎么写标题更吸引人?

小红书作为我国领先的社交电商平台,种草笔记更是以其独特的形式和内容吸引了大量用户。如何写好一篇种草笔记的标题,成为了许多小红书用户关注的焦点。如何在小红书上写出一篇高质量的种草笔记,吸引万千粉丝关注?本文伯乐网络传媒…

nginx部署本地umi build项目

一、安装 brew install nginxBrew 安装可以参考网上教程 https://juejin.cn/post/6986190222241464350 安装后启动nginx服务查看是否成功 brew services start nginx启动报错 Error: undefined method launchd_service_path‘ for xxx 解决:更新brew brew updat…

基于vue-admin-template的动态路由的问题解决

基于vue-admin-template的动态路由的问题解决 1.问题一:页面无法显示 控制台报如下错误: 首先经过一番网上搜索,有说是webpack的原因,调试后发现不是,然后再排查后台返回的组件地址。 由于我的前端拼接组件地址的代…

使用威胁情报源可为大家提供更好的DDoS防护

DDoS(分布式拒绝服务)攻击已成为各种企业(小到区域性小公司大到各种跨国公司)的主要威胁,DDoS 攻击可能会对企业造成重大损害和破坏,比如对目标公司的声誉产生不利影响并导致收入损失。这也是为什么现在许多…

c++map和set剖析

文章参考文献:cplusplus 博主:拖拉机厂第一代码手 gitee:拖拉机厂第一代码手 c专栏:C 目录 🧙🏼‍♂set剖析🧚🏼set简介🧚🏼set模板参数列表🧚🏼s…

大模型中常用的分词器Tokenizer学习总结记录与代码实现

最近大模型领域内如火如荼,很多企业、个人组织都陆续进入这个领域,笔者最近也是在接触大模型相关的技术领域,本文的主要目的就是想记录总结汇总大模型常用到的分词器算法,总结记录,学习备忘!由于博主本身知…

巨人互动|Google海外户Google Analytics的优缺点是什么?

Google Analytics是一个由谷歌开发的网站分析工具,旨在帮助网站和移动应用程序运营者收集和分析数据,以更好地了解用户行为和改进业务。虽然Google Analytics具有许多优势,但也存在一些缺点。在本文中,我们将探讨Google Analytics…

cuda安装

1.cuda 11.8网址 CUDA Toolkit 11.8 Downloads | NVIDIA Developer 2.安装 sh cuda_11.8.0_520.61.05_linux.run 直接accept 移动上下到driver上,再enter一下取消driver的更新 更新一下.bashrc,cp -r ~/.bashrc xxx export PATH/usr/local/cuda-11.…

慢慢来,这次一定能搞懂Promise

1.Promise到底是个什么东西? 让我们使用万能console打印一下它的内容。 根据控制控制台的输出可见Promise 是一个构造函数,本身身上有 all、reject、resolve 这几个方法,原型(prototype)上有 then、catch 等方法。 根…

JVM源码剖析之Java命令行参数全解

最近,有一位网友询问关于Java命令行参数方面的问题,因为在Java中参数有很多种,有不少的读者一直没弄明白,所以特意写下此篇文章。 此篇文章分2大块,第一块是不同参数的解释,第2块就是JVM源码论证&#xff…

理解 Python 的 for 循环

前言 嗨喽,大家好呀~这里是爱看美女的茜茜呐 在本篇博客中,我们将讨论 Python 中 for 循环的原理。 我们将从一组基本例子和它的语法开始,还将讨论与 for 循环关联的 else 代码块的用处。 然后我们将介绍迭代对象、迭代器和迭代器协议&…

低代码平台——减少开发bug,解放程序员

目录 一、前言 二、低代码提供了哪些功能 三、低代码对程序员的好处 四、小结 一、前言 在计算机语言的世界里,一直存在着一个千奇百怪的生物——bug。bug产生的本质是因为写代码,于是一种真理就诞生了。真理如下:只要写代码,就会…

【多维定向滤波器组和表面波】表面变换:用于高效表示多维 s 的多分辨率变换(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

信创麒麟操作系统卸载docker,并分别用在线、yum、rpm三种方式安装信创的docker

备注:操作前建议对机器打快照备份,或者备份好数据,如未使用,第一次部署的情况可直接操作 一、卸载DataEase自带的docker # 停止服务 service dataease stop# 删除 docker 可执行文件 rm -f /usr/bin/containerd-shim-runc-v2 r…

快速解决IDEA中类的图标变成J,不是C的情况

有时候导入新的项目后,会出现如下情况,类的图标变成J,如图: 直接上解决方法: 找到项目的pom.xml,右键,在靠近最下方的位置找到Add as Maven Project,点击即可。 此时,一般类的图标就…

【springboot项目】在idea中启动报错合集

一、IDEA中报错 “Error running ‘Application‘: Command line is too long.“ 的解决办法 报错详情: Error running Application: Command line is too long.Shorten command line for Application or also for Spring Boot default configuration.报错原因&am…

校对软件助力公安公检:提高调查报告质量

校对软件可以为公安公检机关提供有力支持,帮助提高调查报告的质量。以下是校对软件在这方面的助力: 1.拼写和语法检查:校对软件可以自动检查调查报告中的拼写错误和语法问题。这可以避免由于疏忽或拼写错误而导致的报告不准确或难以理解的情况…

TENNECO EDI 项目——X12与XML之间的转换

近期为了帮助广大用户更好地使用 EDI 系统,我们根据以往的项目实施经验,将成熟的 EDI 项目进行开源。用户安装好知行之桥EDI系统之后,只需要下载我们整理好的示例代码,并放置在知行之桥指定的工作区中,即可开始使用。 …

java Spring Boot yml多环境配置

我们项目 线上和线下 环境配置不是特别一样 例如 运行的URL 数据库地址 数据库的账号密码 这些经常是不一样的 如果每次上线钱改 也不是特别方便 甚至可能忘记 那么 进入我们代码中 所谓的多环境 就是在不同的环境下配置不同的值 终端还是在application配置文件中 多环境的话…