Datasette插件,用于使用SQL查询配置权限检查
项目描述
datasette-permissions-sql
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 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 4742bd1668b459075b14d3a066cd3cd101866049c1628443d2ff306817b6cf4d |
|
MD5 | a924977b81eb4fa4e1bdf4eaae49b4c3 |
|
BLAKE2b-256 | 7735267c6238fc1fd3b339b69dcd1e9e1b470e7c92945f3b6de818e966eb2b99 |