64 lines
2.0 KiB
Python
64 lines
2.0 KiB
Python
"""
|
|
set_role_perm.py — 为指定角色添加路径权限(参考 Sage 同款脚本)
|
|
用法: python set_role_perm.py <role> <path>
|
|
role: any / logined / anonymous / orgtypeid.rolename
|
|
path: /rbac/user/login.ui 或 /bricks/** (支持 % 和 ** 通配符)
|
|
"""
|
|
import os, sys, asyncio
|
|
sys.path[:0] = [os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'pkgs', p)
|
|
for p in ['apppublic', 'sqlor', 'ahserver']]
|
|
|
|
from sqlor.dbpools import DBPools
|
|
from appPublic.jsonConfig import getConfig
|
|
from appPublic.uniqueID import getID
|
|
|
|
|
|
async def add_roleperm(sor, roleid, permid):
|
|
ns = {'roleid': roleid, 'permid': permid}
|
|
recs = await sor.R('rolepermission', ns.copy())
|
|
if recs:
|
|
print(f' {roleid}, {permid} — 已存在, 跳过')
|
|
return
|
|
ns['id'] = getID()
|
|
await sor.C('rolepermission', ns)
|
|
print(f' {roleid}, {permid} — 已添加')
|
|
|
|
|
|
async def main():
|
|
config = getConfig('.')
|
|
db = DBPools(config.databases)
|
|
|
|
if len(sys.argv) < 3:
|
|
print(f'用法: {sys.argv[0]} <role> <path>')
|
|
sys.exit(1)
|
|
|
|
role = sys.argv[1]
|
|
path = sys.argv[2]
|
|
|
|
async with db.sqlorContext('pccs') as sor:
|
|
# 查询 permission: 支持通配符 ** 和 %
|
|
perms = None
|
|
if '%' in path or '**' in path:
|
|
like_path = path.replace('**', '%')
|
|
perms = await sor.sqlExe(
|
|
"SELECT * FROM permission WHERE path LIKE ${path}$",
|
|
{'path': like_path}
|
|
)
|
|
else:
|
|
perms = await sor.R('permission', {'path': path})
|
|
|
|
# 如果 permission 不存在,自动创建
|
|
if not perms:
|
|
from appPublic.dictObject import DictObject
|
|
perms = [DictObject(id=getID(), path=path)]
|
|
await sor.C('permission', perms[0].copy())
|
|
print(f' permission 已创建: {path}')
|
|
|
|
# 添加角色权限
|
|
for p in perms:
|
|
await add_roleperm(sor, role, p.id)
|
|
|
|
|
|
if __name__ == '__main__':
|
|
asyncio.run(main())
|