1. 首页 > PostgreSQL教程 > 正文

PostgreSQL教程FG017-PG权限基础:初始角色与简单权限分配

本文档风哥主要介绍PostgreSQL教程017相关内容。风哥教程参考PostgreSQL官方文档Server Administration, SQL Language内容编写,适合DBA人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。

内容简介:本文介绍PostgreSQL数据库的权限系统基础,包括权限概念、角色管理和简单权限分配方法。风哥教程参考PostgreSQL官方文档Database Roles、Client Authentication等内容,通过实际案例演示角色的创建、权限的授予和回收操作,帮助读者掌握PostgreSQL权限管理的基础知识。

Part01-基础概念与理论知识

1.1 PostgreSQL权限系统概念

PostgreSQL的权限系统用于控制用户对数据库对象(表、视图、函数等)的访问和操作。权限系统是数据库安全的重要组成部分,确保只有授权用户才能执行特定的操作。更多视频教程www.fgedu.net.cn

1.2 PostgreSQL角色概念

在PostgreSQL中,角色(Role)是权限的集合,既可以表示用户(User),也可以表示组(Group)。角色可以拥有数据库对象,也可以将权限授予其他角色。PostgreSQL使用角色来管理数据库访问权限。

1.3 PostgreSQL权限类型

PostgreSQL支持多种权限类型,主要包括:

  • SELECT:查询表或视图的权限
  • INSERT:向表中插入数据的权限
  • UPDATE:更新表中数据的权限
  • DELETE:删除表中数据的权限
  • TRUNCATE:清空表中数据的权限
  • REFERENCES:创建外键约束的权限
  • TRIGGER:创建触发器的权限
  • CREATE:创建数据库对象的权限
  • CONNECT:连接到数据库的权限
  • TEMPORARY:创建临时表的权限
  • EXECUTE:执行函数或存储过程的权限

Part02-生产环境规划与建议

2.1 PostgreSQL角色规划建议

风哥教程针对风哥教程针对风哥教程针对生产环境建议:
– 采用最小权限原则,只授予用户完成工作所需的最低权限
– 按功能划分角色,如开发角色、运维角色、审计角色等
– 使用角色继承机制,简化权限管理
– 避免直接使用超级用户进行日常操作
– 定期审查角色权限,及时回收不再需要的权限

2.2 PostgreSQL权限分配建议

风哥教程针对风哥教程针对风哥教程针对生产环境建议:
– 为每个数据库创建独立的应用角色
– 为不同的用户组创建不同的角色
– 使用GRANT语句授予权限,使用REVOKE语句回收权限
– 定期备份pg_hba.conf和pg_ident.conf配置文件
– 启用审计日志,记录权限变更操作

2.3 PostgreSQL权限安全最佳实践

风哥教程针对风哥教程针对风哥教程针对生产环境建议:
– 禁用默认的postgres超级用户远程访问
– 为所有角色设置强密码
– 定期更换数据库用户密码
– 限制数据库用户的连接来源
– 启用SSL加密连接

Part03-生产环境项目实施方案

3.1 PostgreSQL初始角色介绍

PostgreSQL安装完成后,会自动创建一些初始角色,包括:

from oracle:www.itpux.com

$ psql -d pgsql -U pgsql
Password for fgedu pgsql: psql (18.3)
Type “help” for help.

postgres=#

— 查看所有角色
\du
List of roles
Role name | Attributes | Member of
———–+————————————————————+———–
pgsql | Superfgedu, Create role, Create DB, Replication, Bypass RLS | {}

— 查看特定角色的属性
\du pgsql List of roles
Role name | Attributes | Member of
———–+————————————————————+———–
pgsql | Superfgedu, Create role, Create DB, Replication, Bypass RLS | {}

初始的postgres角色是超级用户,拥有所有权限,包括创建数据库、创建角色、复制数据等。学习交流加群风哥微信: itpux-com

3.2 PostgreSQL角色管理基础

PostgreSQL提供了创建、修改和删除角色的命令,用于角色管理。

— 创建角色
CREATE ROLE fgedu_read WITH LOGIN PASSWORD ‘fgedu@123’ NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT NOREPLICATION CONNECTION LIMIT 10;

CREATE ROLE

— 创建可创建数据库的角色
CREATE ROLE fgedu_dev WITH LOGIN PASSWORD ‘fgedu@456’ NOSUPERUSER CREATEDB NOCREATEROLE INHERIT NOREPLICATION;

CREATE ROLE

— 修改角色
ALTER ROLE fgedu_read WITH CONNECTION LIMIT 20;

ALTER ROLE

— 删除角色
— DROP ROLE IF EXISTS fgedu_read;

— 查看所有角色
\du
List of roles
Role name | Attributes | Member of
———–+————————————————————+———–
fgedu_dev | Create DB | {}
fgedu_read | | {}
pgsql | Superfgedu, Create role, Create DB, Replication, Bypass RLS | {}

3.3 PostgreSQL简单权限分配

PostgreSQL使用GRANT和REVOKE命令来管理权限的授予和回收。

— 创建测试数据库
CREATE DATABASE fgedudb WITH OWNER postgres;

CREATE DATABASE

— 连接到测试数据库
\c fgedudb
You are now connected to fgedudb “fgedudb” as fgedu “postgres”.

— 创建测试表
CREATE TABLE fgedu_products (
product_id SERIAL PRIMARY KEY,
product_name VARCHAR(100) NOT NULL,
price NUMERIC(10, 2) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE TABLE fgedu_– 插入测试数据
INSERT INTO fgedu_products (product_name, price)
VALUES (‘PostgreSQL教程’, 99.99),
(‘Python编程’, 89.99),
(‘Java开发’, 109.99);

INSERT 0 3

— 授予SELECT权限
GRANT SELECT ON fgedu_products TO fgedu_read;

GRANT

— 授予INSERT、UPDATE、DELETE权限
GRANT INSERT, UPDATE, DELETE ON fgedu_products TO fgedu_dev;

GRANT

— 授予表的所有权限
— GRANT ALL PRIVILEGES ON fgedu_products TO fgedu_dev;

— 查看表的权限
\dp fgedu_products
Access privileges
Schema | Name | Type | Access privileges | Column privileges | Policies
——–+————–+——-+—————————+——————-+———-
public | fgedu_products | table | postgres=arwdDxt/postgres+| |
| | | fgedu_read=r/pgsql +| |
| | | fgedu_dev=awd/pgsql | |
(1 row)

Part04-生产案例与实战讲解

4.1 PostgreSQL角色创建实战

在生产环境中,通常需要创建不同类型的角色,如只读角色、读写角色、管理员角色等。

— 创建管理员角色(非超级用户)
CREATE ROLE fgedu_admin WITH LOGIN PASSWORD ‘fgedu@admin’ NOSUPERUSER CREATEDB CREATEROLE INHERIT NOREPLICATION;

CREATE ROLE

— 创建应用读写角色
CREATE ROLE fgedu_fgfgapp_rw WITH LOGIN PASSWORD ‘fgedu@fgapprw’ NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT NOREPLICATION;

CREATE ROLE

— 创建应用只读角色
CREATE ROLE fgedu_fgfgapp_ro WITH LOGIN PASSWORD ‘fgedu@fgappro’ NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT NOREPLICATION;

CREATE ROLE

— 查看所有角色
\du
List of roles
Role name | Attributes | Member of
————–+————————————————————+———–
fgedu_admin | Create DB, Create role | {}
fgedu_fgfgapp_ro | | {}
fgedu_fgfgapp_rw | | {}
fgedu_dev | Create DB | {}
fgedu_read | | {}
pgsql | Superfgedu, Create role, Create DB, Replication, Bypass RLS | {}

4.2 PostgreSQL权限授予实战

为不同角色授予不同的权限,实现权限的精细化管理。

— 授予连接数据库的权限
GRANT CONNECT ON DATABASE fgedudb TO fgedu_fgfgapp_rw, fgedu_fgfgapp_ro;

GRANT

— 授予模式使用权限
GRANT USAGE ON SCHEMA public TO fgedu_fgfgapp_rw, fgedu_fgfgapp_ro;

GRANT

— 授予表的读写权限给应用读写角色
GRANT SELECT, INSERT, UPDATE, DELETE ON fgedu_products TO fgedu_fgfgapp_rw;

GRANT

— 授予表的只读权限给应用只读角色
GRANT SELECT ON fgedu_products TO fgedu_fgfgapp_ro;

GRANT

— 授予序列权限(如果表使用了SERIAL类型)
GRANT USAGE, SELECT ON SEQUENCE fgedu_products_product_id_seq TO fgedu_fgfgapp_rw;

GRANT

— 测试应用只读角色的权限
\c fgedudb fgedu_fgfgapp_ro
You are now connected to fgedudb “fgedudb” as fgedu “fgedu_fgfgapp_ro”.

fgedudb=> SELECT * FROM fgedu_products;
product_id | product_name | price | created_at
————+————–+——-+—————————–+08
1 | PostgreSQL教程 | 99.99 | 2026-04-02 11:15:30.123456+08
2 | Python编程 | 89.99 | 2026-04-02 11:15:30.123456+08
3 | Java开发 | 109.99 | 2026-04-02 11:15:30.123456+08
(3 rows)

— 尝试插入数据(应该失败)
fgedudb=> INSERT INTO fgedu_products (product_name, price) VALUES (‘Linux运维’, 119.99);
ERROR: permission denied for table fgedu_products

— 切换回超级用户
\c fgedudb pgsql You are now connected to fgedudb “fgedudb” as fgedu “postgres”.

4.3 PostgreSQL权限回收实战

当用户不再需要某些权限时,可以使用REVOKE命令回收权限。学习交流加群风哥QQ113257174

— 回收fgedu_dev角色的DELETE权限
REVOKE DELETE ON fgedu_products FROM fgedu_dev;

REVOKE

— 查看表的权限
\dp fgedu_products
Access privileges
Schema | Name | Type | Access privileges | Column privileges | Policies
——–+————–+——-+—————————+——————-+———-
public | fgedu_products | table | postgres=arwdDxt/postgres+| |
| | | fgedu_read=r/pgsql +| |
| | | fgedu_dev=aw/pgsql +| |
| | | fgedu_fgfgapp_rw=arwd/postgres+| |
| | | fgedu_fgfgapp_ro=r/pgsql | |
(1 row)

— 测试fgedu_dev角色的权限
\c fgedudb fgedu_dev
You are now connected to fgedudb “fgedudb” as fgedu “fgedu_dev”.

— 尝试删除数据(应该失败)
fgedudb=> DELETE FROM fgedu_products WHERE product_id = 1;
ERROR: permission denied for table fgedu_products

— 切换回超级用户
\c fgedudb pgsql You are now connected to fgedudb “fgedudb” as fgedu “postgres”.

Part05-风哥经验总结与分享

风哥提示:权限管理是数据库安全的核心,合理的权限设计可以有效防止未授权访问和数据泄露。在PostgreSQL中,角色和权限的管理是一个系统工程,需要根据业务需求和安全策略进行精心规划。

1. 采用最小权限原则是权限管理的核心,只授予用户完成工作所需的最低权限,避免过度授权。

2. 使用角色继承机制可以简化权限管理,将相同权限的用户添加到同一个角色中,统一管理权限。

3. 定期审查角色和权限,及时回收不再需要的权限,避免权限积累导致的安全风险。

4. 禁用默认的超级用户远程访问,创建专用的管理角色进行日常操作,提高系统安全性。

5. 启用审计日志,记录所有权限变更操作,便于追溯和审计。更多学习教程公众号风哥教程itpux_com

6. 为不同的应用和用户创建独立的角色,实现权限的隔离和精细化管理。

7. 定期备份pg_hba.conf和pg_ident.conf配置文件,确保权限配置的可恢复性。

8. 使用强密码策略,定期更换数据库用户密码,提高账户安全性。from PostgreSQL:www.itpux.com

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息