Postgresql 数据库权限功能的使用总结_PostgreSQL

来源:脚本之家  责任编辑:小易  

Postgresql数据库支持灵活的权限管理,可以控制一个角色(组、用户)对某张表的读、写、更新、删除等操作权限、执行某个函数的权限以及操作(使用、更新等)视图、序列的权限。

PG的权限管理功能比较强大,可以细化到对一张表的各个字段,比如禁止用户访问一张表里的密码字段等,在稍后的内容中给出详细的解释。

虽然在PG数据库中把用户、角色统一叫做角色,甚至创建语句都为create role XXX,但用户和角色之间仍有一定的区别。在这里我们统一把拥有登录权限的叫做用户,没有登录权限的叫做角色,用此方式加以区分。

实际上,在PgAdmin管理工具中,可以看到用户和角色的区别,没有登录权限的被放在组角色下,有登录权限的被放在登录角色下。

基本权限

用户和角色都可以被赋予基本权限,比如创建数据库权限、超级用户权限、创建角色权限等。

比如创建用户的语句为:

CREATE ROLE guest LOGIN
 NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;

注意上述Role guest拥有LOGIN的权限,所以叫它用户。

创建角色的语句为:

CREATE ROLE "group"
 NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;

注意这里没有LOGIN权限,所以是角色。

上述角色和用户的创建语句中,都没有赋予超级用户、创建数据库等权限。

操作数据库对象权限

只能把数据库对象的操作权限赋予没有登录权限的角色,而不能直接赋予拥有登录权限的用户。

那么这样就带来一个问题,怎么样控制登录用户操作数据库对象的权限呢?

答案是让用户成为角色的成员,此时用户即可拥有角色的权限,进一步限制了登录用户操作数据库对象的权限。

如把上述角色group赋予guest用户:

GRANT "group" TO guest;

之后,guest用户就拥有了group角色所拥有的数据库对象权限。

比如控制group角色只能对class表执行Insert操作:

GRANT INSERT ON TABLE class TO "group";

此时使用guest用户登录数据后,就只能对表class执行insert操作,无法执行delete、update等操作。

示例代码如下,使用guest用户登录,访问TEST数据库下的class表。

Server [localhost]:
Database [postgres]:
Port [5433]:
Username [postgres]: guest
用户 guest 的口令:
psql (9.4.5)
输入 "help" 来获取帮助信息.
postgres=> \c TEST
您现在已经连线到数据库 "TEST",用户 "guest".
TEST=> select * from class;
ERROR: permission denied for relation class
TEST=> insert into class values(2,'class1');
INSERT 0 1

从上述结果中可以看到,guest用户没有权限查询class表,但是可以插入数据库。原因就是只对group角色赋予了class表的insert权限,然后guest用户也就只有class表的insert权限。

前面说到PG的权限管理可以细化到表的某个字段,现在继续用class表和guest用户做实验。

TEST=> \c postgres postgres;
您现在已经连线到数据库 "postgres",用户 "postgres".
postgres=# \c TEST;
您现在已经连线到数据库 "TEST",用户 "postgres".
TEST=# grant select(num) on class to "group";
GRANT
TEST=# \echo 切换到postgres用户连接TEST数据库,对class表的num字段的select权限赋予group角色
切换到postgres用户连接TEST数据库,对class表的num字段的select权限赋予group角色
TEST=# \c TEST guest
用户 guest 的口令:
您现在已经连线到数据库 "TEST",用户 "guest".
TEST=> \echo 切换回guest用户登录TEST数据库
切换回guest用户登录TEST数据库
TEST=> select * from class;
ERROR: permission denied for relation class
TEST=> select num from class;
 num
-----
  1
  2
(2 行记录)

从上述结果中可以看到,guest用户依然没有查询class表的权限,但是却有了查询class表里的num字段的权限。

在PG数据库中不单单可以控制操作表的权限,其他数据库对象,比如序列、函数、视图等都可以控制。

所以PG的权限控制功能非常强大。

补充:Postgres用户对数据库的权限

用户对数据库的权限(登录、超级用户权限)

(1)查看当前数据库中有用户highgo和用户a

highgo=#\du
               List of roles
 Role name |          Attributes          | Member of
-----------+------------------------------------------------+-----------
 a     |                        | {}
 highgo  | Superuser, Create role, Create DB, Replication | {}

(2)查看确认当前连接的用户为超级用户highgo,且该用户后创建角色和数据库的权限等

highgo=#select current_user;
 current_user
--------------
 highgo
(1row)

(3)查看当前集群中的数据库

highgo=#\l
               List of databases
  Name  | Owner | Encoding | Collate |  Ctype  | Access privileges
-----------+--------+----------+------------+------------+-------------------
 highgo  | highgo | UTF8   | zh_CN.utf8 |zh_CN.utf8 |
 template0 | highgo | UTF8   | zh_CN.utf8 | zh_CN.utf8 | =c/highgo    +
      |    |     |      |      | highgo=CTc/highgo
 template1 | highgo | UTF8   | zh_CN.utf8 | zh_CN.utf8 | =c/highgo    +
      |    |     |      |      | highgo=CTc/highgo
(3rows)

(4)使用普通用户a连接数据库正常

highgo=#\c highgo a
Youare now connected to database "highgo" as user "a".
highgo=>select current_user;
 current_user
--------------
 a
(1row)
(5)使用超级用户highgo连接数据库正常
highgo=>\c highgo highgo
Youare now connected to database "highgo" as user "highgo".
highgo=#select current_user;
 current_user
--------------
 highgo
(1row)

(6)在超级用户连接highgo后,设置不允许普通用户a连接数据库

highgo=#alter role a nologin;
ALTER ROLE
highgo=#\c highgo a
致命错误: 不允许角色"a" 进行登录
Previousconnection kept
highgo=#

(7)在超级用户连接highgo后,设置不允许普通用户a连接数据库后,赋予用户a超级用户权限后仍然无法连接数据库

highgo=#alter role a superuser;
ALTERROLE
highgo=#\du
               List of roles
 Role name |          Attributes          | Member of
-----------+------------------------------------------------+-----------
 a    | Superuser, Cannot login            | {}
 highgo  | Superuser, Create role, Create DB, Replication | {}
 
highgo=#\c highgo a
致命错误: 不允许角色"a" 进行登录
Previousconnection kept

(8)将登录数据库的权限赋予用户a后,用户a可登录数据库

highgo=#alter role a login;
ALTERROLE
highgo=#\c highgo a
Youare now connected to database "highgo" as user "a".
highgo=#select current_user;
 current_user
--------------
 a
(1row)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持真格学网。如有错误或未考虑完全的地方,望不吝赐教。

您可能感兴趣的文章:基于PostgreSQL 权限解读PostgreSQL 默认权限查看方式Postgresql 赋予用户权限和撤销权限的实例查看postgresql数据库用户系统权限、对象权限的方法PostgreSQL教程(十二):角色和权限管理介绍用一整天的时间安装postgreSQL NTFS权限

  • 本文相关:
  • postgresql 修改列类型操作
  • postgresql查询自动将大写的名称转换为小写的案例
  • 浅谈postgresql 11 新特性之默认分区
  • postgresql入门简介
  • postgresql中enable、disable和validate外键约束的实例
  • postgresql 安装和简单使用
  • 用一整天的时间安装postgresql ntfs权限
  • 修改postgresql存储目录的操作方式
  • postgresql 实现distinct关键字给单独的几列去重
  • postgresql创建新增、删除与修改触发器的方法
  • postgreSQL数据库public权限拿shell
  • 如何使用postgresql数据库
  • postgreSQL数据库有什么用啊?
  • PostgreSQL从菜鸟到专家 什么是PostgreSQL数据库
  • 如何查看postgresql数据库用户
  • postgresql如何让用户看到自己的数据库
  • 如何配置PostgreSQL允许被远程访问
  • postgresql数据库怎么才能删除大量数据?
  • 如何设置PostgreSQL允许被远程访问
  • 若要玩转大数据,在什么应用场景使用Hadoop,Postg...
  • 网站首页网页制作脚本下载服务器操作系统网站运营平面设计媒体动画电脑基础硬件教程网络安全mssqlmysqlmariadboracledb2mssql2008mssql2005sqlitepostgresqlmongodbredisaccess数据库文摘数据库其它首页基于postgresql 权限解读postgresql 默认权限查看方式postgresql 赋予用户权限和撤销权限的实例查看postgresql数据库用户系统权限、对象权限的方法postgresql教程(十二):角色和权限管理介绍用一整天的时间安装postgresql ntfs权限postgresql 修改列类型操作postgresql查询自动将大写的名称转换为小写的案例浅谈postgresql 11 新特性之默认分区postgresql入门简介postgresql中enable、disable和validate外键约束的实例postgresql 安装和简单使用用一整天的时间安装postgresql ntfs权限修改postgresql存储目录的操作方式postgresql 实现distinct关键字给单独的几列去重postgresql创建新增、删除与修改触发器的方法postgresql 角色与用户管理介绍windows下postgresql数据库的下载windows下postgresql安装图解postgresql中的oid和xid 说明15个postgresql数据库实用命令分postgresql alter语句常用操作小windows postgresql 安装图文教程postgresql 安装和简单使用postgresql 创建表分区postgresql新手入门教程postgresql教程(十一):服务器配置postgresql查询结果添加一个额外的自增序postgresql 的hash_code函数的用法说明postgresql 中的加密扩展插件pgcrypto用法如何获取postgresql数据库中的json值在postgresql中运行sql脚本和pg_restore命postgresql实现批量插入、更新与合并操作springboot连接使用postgresql数据库的方postgresql中like和ilike操作符的用法详解postgresql 序列绑定字段与不绑定字段的区
    免责声明 - 关于我们 - 联系我们 - 广告联系 - 友情链接 - 帮助中心 - 频道导航
    Copyright © 2017 www.zgxue.com All Rights Reserved