entari-plugin-permission
基于 arclet-cithun 的 Entari 权限插件。
它提供了一套可持久化的权限、角色、继承链与 Track(权限路径)管理能力,并为 Entari 指令系统提供了现成的权限校验与管理命令。
功能特性
- 用户 / 角色权限管理,数据持久化到数据库
- 角色继承与用户继承角色
- Track(权限路径)管理:创建、删除、查看、增删等级、重命名、清空
- 支持
chmod风格的权限设置快捷写法 - 支持按资源 ID 注册自定义权限附加策略(
attach) - 提供可直接复用的权限校验工具:
check_permission/require_permission - 内置 Entari 管理指令
- 自动同步用户
authority到内置authorityTrack
依赖环境
- Python
>= 3.10 arclet-entari >= 0.18.0rc2arclet-cithun >= 1.4.0, < 1.5.0entari-plugin-user >= 0.1.6entari-plugin-database >= 0.3.1- 需要启用数据库服务:
database/sqlalchemy
安装
pdm add entari-plugin-permission
配置
指令前缀
插件默认指令名为 permission,可通过配置修改:
# entari.yml
plugins:
permission:
command: permission
也就是说,默认管理指令前缀为:
/permission
如果你把 command 改成别的值,那么所有子指令前缀也会随之改变。
内置权限模型
插件启动后会创建并使用以下默认角色 / Track:
默认角色
group:default:默认角色, 所有用户默认继承
内置权限角色
group:authority.1—Authority 1group:authority.2—Authority 2group:authority.3—Authority 3group:authority.4—Authority 4group:authority.5—Authority 5
内置 Track
authority—Authority Track
其等级名称依次为:
memberadvanced-memberadminsenior-adminsuperuser
插件会在启动时建立如下继承关系:
AUTH_2 -> AUTH_1
AUTH_3 -> AUTH_2
AUTH_4 -> AUTH_3
AUTH_5 -> AUTH_4
并将 authority Track 与这些权限角色关联起来。
内置指令
以下指令默认都挂在 /permission 下(实际前缀取决于 Config.command)。
用户权限
-
/permission user [@用户] list- 查看用户权限
-
/permission user [@用户] set <permission> <state>- 设置权限状态
state支持:true/falsePermission.parse(...)支持的权限表达式chmod风格快捷写法
-
/permission user [@用户] get <permission>- 查询单个权限状态
-
/permission user [@用户] inherit <role> [--cancel]- 继承 / 取消继承某个角色
-
/permission user [@用户] promote <track>- 提升指定 Track 的等级
-
/permission user [@用户] demote <track>- 降低指定 Track 的等级
Track 管理
-
/permission track <track> info- 查看 Track 信息
-
/permission track <track> append <role>- 向 Track 末尾添加等级
-
/permission track <track> insert <role> <index>- 在指定位置插入等级
-
/permission track <track> remove <role>- 从 Track 移除等级
-
/permission track <track> clear- 清空 Track 等级
-
/permission track <track> rename <name>- 重命名 Track
-
/permission listtrack- 列出所有 Track
-
/permission createtrack <track> [name]- 创建 Track
-
/permission deletetrack <track>- 删除 Track
chmod 快捷写法
插件内置了一个快捷指令:
/chmod <expr> <permission>
它会被自动转换为:
/permission user set <permission> <expr>
权限点
插件自身的管理指令也有权限控制,主要权限点如下:
command.permission.listcommand.permission.setcommand.permission.getcommand.permission.inheritcommand.permission.promotecommand.permission.demotecommand.permission.listtrackcommand.permission.createtrackcommand.permission.deletetrackcommand.permission.track.infocommand.permission.track.appendcommand.permission.track.insertcommand.permission.track.removecommand.permission.track.clearcommand.permission.track.rename
默认预设权限:
group:default对command.permission拥有vmaAUTH_1对command.permission.*拥有VISITAUTH_3对command.permission.*拥有VISIT | AVAILABLE
开发者接口
如果你想在自己的插件中复用这套权限系统,可以直接导入下列对象:
from entari_plugin_permission import (
system,
Permission,
UserOwner,
check_permission,
require_permission,
AUTH_1,
AUTH_2,
AUTH_3,
AUTH_4,
AUTH_5,
AUTHORITY,
)
system
system 是权限系统的核心实例,已经集成:
AsyncPermissionServiceAsyncPermissionExecutor- ORM 持久化存储
常用能力包括:
system.pre_role(...)system.pre_track(...)system.pre_assign(...)system.attach(...)system.get_or_create_user(...)system.get_role(...)system.get_track(...)
check_permission(...)
返回一个异步检查函数,可用于 enter_if、Depends 等场景。
from entari_plugin_permission import check_permission
checker = check_permission("command.foo", prompt=True)
require_permission(...)
这是 Propagator 封装,适合直接挂到 propagate(...) 上:
from arclet.letoderea import propagate
from entari_plugin_permission import require_permission
@propagate(require_permission("command.foo", prompt=True))
async def handler() -> None:
...
UserOwner
UserOwner 是一个可直接注入的类型别名,会自动从当前会话取出对应的 Cithun User 对象。
自定义资源权限附加
你可以通过 system.attach(...) 为某类资源动态追加权限:
pattern可以是字符串- 精确匹配
- glob 通配:
*、?、[]
- 也可以是自定义谓词函数
Callable[[str], bool]
回调返回值支持:
- 直接返回
Permission:表示追加允许权限 - 返回
(Permission, "+"):追加 - 返回
(Permission, "-"):移除 - 返回
(Permission, "="):覆盖
事件
插件定义了一个事件:
UserSetTrackLevel
当用户 Track 等级变化时会发布该事件,适合做外部同步或审计。
示例
仓库里的 example_plugin.py 展示了一个完整用法:
- 定义了一个自定义权限
command.mask - 创建了
mask_track - 通过
system.pre_assign(...)给不同权限角色分配该权限 - 在指令执行前使用
require_permission(...)做校验
如果你需要在自己的插件里增加权限控制,通常可以按下面的模式写:
from arclet.cithun import Permission
from entari_plugin_permission import AUTH_1, AUTH_3, require_permission, system
system.pre_assign(system.default_role, "command.xxx", Permission("v-a"))
system.pre_assign(AUTH_1, "command.xxx", Permission.VISIT)
system.pre_assign(AUTH_3, "command.xxx", Permission.VISIT | Permission.AVAILABLE)
许可证
MIT
Metadata
Release files for entari-plugin-permission 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| entari_plugin_permission-0.2.0.tar.gz | 18.1 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| entari_plugin_permission-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 36.5 kB
Release files / entari_plugin_permission-0.2.0.tar.gz
| Download URL | entari_plugin_permission-0.2.0.tar.gz |
|---|---|
| Size | 18.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
8ed31e50224d8434b2b7db655f74e7fe886bf441264848a282bf2ec1038f376a
|
|
BLAKE2b-256 checksum How to use checksums |
d56e262bdd6472db829a5b3d053d1118afeefd44e15b728d9d10585f53ec6fc7
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
pdm/2.28.0 CPython/3.11.7 Windows/10
|
Release files / entari_plugin_permission-0.2.0-py3-none-any.whl
| Download URL | entari_plugin_permission-0.2.0-py3-none-any.whl |
|---|---|
| Size | 18.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
fc1e9b7e3a3e7c5a41308a6f66a13d0794a7cff363428c9c461b6093b69d949e
|
|
BLAKE2b-256 checksum How to use checksums |
5053d461af63003cb4cef76fa3396ea45231582babe2d2634ee6ac4fa71b5f03
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
pdm/2.28.0 CPython/3.11.7 Windows/10
|
Security for entari-plugin-permission 0.2.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.