""" set_role_perm.py — 为指定角色添加路径权限(参考 Sage 同款脚本) 用法: python set_role_perm.py 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]} ') 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())