PostgreSQL权限管理之创建可更新表的普通用户

一、环境

$ psql --version
psql (PostgreSQL) 9.4.4

我们都知道,超级用户的权限太大了,为了数据库的安全,对于非管理员账号,需要创建普通用户。

二、语法

$ psql 
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

三、创建只读用户

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是赋予登录权限,否则是不能登录的

3. 赋予u1对表的只读权限

因为创建的普通用户默认是没有任何权限的

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)

赋予schema中所有表的默认权限给u1,这样以后新建表就不用再赋权限了。

四、创建可更新用户

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)

可以正常增删改查

5. 序列的权限与解决办法

在insert的时候,指定列插入,主键id是serial类型会默认走sequence的下一个值,但前面只赋予了表的权限,所以会出现下面的问题:

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

解决方法就是再赋一次sequence的值就行了

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)

五、删除用户

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

当我们删除用户的时候,会提示有权限依赖,所以我们要删除这些权限

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

这样太麻烦了,有没有更快的办法?

postgres=# drop role u1;
ERROR:  role "u1" cannot be dropped because some objects depend on it
DETAIL:  privileges for table t5
privileges for table t4
privileges for table t3
privileges for default privileges on new relations belonging to role postgres in schema public
privileges for table t1
postgres=# drop owned by u1;
DROP OWNED
postgres=# drop role u1;
DROP ROLE
时间: 2024-10-20 10:03:33

PostgreSQL权限管理之创建可更新表的普通用户的相关文章

lock(1)——创建及更新表过程中SQL SERVER锁资源分配情况

锁应该说是由关系型数据库ACID(Atomicity,Consistency,Isolation,Durability)特性而引出的. 以下将测试在创建及更新表过程中SQL Server锁资源分配情况 获取当前会话的事务隔离级别:DBCC USEROPTIONS 测试环境:SQL SERVER 2008 R2 read committed隔离级别下 创建表 当我们只是打开一个SSMS查询窗口,选择数据库为master和tempdb时,没有任何锁产生,当我选择其他数据库,sql server就会在

基于吉日嘎底层架构的通用权限管理Web端UI更新:参考DTcms后台界面

经一周的研究学习,看了国内的H+.HUI等,国外的PaperDashboardPro.Make.Metronic BootStrap等,最终选定用一个轻量的,适合中国人的,来自DTcms的后台管理UI来改造吉日嘎拉的通用权限管理Web端的UI. js+css+图片文件如下 新增一个Menu.ashx文件,用于输出当前用户权限可以查看的所有菜单. 新增Main.aspx文件用于主框架,所有内容也放在名为fraContent的iframe中.其它涉及的登录跳转小修改暂时略过. 有图有真相,先上图:

MySQL中创建用户、创建数据库、表并付给用户权限

---创建数据库 CREATE DATABASE zdb_mysql; ---创建用户: CREATE USER 'zdb_mysql'@'localhost' IDENTIFIED BY 'zdb_mysql'; #本地登录 ---附权限: grant all privileges on zdb_mysql.* to 'zdb_mysql' @'localhost' identified by 'zdb_mysql'; flush privileges; #刷新系统权限表 ---创建表 cre

orcal中创建和删除表空间和用户

1.创建表空间 create tablespace NW_DATA logging datafile 'F:\oracle\product\10.2.0\oradata\nwdb\NW_DATA.dbf' size 64m autoextend on next 64m maxsize 20480m extent management local; 2. 创建用户并指定表空间 create user test identified by 123 default tablespace NW_DATA

4.windows和Linux下创建oracle用户名表空间,表,插入数据,用户管理表等操作

进入超级管理员,执行以下命令 Window下创建数据库,表空间,用户,插入数据等操作 -- 01 创建表空间 -- 注意表空间的路径 根据实际安装环境进行调整 CREATE TABLESPACE ts_myscott LOGGING DATAFILE 'F:/app/to-to/oradata/orcl/ts_myscott.dbf' SIZE 10M EXTENT MANAGEMENT LOCAL; CREATE TABLESPACE ts_myscott2 LOGGING DATAFILE

SpringMVC+Shiro权限管理【转】

1.权限的简单描述 2.实例表结构及内容及POJO 3.Shiro-pom.xml 4.Shiro-web.xml 5.Shiro-MyShiro-权限认证,登录认证 6.Shiro-applicationContext-shiro.xml 7.HomeController三个JSP文件 什么是权限呢?举个简单的例子:我有一个论坛,注册的用户分为normal用户,manager用户.对论坛的帖子的操作有这些:添加,删除,更新,查看,回复我们规定:normal用户只能:添加,查看,回复manage

MySQL用户和权限管理

MySQL用户权限表 MySQL的认证是“用户”加“主机”而权限是访问资源对象,MySQL服务器通过权限表来控制用户对数据库的访问,权限表存放在mysql数据库中,由mysql_install_db脚本初始化.存储账户权限信息表主要有:user,db,tables_priv,columns_priv,procs_priv这五张表(5.6之前还有host表,现在已经把host内容整合进user表),五张表其含义分别是: user表 user表时MySQL中最重要的一个权限表,记录允许连接到服务器的

MYSQL用户权限管理学习笔记

MYSQL 用户管理 1.权限表 MYSQL是一个多用户的数据库,MYSQL的用户可以分为两大类: (1)       超级管理员用户(root),拥有全部权限 (2)       普通用户,由root创建,普通用户只拥有root所分配的权限 1.1 权限表的位置 数据库:mysql 与权限相关的数据表:user,db,host,tables_priv,columns_priv,procs_priv等 1.2 user表 User表存储了: (1)用户的信息:hots(用户所在的主机),user

SpringMVC+Shiro权限管理

SpringMVC+Shiro权限管理 什么是权限呢?举个简单的例子: 我有一个论坛,注册的用户分为normal用户,manager用户.对论坛的帖子的操作有这些:添加,删除,更新,查看,回复我们规定:normal用户只能:添加,查看,回复manager用户可以:删除,更新 normal,manager对应的是角色(role)添加,删除,更新等对应的是权限(permission) 我们采用下面的逻辑创建权限表结构(不是绝对的,根据需要修改) 一个用户可以有多种角色(normal,manager,