在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 保留所有权利。
以源和二进制形式重新分配和使用,有无 如果满足以下条件,则允许修改:
- 重新发布源代码必须保留上述版权声明 条件列表和以下免责声明。
- 二进制形式的再分配必须复制上述版权声明, 文件中的条件列表和以下免责声明 和/或分发时提供的其他材料。
- 无论是著作权人的名字还是作者的名字 可用于认可或推广从本软件衍生的产品 未经事先书面许可。
本软件由版权所有者和贡献者“按原样”提供,并且 任何明示或默示保证,包括但不限于 对特定用途的适销性和适合性的保证 否认。在任何情况下,版权持有人或贡献者均不承担责任 对于任何直接的、间接的、偶然的、特殊的、惩戒性的或间接的 损害赔偿(包括但不限于购买替代货物或 但是 根据任何责任理论,无论是在合同中,严格责任, 或因使用而引起的侵权行为(包括疏忽或其他) 即使被告知有可能造成这种损害。