entari-plugin-permission 0.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- entari_plugin_permission-0.1.0/LICENSE +21 -0
- entari_plugin_permission-0.1.0/PKG-INFO +319 -0
- entari_plugin_permission-0.1.0/README.md +304 -0
- entari_plugin_permission-0.1.0/pyproject.toml +23 -0
- entari_plugin_permission-0.1.0/setup.cfg +4 -0
- entari_plugin_permission-0.1.0/src/entari_plugin_permission/__init__.py +76 -0
- entari_plugin_permission-0.1.0/src/entari_plugin_permission/check.py +54 -0
- entari_plugin_permission-0.1.0/src/entari_plugin_permission/config.py +6 -0
- entari_plugin_permission-0.1.0/src/entari_plugin_permission/event.py +14 -0
- entari_plugin_permission-0.1.0/src/entari_plugin_permission/handler.py +318 -0
- entari_plugin_permission-0.1.0/src/entari_plugin_permission/main.py +128 -0
- entari_plugin_permission-0.1.0/src/entari_plugin_permission/model.py +89 -0
- entari_plugin_permission-0.1.0/src/entari_plugin_permission/params.py +17 -0
- entari_plugin_permission-0.1.0/src/entari_plugin_permission/store.py +470 -0
- entari_plugin_permission-0.1.0/src/entari_plugin_permission.egg-info/PKG-INFO +319 -0
- entari_plugin_permission-0.1.0/src/entari_plugin_permission.egg-info/SOURCES.txt +17 -0
- entari_plugin_permission-0.1.0/src/entari_plugin_permission.egg-info/dependency_links.txt +1 -0
- entari_plugin_permission-0.1.0/src/entari_plugin_permission.egg-info/requires.txt +4 -0
- entari_plugin_permission-0.1.0/src/entari_plugin_permission.egg-info/top_level.txt +1 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 ARCLET
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: entari-plugin-permission
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Permission system for Entari based on Cithun
|
|
5
|
+
Author-email: RF-Tar-Railt <rf_tar_railt@qq.com>
|
|
6
|
+
License: MIT
|
|
7
|
+
Requires-Python: >=3.10
|
|
8
|
+
Description-Content-Type: text/markdown
|
|
9
|
+
License-File: LICENSE
|
|
10
|
+
Requires-Dist: arclet-entari>=0.18.0rc2
|
|
11
|
+
Requires-Dist: arclet-cithun<1.5.0,>=1.4.0
|
|
12
|
+
Requires-Dist: entari-plugin-user>=0.1.6
|
|
13
|
+
Requires-Dist: entari-plugin-database>=0.3.1
|
|
14
|
+
Dynamic: license-file
|
|
15
|
+
|
|
16
|
+
# entari-plugin-permission
|
|
17
|
+
|
|
18
|
+
基于 [`arclet-cithun`](https://github.com/ArcletProject/Arclet) 的 Entari 权限插件。
|
|
19
|
+
|
|
20
|
+
它提供了一套可持久化的权限、角色、继承链与 Track(权限路径)管理能力,并为 Entari 指令系统提供了现成的权限校验与管理命令。
|
|
21
|
+
|
|
22
|
+
## 功能特性
|
|
23
|
+
|
|
24
|
+
- 用户 / 角色权限管理,数据持久化到数据库
|
|
25
|
+
- 角色继承与用户继承角色
|
|
26
|
+
- Track(权限路径)管理:创建、删除、查看、增删等级、重命名、清空
|
|
27
|
+
- 支持 `chmod` 风格的权限设置快捷写法
|
|
28
|
+
- 支持按资源 ID 注册自定义权限附加策略(`attach`)
|
|
29
|
+
- 提供可直接复用的权限校验工具:`check_permission` / `require_permission`
|
|
30
|
+
- 内置 Entari 管理指令
|
|
31
|
+
- 自动同步用户 `authority` 到内置 `authority` Track
|
|
32
|
+
|
|
33
|
+
## 依赖环境
|
|
34
|
+
|
|
35
|
+
- Python `>= 3.10`
|
|
36
|
+
- `arclet-entari >= 0.18.0rc2`
|
|
37
|
+
- `arclet-cithun >= 1.4.0, < 1.5.0`
|
|
38
|
+
- `entari-plugin-user >= 0.1.6`
|
|
39
|
+
- `entari-plugin-database >= 0.3.1`
|
|
40
|
+
- 需要启用数据库服务:`database/sqlalchemy`
|
|
41
|
+
|
|
42
|
+
## 安装
|
|
43
|
+
|
|
44
|
+
```shell
|
|
45
|
+
pdm add entari-plugin-permission
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## 配置
|
|
49
|
+
|
|
50
|
+
### 指令前缀
|
|
51
|
+
|
|
52
|
+
插件默认指令名为 `permission`,可通过配置修改:
|
|
53
|
+
|
|
54
|
+
```yaml
|
|
55
|
+
# entari.yml
|
|
56
|
+
plugins:
|
|
57
|
+
permission:
|
|
58
|
+
command: permission
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
也就是说,默认管理指令前缀为:
|
|
62
|
+
|
|
63
|
+
```text
|
|
64
|
+
/permission
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
如果你把 `command` 改成别的值,那么所有子指令前缀也会随之改变。
|
|
68
|
+
|
|
69
|
+
## 内置权限模型
|
|
70
|
+
|
|
71
|
+
插件启动后会创建并使用以下默认角色 / Track:
|
|
72
|
+
|
|
73
|
+
### 默认角色
|
|
74
|
+
|
|
75
|
+
- `group:default`:默认角色, 所有用户默认继承
|
|
76
|
+
|
|
77
|
+
### 内置权限角色
|
|
78
|
+
|
|
79
|
+
- `group:authority.1` — `Authority 1`
|
|
80
|
+
- `group:authority.2` — `Authority 2`
|
|
81
|
+
- `group:authority.3` — `Authority 3`
|
|
82
|
+
- `group:authority.4` — `Authority 4`
|
|
83
|
+
- `group:authority.5` — `Authority 5`
|
|
84
|
+
|
|
85
|
+
### 内置 Track
|
|
86
|
+
|
|
87
|
+
- `authority` — `Authority Track`
|
|
88
|
+
|
|
89
|
+
其等级名称依次为:
|
|
90
|
+
|
|
91
|
+
1. `member`
|
|
92
|
+
2. `advanced-member`
|
|
93
|
+
3. `admin`
|
|
94
|
+
4. `senior-admin`
|
|
95
|
+
5. `superuser`
|
|
96
|
+
|
|
97
|
+
插件会在启动时建立如下继承关系:
|
|
98
|
+
|
|
99
|
+
```text
|
|
100
|
+
AUTH_2 -> AUTH_1
|
|
101
|
+
AUTH_3 -> AUTH_2
|
|
102
|
+
AUTH_4 -> AUTH_3
|
|
103
|
+
AUTH_5 -> AUTH_4
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
并将 `authority` Track 与这些权限角色关联起来。
|
|
107
|
+
|
|
108
|
+
## 内置指令
|
|
109
|
+
|
|
110
|
+
以下指令默认都挂在 `/permission` 下(实际前缀取决于 `Config.command`)。
|
|
111
|
+
|
|
112
|
+
### 用户权限
|
|
113
|
+
|
|
114
|
+
- `/permission user [@用户] list`
|
|
115
|
+
- 查看用户权限
|
|
116
|
+
|
|
117
|
+
- `/permission user [@用户] set <permission> <state>`
|
|
118
|
+
- 设置权限状态
|
|
119
|
+
- `state` 支持:
|
|
120
|
+
- `true` / `false`
|
|
121
|
+
- `Permission.parse(...)` 支持的权限表达式
|
|
122
|
+
- `chmod` 风格快捷写法
|
|
123
|
+
|
|
124
|
+
- `/permission user [@用户] get <permission>`
|
|
125
|
+
- 查询单个权限状态
|
|
126
|
+
|
|
127
|
+
- `/permission user [@用户] inherit <role> [--cancel]`
|
|
128
|
+
- 继承 / 取消继承某个角色
|
|
129
|
+
|
|
130
|
+
- `/permission user [@用户] promote <track>`
|
|
131
|
+
- 提升指定 Track 的等级
|
|
132
|
+
|
|
133
|
+
- `/permission user [@用户] demote <track>`
|
|
134
|
+
- 降低指定 Track 的等级
|
|
135
|
+
|
|
136
|
+
### Track 管理
|
|
137
|
+
|
|
138
|
+
- `/permission track <track> info`
|
|
139
|
+
- 查看 Track 信息
|
|
140
|
+
|
|
141
|
+
- `/permission track <track> append <role>`
|
|
142
|
+
- 向 Track 末尾添加等级
|
|
143
|
+
|
|
144
|
+
- `/permission track <track> insert <role> <index>`
|
|
145
|
+
- 在指定位置插入等级
|
|
146
|
+
|
|
147
|
+
- `/permission track <track> remove <role>`
|
|
148
|
+
- 从 Track 移除等级
|
|
149
|
+
|
|
150
|
+
- `/permission track <track> clear`
|
|
151
|
+
- 清空 Track 等级
|
|
152
|
+
|
|
153
|
+
- `/permission track <track> rename <name>`
|
|
154
|
+
- 重命名 Track
|
|
155
|
+
|
|
156
|
+
- `/permission listtrack`
|
|
157
|
+
- 列出所有 Track
|
|
158
|
+
|
|
159
|
+
- `/permission createtrack <track> [name]`
|
|
160
|
+
- 创建 Track
|
|
161
|
+
|
|
162
|
+
- `/permission deletetrack <track>`
|
|
163
|
+
- 删除 Track
|
|
164
|
+
|
|
165
|
+
### `chmod` 快捷写法
|
|
166
|
+
|
|
167
|
+
插件内置了一个快捷指令:
|
|
168
|
+
|
|
169
|
+
```text
|
|
170
|
+
/chmod <expr> <permission>
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
它会被自动转换为:
|
|
174
|
+
|
|
175
|
+
```text
|
|
176
|
+
/permission user set <permission> <expr>
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
## 权限点
|
|
180
|
+
|
|
181
|
+
插件自身的管理指令也有权限控制,主要权限点如下:
|
|
182
|
+
|
|
183
|
+
- `command.permission.list`
|
|
184
|
+
- `command.permission.set`
|
|
185
|
+
- `command.permission.get`
|
|
186
|
+
- `command.permission.inherit`
|
|
187
|
+
- `command.permission.promote`
|
|
188
|
+
- `command.permission.demote`
|
|
189
|
+
- `command.permission.listtrack`
|
|
190
|
+
- `command.permission.createtrack`
|
|
191
|
+
- `command.permission.deletetrack`
|
|
192
|
+
- `command.permission.track.info`
|
|
193
|
+
- `command.permission.track.append`
|
|
194
|
+
- `command.permission.track.insert`
|
|
195
|
+
- `command.permission.track.remove`
|
|
196
|
+
- `command.permission.track.clear`
|
|
197
|
+
- `command.permission.track.rename`
|
|
198
|
+
|
|
199
|
+
默认预设权限:
|
|
200
|
+
|
|
201
|
+
- `group:default` 对 `command.permission` 拥有 `vma`
|
|
202
|
+
- `AUTH_1` 对 `command.permission.*` 拥有 `VISIT`
|
|
203
|
+
- `AUTH_3` 对 `command.permission.*` 拥有 `VISIT | AVAILABLE`
|
|
204
|
+
|
|
205
|
+
## 开发者接口
|
|
206
|
+
|
|
207
|
+
如果你想在自己的插件中复用这套权限系统,可以直接导入下列对象:
|
|
208
|
+
|
|
209
|
+
```python
|
|
210
|
+
from entari_plugin_permission import (
|
|
211
|
+
system,
|
|
212
|
+
Permission,
|
|
213
|
+
UserOwner,
|
|
214
|
+
check_permission,
|
|
215
|
+
require_permission,
|
|
216
|
+
AUTH_1,
|
|
217
|
+
AUTH_2,
|
|
218
|
+
AUTH_3,
|
|
219
|
+
AUTH_4,
|
|
220
|
+
AUTH_5,
|
|
221
|
+
AUTHORITY,
|
|
222
|
+
)
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
### `system`
|
|
226
|
+
|
|
227
|
+
`system` 是权限系统的核心实例,已经集成:
|
|
228
|
+
|
|
229
|
+
- `AsyncPermissionService`
|
|
230
|
+
- `AsyncPermissionExecutor`
|
|
231
|
+
- ORM 持久化存储
|
|
232
|
+
|
|
233
|
+
常用能力包括:
|
|
234
|
+
|
|
235
|
+
- `system.pre_role(...)`
|
|
236
|
+
- `system.pre_track(...)`
|
|
237
|
+
- `system.pre_assign(...)`
|
|
238
|
+
- `system.attach(...)`
|
|
239
|
+
- `system.get_or_create_user(...)`
|
|
240
|
+
- `system.get_role(...)`
|
|
241
|
+
- `system.get_track(...)`
|
|
242
|
+
|
|
243
|
+
### `check_permission(...)`
|
|
244
|
+
|
|
245
|
+
返回一个异步检查函数,可用于 `enter_if`、`Depends` 等场景。
|
|
246
|
+
|
|
247
|
+
```python
|
|
248
|
+
from entari_plugin_permission import check_permission
|
|
249
|
+
|
|
250
|
+
|
|
251
|
+
checker = check_permission("command.foo", prompt=True)
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
### `require_permission(...)`
|
|
255
|
+
|
|
256
|
+
这是 `Propagator` 封装,适合直接挂到 `propagate(...)` 上:
|
|
257
|
+
|
|
258
|
+
```python
|
|
259
|
+
from arclet.letoderea import propagate
|
|
260
|
+
from entari_plugin_permission import require_permission
|
|
261
|
+
|
|
262
|
+
|
|
263
|
+
@propagate(require_permission("command.foo", prompt=True))
|
|
264
|
+
async def handler() -> None:
|
|
265
|
+
...
|
|
266
|
+
```
|
|
267
|
+
|
|
268
|
+
### `UserOwner`
|
|
269
|
+
|
|
270
|
+
`UserOwner` 是一个可直接注入的类型别名,会自动从当前会话取出对应的 Cithun `User` 对象。
|
|
271
|
+
|
|
272
|
+
## 自定义资源权限附加
|
|
273
|
+
|
|
274
|
+
你可以通过 `system.attach(...)` 为某类资源动态追加权限:
|
|
275
|
+
|
|
276
|
+
- `pattern` 可以是字符串
|
|
277
|
+
- 精确匹配
|
|
278
|
+
- glob 通配:`*`、`?`、`[]`
|
|
279
|
+
- 也可以是自定义谓词函数 `Callable[[str], bool]`
|
|
280
|
+
|
|
281
|
+
回调返回值支持:
|
|
282
|
+
|
|
283
|
+
- 直接返回 `Permission`:表示追加允许权限
|
|
284
|
+
- 返回 `(Permission, "+")`:追加
|
|
285
|
+
- 返回 `(Permission, "-")`:移除
|
|
286
|
+
- 返回 `(Permission, "=")`:覆盖
|
|
287
|
+
|
|
288
|
+
## 事件
|
|
289
|
+
|
|
290
|
+
插件定义了一个事件:
|
|
291
|
+
|
|
292
|
+
- `UserSetTrackLevel`
|
|
293
|
+
|
|
294
|
+
当用户 Track 等级变化时会发布该事件,适合做外部同步或审计。
|
|
295
|
+
|
|
296
|
+
## 示例
|
|
297
|
+
|
|
298
|
+
仓库里的 `example_plugin.py` 展示了一个完整用法:
|
|
299
|
+
|
|
300
|
+
- 定义了一个自定义权限 `command.mask`
|
|
301
|
+
- 创建了 `mask_track`
|
|
302
|
+
- 通过 `system.pre_assign(...)` 给不同权限角色分配该权限
|
|
303
|
+
- 在指令执行前使用 `require_permission(...)` 做校验
|
|
304
|
+
|
|
305
|
+
如果你需要在自己的插件里增加权限控制,通常可以按下面的模式写:
|
|
306
|
+
|
|
307
|
+
```python
|
|
308
|
+
from arclet.cithun import Permission
|
|
309
|
+
from entari_plugin_permission import AUTH_1, AUTH_3, require_permission, system
|
|
310
|
+
|
|
311
|
+
|
|
312
|
+
system.pre_assign(system.default_role, "command.xxx", Permission("v-a"))
|
|
313
|
+
system.pre_assign(AUTH_1, "command.xxx", Permission.VISIT)
|
|
314
|
+
system.pre_assign(AUTH_3, "command.xxx", Permission.VISIT | Permission.AVAILABLE)
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
## 许可证
|
|
318
|
+
|
|
319
|
+
MIT
|
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
# entari-plugin-permission
|
|
2
|
+
|
|
3
|
+
基于 [`arclet-cithun`](https://github.com/ArcletProject/Arclet) 的 Entari 权限插件。
|
|
4
|
+
|
|
5
|
+
它提供了一套可持久化的权限、角色、继承链与 Track(权限路径)管理能力,并为 Entari 指令系统提供了现成的权限校验与管理命令。
|
|
6
|
+
|
|
7
|
+
## 功能特性
|
|
8
|
+
|
|
9
|
+
- 用户 / 角色权限管理,数据持久化到数据库
|
|
10
|
+
- 角色继承与用户继承角色
|
|
11
|
+
- Track(权限路径)管理:创建、删除、查看、增删等级、重命名、清空
|
|
12
|
+
- 支持 `chmod` 风格的权限设置快捷写法
|
|
13
|
+
- 支持按资源 ID 注册自定义权限附加策略(`attach`)
|
|
14
|
+
- 提供可直接复用的权限校验工具:`check_permission` / `require_permission`
|
|
15
|
+
- 内置 Entari 管理指令
|
|
16
|
+
- 自动同步用户 `authority` 到内置 `authority` Track
|
|
17
|
+
|
|
18
|
+
## 依赖环境
|
|
19
|
+
|
|
20
|
+
- Python `>= 3.10`
|
|
21
|
+
- `arclet-entari >= 0.18.0rc2`
|
|
22
|
+
- `arclet-cithun >= 1.4.0, < 1.5.0`
|
|
23
|
+
- `entari-plugin-user >= 0.1.6`
|
|
24
|
+
- `entari-plugin-database >= 0.3.1`
|
|
25
|
+
- 需要启用数据库服务:`database/sqlalchemy`
|
|
26
|
+
|
|
27
|
+
## 安装
|
|
28
|
+
|
|
29
|
+
```shell
|
|
30
|
+
pdm add entari-plugin-permission
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## 配置
|
|
34
|
+
|
|
35
|
+
### 指令前缀
|
|
36
|
+
|
|
37
|
+
插件默认指令名为 `permission`,可通过配置修改:
|
|
38
|
+
|
|
39
|
+
```yaml
|
|
40
|
+
# entari.yml
|
|
41
|
+
plugins:
|
|
42
|
+
permission:
|
|
43
|
+
command: permission
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
也就是说,默认管理指令前缀为:
|
|
47
|
+
|
|
48
|
+
```text
|
|
49
|
+
/permission
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
如果你把 `command` 改成别的值,那么所有子指令前缀也会随之改变。
|
|
53
|
+
|
|
54
|
+
## 内置权限模型
|
|
55
|
+
|
|
56
|
+
插件启动后会创建并使用以下默认角色 / Track:
|
|
57
|
+
|
|
58
|
+
### 默认角色
|
|
59
|
+
|
|
60
|
+
- `group:default`:默认角色, 所有用户默认继承
|
|
61
|
+
|
|
62
|
+
### 内置权限角色
|
|
63
|
+
|
|
64
|
+
- `group:authority.1` — `Authority 1`
|
|
65
|
+
- `group:authority.2` — `Authority 2`
|
|
66
|
+
- `group:authority.3` — `Authority 3`
|
|
67
|
+
- `group:authority.4` — `Authority 4`
|
|
68
|
+
- `group:authority.5` — `Authority 5`
|
|
69
|
+
|
|
70
|
+
### 内置 Track
|
|
71
|
+
|
|
72
|
+
- `authority` — `Authority Track`
|
|
73
|
+
|
|
74
|
+
其等级名称依次为:
|
|
75
|
+
|
|
76
|
+
1. `member`
|
|
77
|
+
2. `advanced-member`
|
|
78
|
+
3. `admin`
|
|
79
|
+
4. `senior-admin`
|
|
80
|
+
5. `superuser`
|
|
81
|
+
|
|
82
|
+
插件会在启动时建立如下继承关系:
|
|
83
|
+
|
|
84
|
+
```text
|
|
85
|
+
AUTH_2 -> AUTH_1
|
|
86
|
+
AUTH_3 -> AUTH_2
|
|
87
|
+
AUTH_4 -> AUTH_3
|
|
88
|
+
AUTH_5 -> AUTH_4
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
并将 `authority` Track 与这些权限角色关联起来。
|
|
92
|
+
|
|
93
|
+
## 内置指令
|
|
94
|
+
|
|
95
|
+
以下指令默认都挂在 `/permission` 下(实际前缀取决于 `Config.command`)。
|
|
96
|
+
|
|
97
|
+
### 用户权限
|
|
98
|
+
|
|
99
|
+
- `/permission user [@用户] list`
|
|
100
|
+
- 查看用户权限
|
|
101
|
+
|
|
102
|
+
- `/permission user [@用户] set <permission> <state>`
|
|
103
|
+
- 设置权限状态
|
|
104
|
+
- `state` 支持:
|
|
105
|
+
- `true` / `false`
|
|
106
|
+
- `Permission.parse(...)` 支持的权限表达式
|
|
107
|
+
- `chmod` 风格快捷写法
|
|
108
|
+
|
|
109
|
+
- `/permission user [@用户] get <permission>`
|
|
110
|
+
- 查询单个权限状态
|
|
111
|
+
|
|
112
|
+
- `/permission user [@用户] inherit <role> [--cancel]`
|
|
113
|
+
- 继承 / 取消继承某个角色
|
|
114
|
+
|
|
115
|
+
- `/permission user [@用户] promote <track>`
|
|
116
|
+
- 提升指定 Track 的等级
|
|
117
|
+
|
|
118
|
+
- `/permission user [@用户] demote <track>`
|
|
119
|
+
- 降低指定 Track 的等级
|
|
120
|
+
|
|
121
|
+
### Track 管理
|
|
122
|
+
|
|
123
|
+
- `/permission track <track> info`
|
|
124
|
+
- 查看 Track 信息
|
|
125
|
+
|
|
126
|
+
- `/permission track <track> append <role>`
|
|
127
|
+
- 向 Track 末尾添加等级
|
|
128
|
+
|
|
129
|
+
- `/permission track <track> insert <role> <index>`
|
|
130
|
+
- 在指定位置插入等级
|
|
131
|
+
|
|
132
|
+
- `/permission track <track> remove <role>`
|
|
133
|
+
- 从 Track 移除等级
|
|
134
|
+
|
|
135
|
+
- `/permission track <track> clear`
|
|
136
|
+
- 清空 Track 等级
|
|
137
|
+
|
|
138
|
+
- `/permission track <track> rename <name>`
|
|
139
|
+
- 重命名 Track
|
|
140
|
+
|
|
141
|
+
- `/permission listtrack`
|
|
142
|
+
- 列出所有 Track
|
|
143
|
+
|
|
144
|
+
- `/permission createtrack <track> [name]`
|
|
145
|
+
- 创建 Track
|
|
146
|
+
|
|
147
|
+
- `/permission deletetrack <track>`
|
|
148
|
+
- 删除 Track
|
|
149
|
+
|
|
150
|
+
### `chmod` 快捷写法
|
|
151
|
+
|
|
152
|
+
插件内置了一个快捷指令:
|
|
153
|
+
|
|
154
|
+
```text
|
|
155
|
+
/chmod <expr> <permission>
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
它会被自动转换为:
|
|
159
|
+
|
|
160
|
+
```text
|
|
161
|
+
/permission user set <permission> <expr>
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## 权限点
|
|
165
|
+
|
|
166
|
+
插件自身的管理指令也有权限控制,主要权限点如下:
|
|
167
|
+
|
|
168
|
+
- `command.permission.list`
|
|
169
|
+
- `command.permission.set`
|
|
170
|
+
- `command.permission.get`
|
|
171
|
+
- `command.permission.inherit`
|
|
172
|
+
- `command.permission.promote`
|
|
173
|
+
- `command.permission.demote`
|
|
174
|
+
- `command.permission.listtrack`
|
|
175
|
+
- `command.permission.createtrack`
|
|
176
|
+
- `command.permission.deletetrack`
|
|
177
|
+
- `command.permission.track.info`
|
|
178
|
+
- `command.permission.track.append`
|
|
179
|
+
- `command.permission.track.insert`
|
|
180
|
+
- `command.permission.track.remove`
|
|
181
|
+
- `command.permission.track.clear`
|
|
182
|
+
- `command.permission.track.rename`
|
|
183
|
+
|
|
184
|
+
默认预设权限:
|
|
185
|
+
|
|
186
|
+
- `group:default` 对 `command.permission` 拥有 `vma`
|
|
187
|
+
- `AUTH_1` 对 `command.permission.*` 拥有 `VISIT`
|
|
188
|
+
- `AUTH_3` 对 `command.permission.*` 拥有 `VISIT | AVAILABLE`
|
|
189
|
+
|
|
190
|
+
## 开发者接口
|
|
191
|
+
|
|
192
|
+
如果你想在自己的插件中复用这套权限系统,可以直接导入下列对象:
|
|
193
|
+
|
|
194
|
+
```python
|
|
195
|
+
from entari_plugin_permission import (
|
|
196
|
+
system,
|
|
197
|
+
Permission,
|
|
198
|
+
UserOwner,
|
|
199
|
+
check_permission,
|
|
200
|
+
require_permission,
|
|
201
|
+
AUTH_1,
|
|
202
|
+
AUTH_2,
|
|
203
|
+
AUTH_3,
|
|
204
|
+
AUTH_4,
|
|
205
|
+
AUTH_5,
|
|
206
|
+
AUTHORITY,
|
|
207
|
+
)
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### `system`
|
|
211
|
+
|
|
212
|
+
`system` 是权限系统的核心实例,已经集成:
|
|
213
|
+
|
|
214
|
+
- `AsyncPermissionService`
|
|
215
|
+
- `AsyncPermissionExecutor`
|
|
216
|
+
- ORM 持久化存储
|
|
217
|
+
|
|
218
|
+
常用能力包括:
|
|
219
|
+
|
|
220
|
+
- `system.pre_role(...)`
|
|
221
|
+
- `system.pre_track(...)`
|
|
222
|
+
- `system.pre_assign(...)`
|
|
223
|
+
- `system.attach(...)`
|
|
224
|
+
- `system.get_or_create_user(...)`
|
|
225
|
+
- `system.get_role(...)`
|
|
226
|
+
- `system.get_track(...)`
|
|
227
|
+
|
|
228
|
+
### `check_permission(...)`
|
|
229
|
+
|
|
230
|
+
返回一个异步检查函数,可用于 `enter_if`、`Depends` 等场景。
|
|
231
|
+
|
|
232
|
+
```python
|
|
233
|
+
from entari_plugin_permission import check_permission
|
|
234
|
+
|
|
235
|
+
|
|
236
|
+
checker = check_permission("command.foo", prompt=True)
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
### `require_permission(...)`
|
|
240
|
+
|
|
241
|
+
这是 `Propagator` 封装,适合直接挂到 `propagate(...)` 上:
|
|
242
|
+
|
|
243
|
+
```python
|
|
244
|
+
from arclet.letoderea import propagate
|
|
245
|
+
from entari_plugin_permission import require_permission
|
|
246
|
+
|
|
247
|
+
|
|
248
|
+
@propagate(require_permission("command.foo", prompt=True))
|
|
249
|
+
async def handler() -> None:
|
|
250
|
+
...
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
### `UserOwner`
|
|
254
|
+
|
|
255
|
+
`UserOwner` 是一个可直接注入的类型别名,会自动从当前会话取出对应的 Cithun `User` 对象。
|
|
256
|
+
|
|
257
|
+
## 自定义资源权限附加
|
|
258
|
+
|
|
259
|
+
你可以通过 `system.attach(...)` 为某类资源动态追加权限:
|
|
260
|
+
|
|
261
|
+
- `pattern` 可以是字符串
|
|
262
|
+
- 精确匹配
|
|
263
|
+
- glob 通配:`*`、`?`、`[]`
|
|
264
|
+
- 也可以是自定义谓词函数 `Callable[[str], bool]`
|
|
265
|
+
|
|
266
|
+
回调返回值支持:
|
|
267
|
+
|
|
268
|
+
- 直接返回 `Permission`:表示追加允许权限
|
|
269
|
+
- 返回 `(Permission, "+")`:追加
|
|
270
|
+
- 返回 `(Permission, "-")`:移除
|
|
271
|
+
- 返回 `(Permission, "=")`:覆盖
|
|
272
|
+
|
|
273
|
+
## 事件
|
|
274
|
+
|
|
275
|
+
插件定义了一个事件:
|
|
276
|
+
|
|
277
|
+
- `UserSetTrackLevel`
|
|
278
|
+
|
|
279
|
+
当用户 Track 等级变化时会发布该事件,适合做外部同步或审计。
|
|
280
|
+
|
|
281
|
+
## 示例
|
|
282
|
+
|
|
283
|
+
仓库里的 `example_plugin.py` 展示了一个完整用法:
|
|
284
|
+
|
|
285
|
+
- 定义了一个自定义权限 `command.mask`
|
|
286
|
+
- 创建了 `mask_track`
|
|
287
|
+
- 通过 `system.pre_assign(...)` 给不同权限角色分配该权限
|
|
288
|
+
- 在指令执行前使用 `require_permission(...)` 做校验
|
|
289
|
+
|
|
290
|
+
如果你需要在自己的插件里增加权限控制,通常可以按下面的模式写:
|
|
291
|
+
|
|
292
|
+
```python
|
|
293
|
+
from arclet.cithun import Permission
|
|
294
|
+
from entari_plugin_permission import AUTH_1, AUTH_3, require_permission, system
|
|
295
|
+
|
|
296
|
+
|
|
297
|
+
system.pre_assign(system.default_role, "command.xxx", Permission("v-a"))
|
|
298
|
+
system.pre_assign(AUTH_1, "command.xxx", Permission.VISIT)
|
|
299
|
+
system.pre_assign(AUTH_3, "command.xxx", Permission.VISIT | Permission.AVAILABLE)
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
## 许可证
|
|
303
|
+
|
|
304
|
+
MIT
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "entari-plugin-permission"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
description = "Permission system for Entari based on Cithun"
|
|
5
|
+
authors = [
|
|
6
|
+
{"name" = "RF-Tar-Railt", "email" = "rf_tar_railt@qq.com"}
|
|
7
|
+
]
|
|
8
|
+
dependencies = [
|
|
9
|
+
"arclet-entari>=0.18.0rc2",
|
|
10
|
+
"arclet-cithun<1.5.0,>=1.4.0",
|
|
11
|
+
"entari-plugin-user>=0.1.6",
|
|
12
|
+
"entari-plugin-database>=0.3.1",
|
|
13
|
+
]
|
|
14
|
+
requires-python = ">=3.10"
|
|
15
|
+
readme = "README.md"
|
|
16
|
+
license = {"text" = "MIT"}
|
|
17
|
+
|
|
18
|
+
[dependency-groups]
|
|
19
|
+
dev = [
|
|
20
|
+
"arclet-entari[yaml,cron,reload,dotenv] >= 0.17.4",
|
|
21
|
+
"satori-python-adapter-onebot11>=0.4.4",
|
|
22
|
+
"entari-plugin-server>=0.7.0",
|
|
23
|
+
]
|