🍁 博主 "开着拖拉机回家"带您 Go to New World.✨🍁
🦄 个人主页——🎐开着拖拉机回家_Linux,Java基础学习,大数据运维-CSDN博客 🎐✨🍁
🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥
目录
🍁 博主 "开着拖拉机回家"带您 Go to New World.✨🍁
一、PostgreSQL权限概述
1.1 初始角色
数据库刚创建时,会自动创建一个超级用户的角色:postgres。任何操作都是从该用户开始的。
PostgreSQL权限管理详解_pgsql权限管理_zou8944的博客-CSDN博客(摘录博客)
1.2 权限 - PRIVILEGES
角色有了,决定角色能够执行哪些数据库操作,则需要权限进行管理。PG将权限分为了两部分。这里所说的权限,主要指第二部分
- 能否登录、创建database、创建role,这类重要权限,在创建role时指定;在pg_roles表中可查看
- 对数据库对象的各类操作的权限,通过GRANT手动授予;在information_schema.xxx_privileges表中可查看,比如information_schema.table_privileges
1.3 权限的组成
一个完整的权限描述:角色A对表table1具有SELECT权限,有三部分组成
- 角色:A
- 授权目标:table1
- 权限:SELECT
1.4 特殊的权限
1、owner拥有特权
当一个数据库对象被创建后,它会被自动分配一个owner,一般来说是执行创建语句的那个角色。大多数情况下,owner及其成员能够对该对象做任何事,如果其他人想要操作它,则需要GRANT授权。
可修改owner,超级用户、对象原本的owner、owner的成员都能够调整对象的owner
alter table table_name owner to new_owner;
2、PUBLIC
PUBLIC并不是一个真正的角色,确切地说,它应该算一个关键字,当授权的目标是它时,表示:授予系统中的所有角色,包括今后定义的角色。
PUBLIC默认是拥有以下权限
- 本地登录
- 对public的USAGE权限
- 对public的CREATE权限
字面意思理解,相当于将该权限公开。
1.5 授权 - GRANT
-- 授予权限 GRANT {权限} ON {授权目标} TO {被授权角色} [WITH GRANT OPTION] -- 授予角色 GRATE {角色} TO {被授权角色} [WITH ADMIN OPTION] [GRANTED BY 角色]
ALL PRELEGES:它是针对一个授权目标的所有权限的总和。
WITH ADMIN OPTION:授权传递,被授权的角色,可以传递授权
# 授予用户 zhangsan 数据库 kangkang 的所有权限 grant all privileges on database kangkang to zhangsan; # 授权当前database 的指定kangll_schema的所有表的只读权限给zhangsan 角色 grant select on all tables in schema kangll_schema to zhangsan;
如下查询结果表示:kangll_test 数据中 public 下 stu 表,kangll 用户拥有所有权限, zhang 用户拥有只读权限,都是 kangll 用户授予的。
我们换个数据库查询下,可以看到 Access privileges为空,表明:其owner对该表有完整的权限
二、Schema创建和授权实操
创建数据库 kangkang, 我使用 postgres用户 完成
CREATE DATABASE kangkang;
创建名为 zhangsan 的用户,请运行以下命令:
CREATE USER zhangsan WITH PASSWORD '123456'; -- 修改密码 alter user zhangsan with password 'password';
授予zhangsan用户 kangkang 数据库的所有权限
grant all privileges on database kangkang to zhangsan;
现在 使用zhangsan 用户登录数据库, 创建名为 kangll_schema 的 schema
CREATE SCHEMA kangll_schema; ## 删除可以执行如下命令 DROP SCHEMA kangll_schema;
执行结果:
授予名为 zhangsan 用户对名为 kangll_schema 的 schema 下表的所有操作权限
GRANT USAGE ON SCHEMA kangll_schema to zhangsan; grant all privileges on all tables in schema kangll_schema to zhangsan; grant all privileges on all sequences in schema kangll_schema to zhangsan; grant select,insert,update,delete on all tables in schema kangll_schema to zhangsan;
授权完成
kangkang数据库中创建 stu 表
CREATE TABLE kangll_schema.stu( stu_id BIGINT NOT NULL, stu_name VARCHAR(255) NOT NULL); # 插入数据 INSERT INTO kangll_schema.stu VALUES(1, 'kangll'); # 查询 SELECT * FROM kangll_schema.stu;
执行过程:
可以看到 zhangsan 用户对 stu 表拥有所有权限, 也可以看到 Access privileges为空
撤销 权限后 重新分配 只读权限, zhangsan 用户拥有只读权限,且权限是 zhangsan 用户授予的 ,可以看到 Access privileges 不为空 ,为zhangsan 用户的 “r” 权限。
三、重新为用户授权
-- 取消权限 REVOKE [GRANT OPTION FOR] {权限} ON {授权目标} FROM {被授权人} [CASCADE | RESTRICT] -- 取消角色 REVOKE [ADMIN OPTION FOR] {角色} FROM {被授权角色} [CASCADE | RESTRICT]
示例:
-- 切换到doki_database下 \c kangkang -- 收回用户在 kangll_schema 下所有表的所有权限 REVOKE ALL PRIVILEGES ON ALL TABLES IN SCHEMA kangll_schema FROM zhangsan; -- 为zhangsan 赋予kangkang 数据库下的查询权限 GRANT select ON all TABLES IN SCHEMA kangll_schema to zhangsan; GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA kangll_schema TO zhangsan;
执行过程:
四、查询schema是否存在
查询 PostgreSQL 数据库中是否存在某个特定的 schema,可以使用以下 SQL 命令:
SELECT * FROM information_schema.schemata WHERE schema_name = 'kangll_schema';
查询可以看到 schema_name 和 对应schema的 所属者,如果查询结果为空则对应的schema 不存在。
五、客户端鉴权
角色创建后好,还需要确认pg_hba.conf 的配置, 如果没有配置并不能直接通过网络连接到PG服务端。一般我们都是在安装完数据库就需要配置。
vim /var/lib/pgsql/15/data/pg_hba.conf # TYPE DATABASE USER ADDRESS METHOD # "local" is for Unix domain socket connections only local all all peer # IPv4 local connections: host all all 127.0.0.1/32 scram-sha-256 # IPv6 local connections: host all all ::1/128 scram-sha-256 # Allow replication connections from localhost, by a user with the # replication privilege. local replication all peer host replication all 127.0.0.1/32 scram-sha-256 host replication all ::1/128 scram-sha-256 host all all 0.0.0.0/0 md5
配置文件说明:
TYPE
- local:本地连接
- host:使用TCP/IP连接
DATABASE: 许连接的database
USER:允许连接的角色
ADDRESS: 允许的客户端地址,0.0.0.0/0表示允许所以客户端连接
METHOD: 鉴权方式
- trust:无条件允许连接
- reject:无条件拒绝
- password:要求客户端提供未加密的密码进行身份验证,密码在网络上以明文形式传输,如果使用SSL,可以加密传输
- scram-sha-256:执行 SCRAM-SHA-256 身份验证,这是一种质询响应机制,这是目前最安全的方式,不过有的数据库客户端可能不支持。
- md5:也是一种质询响应机制
- peer:获取客户端操作系统的用户名,如果和请求连接的用户名一样。这只有在本地连接时才有用。
- xxx:都是其它的鉴权方式,官网参考: PostgreSQL: Documentation: 15: 21.1. The pg_hba.conf File
六、postgresql 执行sql文件
# 切换到postgres用户 sudo -i -u postgres psql -d testdb -U postgres -f /opt/PostgreSQL/Ambari-DDL-Postgres-CREATE.sql 或者 sudo -u postgres psql -d kangkang -U postgres -f /opt/PostgreSQL/Ambari-DDL-Postgres-CREATE.sql