zoukankan      html  css  js  c++  java
  • 浅谈PostgreSQL用户权限

    问题

      经常在PG群里看到有人在问“为什么我对表赋予了权限;但是还是不能访问表”

    解析

      若你看懂德哥这篇文章PostgreSQL逻辑结构和权限体系介绍上面对你就不是困扰你的问题

      解决这个问题很简单;在解决之前;我们要先了解PostgreSQL的逻辑结构、以及与用户之间的关系盗用德哥的图;来诠释下逻辑结构;PostgreSQL逻辑结构有4层:实例->数据库->schema->数据库对象

     

      可以看出用户不在PostgreSQL里面;是独立之外的object;这个跟Oracle逻辑结构不一致。它不属于某个数据库、或者某个schema。

      若用户不是数据库属主的用户;要访问table1;该怎么办?有三步。这个类似走后门类似

    • 首先你把数据库connect的权限赋予用户(国家允许
    • 再则你需要把table1所在的schema的使用权限赋予用户(省政府允许
    • 最后你需要把table的select的权限赋予

    讨论

      现实验环境

    • 用户:lottu1、lottu2。
    • 数据库:db1
    • schema:lottu1
    • 表:tbl_lottu_01
    # 创建用户lottu1
    postgres=# create user lottu1;
    CREATE ROLE
    # 创建用户lottu2
    postgres=# create user lottu2;
    CREATE ROLE
    # 创建数据库db1;属于lottu1
    postgres=# create database db1 owner  lottu1;
    CREATE DATABASE
    # 创建schema、table、并插入记录
    postgres=# c db1 lottu1;
    You are now connected to database "db1" as user "lottu1".
    db1=> create schema lottu1;
    CREATE SCHEMA
    db1=> create table tbl_lottu_01(id int, info text, reg_time timestamp);
    CREATE TABLE
    db1=> insert into tbl_lottu_01 select 1,'lottu',now();
    INSERT 0 1

      新建的数据库对所有的用户都有连接权限;且数据库下public-schema对所有用户都可以使用;不管是不是超级用户、属主用户

    db1=> c db1 lottu2
    You are now connected to database "db1" as user "lottu2".

      针对这种情况;这样是不是很不安全;非主用户为啥可以连数据库;非主用户为啥不及可以连数据库;还可以在对应的public-schema下可以创建object。要实现隔离;我们可以回收数据库权限;只有超级用户、属主用户可以连。

    db1=> c db1 postgres
    You are now connected to database "db1" as user "postgres".
    db1=# revoke CONNECT ON DATABASE db1 from public;
    REVOKE
    db1=# c db1 postgres
    You are now connected to database "db1" as user "postgres".
    db1=# c db1 lottu1;
    You are now connected to database "db1" as user "lottu1".
    db1=> c db1 lottu2;
    FATAL:  permission denied for database "db1"
    DETAIL:  User does not have CONNECT privilege.
    Previous connection kept

      现在实现用户lottu2不能连接数据库db1。现在需求tbl_lottu_01给db2查询。而表tbl_lottu_01属于数据库db1下面schema-lottu1的。

    db1=> grant CONNECT ON DATABASE db1 to lottu2;
    GRANT
    db1=> grant USAGE ON SCHEMA lottu1 to lottu2;
    GRANT
    db1=> grant select on TABLE tbl_lottu_01 to lottu2;
    GRANT
    db1=> c db1 lottu2;
    You are now connected to database "db1" as user "lottu2".
    db1=> select * from lottu1.tbl_lottu_01;
     id | info  |          reg_time          
    ----+-------+----------------------------
      1 | lottu | 2020-05-19 10:50:15.206569
    (1 row)

      经过一层层的赋权;用户lottu2可以select表tbl_lottu_01。若需求将schema-lottu1下所有的表都赋于给lottu2。将上面的修改下即可

    grant select on ALL TABLES IN SCHEMA lottu1 to lottu2;
  • 相关阅读:
    读书笔记之理想设计的特征
    一些javascript 变量声明的 疑惑
    LINQ 使用方法
    Google MySQL tool releases
    读书笔记之设计的层次
    EF之数据库连接问题The specified named connection is either not found in the configuration, not intended to be used with the Ent
    转载 什么是闭包
    javascript面向对象起步
    Tips
    数据结构在游戏中的应用
  • 原文地址:https://www.cnblogs.com/lottu/p/12916046.html
Copyright © 2011-2022 走看看