PostgreSQL權限管理之建立可更新表的普通用戶

1、環境

$ psql -U postgres
psql (9.4.4)
Type "help" for help.
postgres=# select version();
                                                    version                                                    
---------------------------------------------------------------------------------------------------------------
 PostgreSQL 9.4.4 on x86_64-unknown-linux-gnu, compiled by gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-11), 64-bit
(1 row)
postgres=# \dt
No relations found.
postgres=# revoke select on all tables in schema public from public;
REVOKE

咱們都知道,超級用戶的權限太大了,爲了數據庫的安全,對於非管理員帳號,須要建立普通用戶。刪除public下全部非超戶的select權限。linux


2、語法

$ psql -U postgres
psql (9.4.4)
Type "help" for help.

postgres=# \h create role 
Command:     CREATE ROLE
Description: define a new database role
Syntax:
CREATE ROLE name [ [ WITH ] option [ ... ] ]

where option can be:

      SUPERUSER | NOSUPERUSER
    | CREATEDB | NOCREATEDB
    | CREATEROLE | NOCREATEROLE
    | CREATEUSER | NOCREATEUSER
    | INHERIT | NOINHERIT
    | LOGIN | NOLOGIN
    | REPLICATION | NOREPLICATION
    | CONNECTION LIMIT connlimit
    | [ ENCRYPTED | UNENCRYPTED ] PASSWORD 'password'
    | VALID UNTIL 'timestamp'
    | IN ROLE role_name [, ...]
    | IN GROUP role_name [, ...]
    | ROLE role_name [, ...]
    | ADMIN role_name [, ...]
    | USER role_name [, ...]
    | SYSID uid


3、建立只讀用戶

1. 先建立表t1
postgres=# create table t1 ( id serial, name varchar(64) );
CREATE TABLE
postgres=# \dt
        List of relations
 Schema | Name | Type  |  Owner   
--------+------+-------+----------
 public | t1   | table | postgres
(1 row)
2. 建立用戶u1
postgres=# create role u1 with login password '123456';
CREATE ROLE

login是賦予登陸權限,不然是不能登陸的sql

3. 賦予u1對錶的只讀權限

由於建立的普通用戶默認是沒有任何權限的數據庫

postgres=# \c - u1
You are now connected to database "postgres" as user "u1".
postgres=> select * from t1;
ERROR:  permission denied for relation t1
postgres=> \c - postgres
You are now connected to database "postgres" as user "postgres".
postgres=# grant select on all tables in schema public to u1;
GRANT
postgres=# \c - u1
You are now connected to database "postgres" as user "u1".
postgres=> select * from t1;
 id | name 
----+------
(0 rows)
4. 建立表t2
postgres=> \c - postgres
You are now connected to database "postgres" as user "postgres".
postgres=# create table t2 ( id serial, name varchar(64) );
CREATE TABLE
postgres=# \dt
        List of relations
 Schema | Name | Type  |  Owner   
--------+------+-------+----------
 public | t1   | table | postgres
 public | t2   | table | postgres
(2 rows)
5. 驗證u1的權限
postgres=# \c - u1
You are now connected to database "postgres" as user "u1".
postgres=> select * from t1;
 id | name 
----+------
(0 rows)

postgres=> select * from t2;
ERROR:  permission denied for relation t2

可見u1是有t1表的讀權限,但沒有t2表的讀權限,這樣是否是意味着每次新建表就要賦一次權限?安全

6. 解決辦法
postgres=> \c - postgres
You are now connected to database "postgres" as user "postgres".
postgres=# alter default privileges in schema public grant select on tables to u1;
ALTER DEFAULT PRIVILEGES
postgres=# create table t3 ( id serial, name varchar(64) );
CREATE TABLE
postgres=# \dt
        List of relations
 Schema | Name | Type  |  Owner   
--------+------+-------+----------
 public | t1   | table | postgres
 public | t2   | table | postgres
 public | t3   | table | postgres
(3 rows)

postgres=# \c - u1
You are now connected to database "postgres" as user "u1".
postgres=> select * from t3;
 id | name 
----+------
(0 rows)
postgres=> select * from t2;
ERROR:  permission denied for relation t2
postgres=> \c - postgres
You are now connected to database "postgres" as user "postgres".
postgres=# grant select on all tables in schema public to u1;
GRANT
postgres=# \c - u1
You are now connected to database "postgres" as user "u1".
postgres=> select * from t2;
 id | name 
----+------
(0 rows)

grant是賦予用戶schema下當前表的權限,alter default privileges是賦予用戶schema下表的默認權限,這樣之後新建表就不用再賦權限了。當咱們建立只讀帳號的時候,須要執行grant和alter default privileges。post

4、建立可更新用戶

1. 建立u2用戶
postgres=# create role u2 with login password '123456';
CREATE ROLE
2. 賦予更新權限
postgres=# alter default privileges in schema public grant select,insert,update,delete on tables to u2;
ALTER DEFAULT PRIVILEGES
3. 建立表t4
postgres=# create table t4 ( id serial, name varchar(64) );
CREATE TABLE
postgres=# \dt
        List of relations
 Schema | Name | Type  |  Owner   
--------+------+-------+----------
 public | t1   | table | postgres
 public | t2   | table | postgres
 public | t3   | table | postgres
 public | t4   | table | postgres
(4 rows)
4. 查看權限
postgres=# \c - u2
You are now connected to database "postgres" as user "u2".
postgres=> insert into t4 values ( 1, 'aa' );
INSERT 0 1
postgres=> select * from t4;
 id | name 
----+------
  1 | aa
(1 row)

postgres=> update t4 set name = 'bb' where id = 1;
UPDATE 1
postgres=> select * from t4;
 id | name 
----+------
  1 | bb
(1 row)

postgres=> delete from t4 where id = 1;
DELETE 1
postgres=> select * from t4;
 id | name 
----+------
(0 rows)

能夠正常增刪改查ui

5. 序列的權限與解決辦法

在insert的時候,指定列插入,主鍵id是serial類型會默認走sequence的下一個值,但前面只賦予了表的權限,因此會出現下面的問題:spa

postgres=> insert into t4 ( name ) values ( 'aa' );
ERROR:  permission denied for sequence t4_id_seq

解決方法就是再賦一次sequence的值就好了code

postgres=> \c - postgres
You are now connected to database "postgres" as user "postgres".
postgres=# alter default privileges in schema public grant usage on sequences to u2;
ALTER DEFAULT PRIVILEGES
postgres=# create table t5 ( id serial, name varchar(64) );
CREATE TABLE
postgres=# \c - u2
You are now connected to database "postgres" as user "u2".
postgres=> insert into t5 ( name ) values ( 'cc' );
INSERT 0 1
postgres=> select * from t5;
 id | name 
----+------
  1 | cc
(1 row)

5、刪除用戶

postgres=> \c - postgres
You are now connected to database "postgres" as user "postgres".
postgres=# drop role u2;
ERROR:  role "u2" cannot be dropped because some objects depend on it
DETAIL:  privileges for table t5
privileges for sequence t5_id_seq
privileges for default privileges on new sequences belonging to role postgres in schema public
privileges for table t4
privileges for default privileges on new relations belonging to role postgres in schema public

當咱們刪除用戶的時候,會提示有權限依賴,因此咱們要刪除這些權限ip

postgres=# alter default privileges in schema public revoke usage on sequences from u2;
ALTER DEFAULT PRIVILEGES
postgres=# alter default privileges in schema public revoke select,insert,delete,update on tables from u2;
ALTER DEFAULT PRIVILEGES
postgres=# revoke select,insert,delete,update on all tables in schema public from u2;
REVOKE
postgres=# revoke usage on all sequences in schema public from u2;
REVOKE
postgres=# drop role u2;
DROP ROLE
相關文章
相關標籤/搜索