在django orm中的每个postgresql连接上执行set role

django-postgresql-setrole的Python项目详细描述


Django PostgreSQL设置角色

一个django应用程序,在每个到postgresql的连接上执行set role。 由Django打开。如果您使用外部身份验证,这将非常有用 经理喜欢Hashicorp Vault

postgresql的用户模型(“roles”)分配在数据库中创建的每个对象/ 表空间/模式是“所有者”。所述所有者是only用户,可以修改或 放下物体。这意味着从保险库租用的用户凭据 过期一段时间后,不能用于创建或迁移表,除非 每次都使用相同的用户名(这可能会达不到目的)。

解决方案是创建一个“所有者角色”。通俗地说“有 对数据库和inherit属性的所有必要权限 充当身份验证管理器中租用用户的“sudo”用户。全部 由身份验证管理器创建的用户将被分配此组 当它们连接到数据库时,执行“set role<;owner role>;”,从而 使所有创建的对象归所有者角色所有。

如何使用此django应用程序?

将PostgreSQL设置角色添加到已安装的应用程序。然后在settings.databases中添加

DATABASES={"default":{...,# other settings"SET_ROLE":"mydatabaseowner",}.}

为什么必须设置角色?

inherit属性不是双向的。因此,如果分配了(用户)角色 它继承组权限的(组)角色,但组不 获取对用户角色创建的对象的任何权限。

所以你想要的是(组)所有者角色拥有一切。

我该怎么设置?

以超级用户的身份出现在您的外壳上

# --- create an admin role for Vault
# no create database
# encrypt password
# do not inherit rights
# can create roles
# not a superuser
createuser -D -E -I -l -r -S vaultadmin

# --- create an owner role for your database
# no create database
# encrypt password
# do not inherit rights
# can't create roles
# not a superuser
createuser -D -E -I -L -R -S mydatabaseowner
createdb -E utf8 -O mydatabaseowner mydatabase

然后配置保险库以创建如下角色:

$ vault mount -path=postgresql database
$ vault write postgresql/config/mydatabase \
plugin_name=postgresql-database-plugin \
allowed_roles="mydatabase_fullaccess"\
connection_url="postgresql://mydatapaseowner:[mydatabasepassword]@localhost:5432/"
$ vault write postgresql/roles/mydatabase_fullaccess -
{"db_name": "mydatabase",
    "default_ttl": "10m",
    "max_ttl": "1h",
    "creation_statements": "CREATE ROLE \"{{name}}\" WITH LOGIN ENCRYPTED PASSWORD '{{password}}' VALID UNTIL '{{expiration}}' IN ROLE \"mydatabaseowner\" INHERIT NOCREATEROLE NOCREATEDB NOSUPERUSER NOREPLICATION NOBYPASSRLS;",
    "revocation_statements": "DROP ROLE \"name\";"}

然后,登录时由Vault创建的用户必须运行

SETROLE"mydatabaseowner";

这样可以确保所有创建的表和其他对象都属于 mydatabaseowner

许可证

版权所有(C)2016-2017,Jonas Maurus 保留所有权利。

以源和二进制形式重新分配和使用,有无 如果满足以下条件,则允许修改:

  1. 重新发布源代码必须保留上述版权声明 条件列表和以下免责声明。
  2. 二进制形式的再分配必须复制上述版权声明, 文件中的条件列表和以下免责声明 和/或分发时提供的其他材料。
  3. 无论是著作权人的名字还是作者的名字 可用于认可或推广从本软件衍生的产品 未经事先书面许可。

本软件由版权所有者和贡献者“按原样”提供,并且 任何明示或默示保证,包括但不限于 对特定用途的适销性和适合性的保证 否认。在任何情况下,版权持有人或贡献者均不承担责任 对于任何直接的、间接的、偶然的、特殊的、惩戒性的或间接的 损害赔偿(包括但不限于购买替代货物或 但是 根据任何责任理论,无论是在合同中,严格责任, 或因使用而引起的侵权行为(包括疏忽或其他) 即使被告知有可能造成这种损害。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
反射Java反射:高负载下的NoSuchMethodException   java RxJava:one request>list of Integer>sequence of requests for each int>result to list   java为什么循环之前索引会增加   JavaSpring远程处理和RESTfulURL   java Hibernate搜索仅对我的实体的一部分进行索引   使用DPAD快速滚动时,java RecyclerView onCreateViewHolder调用过多   java将JSON解析到一个表中   java导航抽屉标题textview nullpointerexception   基于接口的Java链接队列   java Guice运行时依赖项参数重新注入   java展平/压缩ZSH中的深度嵌套目录   JavaSpring:Http406此请求标识的资源只能   java如何制作Android启动器图标   Java代码在windows上显示不正确(包含希腊语句子)   使用yourkit进行内存分析所用的java时间   java为什么可以序列化属性而不能序列化对象本身?