This commit is contained in:
yumoqing 2024-11-26 14:42:14 +08:00
parent bfedcb2977
commit 1cbe90f898
4 changed files with 53 additions and 38 deletions

View File

@ -40,13 +40,13 @@ def get_apikey_from_token(token):
except:
return None
async def get_user_roles():
userid = await get_user()
async def get_user_roles(userid):
sql = "select b.name from userrole a, role b where a.userid=${userid}$ and a.roleid = b.id"
db = DBPools()
roles = []
dbname = await get_dbname()
async with db.sqlorContext(dbname) as sor:
recs = sor.sqlExe(sql, {'userid':userid})
recs = await sor.sqlExe(sql, {'userid':userid})
if len(recs) < 1:
return roles
for r in recs:
@ -115,15 +115,15 @@ async def getAuthenticationUserid(sor, request):
return None
return recs[0].userid
async def objcheckperm(obj, userid, path, request):
async def objcheckperm(obj, request, userid, path):
debug(f'check permission: {userid=}, {path=}')
sql = """select distinct a.*, c.userid from
(select id, path from permission where path=${path}$ and del_flg='0') a
(select id, path from permission where path=${path}$) a
right join
rolepermission b on a.id = b.permid
right join userrole c on b.roleid = c.roleid
where c.userid = ${userid}$
and b.del_flg='0'
and c.del_flg='0'"""
"""
rf = RegisterFunction()
dbname = await rf.exe('get_module_dbname', 'rbac')
@ -134,7 +134,7 @@ and c.del_flg='0'"""
debug(f'{path=} not found in permission, can access')
return True
if userid is None:
userid = await getAPIkeyUserid(sor, request)
userid = await getAuthenticationUserid(sor, request)
if userid is None:
debug(f'{userid=} is None, can not access {path=}')
return False

View File

@ -1,5 +1,7 @@
import os
import sys
import argparse
from traceback import format_exc
import asyncio
from appPublic.uniqueID import getID
@ -10,6 +12,7 @@ from appPublic.folderUtils import listFile
from appPublic.registerfunction import RegisterFunction
from sqlor.dbpools import DBPools
from rbac.check_perm import mypassword
databases = {
"sage":{
"driver":"aiomysql",
@ -38,6 +41,8 @@ async def insert_perm(path):
av_folders = [
'/index.ui',
'/user.ui',
'/menu.ui',
'/get_code.dspy',
'/top.ui',
'/center',
'/bottom.ui',
@ -64,6 +69,7 @@ rbac_tables = [
role_perms = {
'superuser': [
'/get_code.dspy',
'/rbac/add_adminuser.ui',
'/rbac/add_adminuser.dspy',
'/rbac/role/index.ui',
@ -96,17 +102,19 @@ role_perms = {
]
}
async def init_perms(sor):
for rn, pths in role_perms.items():
roles = await sor.sqlExe('select * from role where name=${rn}$', {'rn':rn})
if len(roles) == 0:
continue
for p in pths:
perms = await sor.sqlExe('select * from permission where path=${p}$', {'p':p})
if len(perms):
await sor.C('rolepermission', {'id':getID(),
'roleid':roles[0].id,
'permid':perms[0].id})
async def init_perms():
db = DBPools()
async with db.sqlorContext('sage') as sor:
for rn, pths in role_perms.items():
roles = await sor.sqlExe('select * from role where name=${rn}$', {'rn':rn})
if len(roles) == 0:
continue
for p in pths:
perms = await sor.sqlExe('select * from permission where path=${p}$', {'p':p})
if len(perms):
await sor.C('rolepermission', {'id':getID(),
'roleid':roles[0].id,
'permid':perms[0].id})
async def init_rbac(passwd):
db = DBPools()
@ -137,10 +145,9 @@ async def init_rbac(passwd):
'roleid':roleid
}
await sor.C('userrole', ns1)
await init_perms(sor)
async def add_permissions():
root = os.path.abspath('../wwwroot')
async def add_permissions(workdir):
root = os.path.join(workdir, 'wwwroot')
for f in listFile(root, rescursive=True):
cnt = len(root)
pth = f[cnt:]
@ -153,14 +160,22 @@ async def add_permissions():
if act:
await insert_perm(pth)
async def main(passwd):
await add_permissions()
async def main(workdir, passwd):
await add_permissions(workdir)
await init_rbac(passwd)
if __name__ == '__main__':
if len(sys.argv) < 2:
print(f'Usage:\n{sys.argv[0]} super_user_passwd\n')
sys.exit(1)
supassword = sys.argv[1]
DBPools(databases)
asyncio.get_event_loop().run_until_complete(main(supassword))
await init_perms()
if __name__ == '__main__':
parser = argparse.ArgumentParser(prog='RBAC init')
parser.add_argument('-w', '--workdir')
parser.add_argument('password')
args = parser.parse_args()
if args.password is None:
parser.usage()
sys.exit(1)
print(f'{args=}')
config = getConfig(args.workdir, {'workdir':args.workdir})
supassword = mypassword(args.password)
DBPools(config.databases)
asyncio.get_event_loop().run_until_complete(main(args.workdir, supassword))

View File

@ -1,11 +1,11 @@
username = params_kw.get('username')
passwd = params_kw.get('password')
passwd = params_kw.get('passwd')
if not passwd:
return Error(title='Login failed', message='Password is required')
return UiError(title='Login failed', message='Password is required')
passwd = password(passwd)
rzt = await check_user_password(username, passwd):
rzt = await check_user_password(request, username, passwd)
if rzt:
return Message(title='Logined', message=f'Welcome back {get_usernme()}')
return Error(title='login failed', message='user and password mismatch')
return UiMessage(title='Logined', message=f'Welcome back ')
return UiError(title='login failed', message='user and password mismatch')

View File

@ -4,8 +4,8 @@
"options":{
"auto_open":true,
"anthor":"cc",
"width":"70%",
"height":"70%"
"cwidth":20,
"cheight":"14"
},
"subwidgets":[
{