feat: 新增create_user_apikey函数

- 为已有rbac用户创建dapi apikey
- 支持幂等操作(已存在则返回现有apikey)
- 通过load_dapi注册到ServerEnv供外部调用
This commit is contained in:
yumoqing 2026-05-11 15:11:09 +08:00
parent 89a5cf65a3
commit 27794d3d25
2 changed files with 66 additions and 1 deletions

View File

@ -161,6 +161,70 @@ async def add_apikey(sor, dappid, dorgid, duserid, orgid, userid):
await sor.C('downapikey', d)
return apikey
async def create_user_apikey(sor, dappid, user_id, user_orgid, **kwargs):
"""为已有用户创建dapi apikey
Args:
sor: sqlor连接对象
dappid: dapi应用ID
user_id: rbac用户ID
user_orgid: 用户机构ID
**kwargs: 可选字段username, name, email等users表字段
Returns:
dict: {'status': 'success'|'error', 'apikey': str, 'message': str}
"""
try:
# 检查apikey是否已存在
existing = await sor.R('downapikey', {
'dappid': dappid,
'duserid': user_id,
'dorgid': user_orgid
})
if existing:
# 返回现有apikey
f = get_serverenv('password_decode')
apikey = f(existing[0].apikey)
return {
'status': 'success',
'apikey': apikey,
'user_id': user_id,
'message': '用户apikey已存在'
}
# 创建新apikey
apikey_id = getID()
apikey_value = getID()
ns = {
'id': apikey_id,
'dappid': dappid,
'dorgid': user_orgid,
'duserid': user_id,
'orgid': user_orgid,
'userid': user_id,
'apikey': password_encode(apikey_value),
'enabled': '1',
'created_at': curDateString(),
'expires_at': '9999-12-31'
}
await sor.C('downapikey', ns)
return {
'status': 'success',
'apikey': apikey_value,
'user_id': user_id,
'message': 'apikey创建成功'
}
except Exception as e:
exception(f'create_user_apikey error: {e}')
return {
'status': 'error',
'message': f'创建apikey失败: {str(e)}'
}
async def sync_user(request, params_kw, *args, **kw):
dappid = params_kw.dappid
db = DBPools()

View File

@ -1,4 +1,4 @@
from dapi.dapi import sync_user, bearer_auth, deerer_auth, deerer_user, apikey_user
from dapi.dapi import sync_user, bearer_auth, deerer_auth, deerer_user, apikey_user, create_user_apikey
from ahserver.serverenv import ServerEnv
from rbac.check_perm import register_auth_method
@ -7,6 +7,7 @@ def load_dapi():
env.sync_user = sync_user
env.deerer_user = deerer_user
env.apikey_user = apikey_user
env.create_user_apikey = create_user_apikey
register_auth_method('Bearer ', bearer_auth)
register_auth_method('Deerer ', deerer_auth)