跳转到主要内容

Datasette插件,用于使用SQL查询配置权限检查

项目描述

datasette-permissions-sql

PyPI CircleCI License

Datasette插件,用于使用SQL查询配置权限检查

安装

将此插件安装在Datasette相同的环境中。

$ pip install datasette-permissions-sql

用法

首先,了解Datasette的认证和权限系统是如何工作的。

此插件允许您定义包含SQL查询的规则,这些查询被执行以查看当前认证的参与者是否有权限执行某些操作。

考虑一个预定义的查询,只有当users表中的一行表明他们是员工时,认证用户才能执行此查询。

mydatabase.db数据库中的users表可能看起来像这样

id username is_staff
1 cleopaws 0
2 simon 1

认证用户有一个这样的actor

{
    "id": 2,
    "username": "simon"
}

要将预定义查询配置为仅由员工用户执行,请在metadata.json中添加以下内容

{
    "plugins": {
        "datasette-permissions-sql": [
            {
                "action": "view-query",
                "resource": ["mydatabase", "promote_to_staff"],
                "sql": "SELECT * FROM users WHERE is_staff = 1 AND id = :actor_id"
            }
        ]
    },
    "databases": {
        "mydatabase": {
            "queries": {
                "promote_to_staff": {
                    "sql": "UPDATE users SET is is_staff=1 WHERE id=:id",
                    "write": true
                }
            }
        }
    }
}

"datasette-permissions-sql"键是一个规则列表。这些规则具有以下形状

{
    "action": "name-of-action",
    "resource": ["resource identifier to run this on"],
    "sql": "SQL query to execute",
    "database": "mydatabase"
}

"action""resource"都是可选的。如果存在,SQL查询将仅在匹配操作和(如果存在)资源指示器的权限检查上执行。

"database"也是可选的:它指定了应该执行查询的命名数据库。如果不存在,则使用第一个连接的数据库。

Datasette文档包括一个内置权限列表,您可能想在这里使用。

SQL查询

如果SQL查询返回任何行,则允许执行操作。如果没有返回行,则插件钩子将返回False并拒绝对该操作的访问。

SQL查询使用多个命名参数调用。您可以在查询中使用这些参数中的任何一个。

参数列表如下

  • action - 操作,例如 "view-database"
  • resource_1 - 资源的第一部分,如果已传递
  • resource_2 - 资源的第二部分,如果可用
  • actor_* - 对每个actor键的参数。通常存在 actor_id

如果返回任何行,则权限检查通过。如果没有返回行,则检查失败。

另一个示例表,这次是授予对单个表的显式访问权限。考虑一个名为 table_access 的表,其结构如下

user_id database table
1 mydb dogs
2 mydb dogs
1 mydb cats

以下SQL查询将授予用户1和2对 mydb.db 数据库中的 dogs 表的访问权限,但将禁止用户2对 cats 表的访问

SELECT
    *
FROM
    table_access
WHERE
    user_id = :actor_id
    AND "database" = :resource_1
    AND "table" = :resource_2

在类似的 metadata.yaml 配置文件中

databases:
  mydb:
    allow_sql: {}
plugins:
  datasette-permissions-sql:
  - action: view-table
    sql: |-
      SELECT
        *
      FROM
        table_access
      WHERE
        user_id = :actor_id
        AND "database" = :resource_1
        AND "table" = :resource_2

在这里我们使用 allow_sql: {} 来禁用任意SQL查询。这防止用户直接运行 select * from cats 来规避权限限制。

回退模式

此插件的默认行为是控制指定的权限。SQL查询将直接控制用户是否被允许或拒绝访问权限。

这意味着每个权限的默认策略(在Datasette核心中为“允许”view-database 和类似操作)将被忽略。这也意味着在此插件执行后,任何其他 permission_allowed 插件都不会有机会。

您可以使用 "fallback": true 逐规则更改此设置

{
    "action": "view-table",
    "resource": ["mydatabase", "mytable"],
    "sql": "select * from admins where user_id = :actor_id",
    "fallback": true
}

在回退模式下运行时,查询结果返回空行将导致插件钩子返回 None - 这表示“我对这个权限没有意见,回退到其他插件或默认设置”。

在此模式下,您仍然可以通过返回包含单个值 -1 的单行来返回 False(表示“拒绝访问”)。例如

{
    "action": "view-table",
    "resource": ["mydatabase", "mytable"],
    "sql": "select -1 from banned where user_id = :actor_id",
    "fallback": true
}

项目详情


下载文件

下载您平台上的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源代码分发

此版本没有提供源代码分发文件。请参阅 生成分发存档的教程

构建分发

datasette_permissions_sql-0.3a0-py3-none-any.whl (8.8 kB 查看哈希值)

上传时间 Python 3

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误记录 StatusPage StatusPage 状态页面