登录接口改造

This commit is contained in:
ping 2026-07-16 11:28:57 +08:00
parent dd35774400
commit 04321fe6a2
2 changed files with 69 additions and 16 deletions

View File

@ -57,6 +57,21 @@ async def check_wechat_login_status(code):
except Exception as e:
raise e
async def get_login_tenant_orgid(sor, ns):
domain_name = ns.get('domain_name')
if (not domain_name) and ns.get('url_link'):
domain_name = ns.get('url_link').split("//")[1].split("/")[0]
if domain_name:
domain_name = domain_name.strip().replace('https://', '').replace('http://', '').replace('/', '')
if 'localhost' in domain_name:
domain_name = 'dev.opencomputing.cn'
reseller = await sor.R('reseller', {'domain_name': domain_name, 'del_flg': '0'})
if len(reseller) >= 1:
return reseller[0]['orgid']
org = await sor.R('organization', {'org_type': '0', 'del_flg': '0'})
if len(org) >= 1:
return org[0]['id']
return None
async def loginUser(ns):
"""
@ -65,6 +80,9 @@ async def loginUser(ns):
db = DBPools()
async with db.sqlorContext('kboss') as sor:
if ns:
tenant_orgid = await get_login_tenant_orgid(sor, ns)
if not tenant_orgid and ns.get('username') not in ['admin', '开元云(北京)科技有限公司']:
return {'status': False, 'msg': '未找到当前域名所属租户'}
# 处理微信授权后的登录
if ns.get('wechatCode'): # 微信扫码登录后的`code`
wechat_user_info = await check_wechat_login_status(ns.get('wechatCode'))
@ -91,7 +109,8 @@ async def loginUser(ns):
if wechat_user_info:
openid_f = wechat_user_info['openid']
# 查询数据库查看openid是否已绑定账户
userreacs = await sor.R('users', {'wechat_openid': openid_f, 'del_flg': '0'})
wechat_sql = """select * from users where wechat_openid = '%s' and tenant_orgid = '%s' and del_flg = '0' limit 1;""" % (openid_f, tenant_orgid)
userreacs = await sor.sqlExe(wechat_sql, {})
if len(userreacs) >= 1:
# 如果openid绑定了用户, 查找用户名和密码 使用账号密码登录
ns['username'] = userreacs[0]['username']
@ -152,10 +171,12 @@ async def loginUser(ns):
type = 0
if type1 == 1:
# 手机号验证码登录
userreacs = await sor.R('users', {'mobile': ns.get('mobile')})
user_sql = """select * from users where mobile = '%s' and tenant_orgid = '%s' and del_flg = '0' limit 1;""" % (ns.get('mobile'), tenant_orgid)
userreacs = await sor.sqlExe(user_sql, {})
if not userreacs:
userreacs = await sor.R('users', {'username': ns.get('username')})
user_sql = """select * from users where username = '%s' and tenant_orgid = '%s' and del_flg = '0' limit 1;""" % (ns.get('username'), tenant_orgid)
userreacs = await sor.sqlExe(user_sql, {})
# 如果是微信扫码后绑定已有账号
if ns.get('wechat_openid'):
@ -170,14 +191,17 @@ async def loginUser(ns):
else:
ns['password'] = password_encode(ns['password'])
ns['del_flg'] = '0'
userreacs = await sor.R('users', {'username': ns.get('username'), 'password': ns.get('password')})
if ns.get('username') in ['admin', '开元云(北京)科技有限公司']:
userreacs = await sor.R('users', {'username': ns.get('username'), 'password': ns.get('password'), 'del_flg': '0'})
else:
user_sql = """select * from users where username = '%s' and password = '%s' and tenant_orgid = '%s' and del_flg = '0' limit 1;""" % (ns.get('username'), ns.get('password'), tenant_orgid)
userreacs = await sor.sqlExe(user_sql, {})
if len(userreacs) >= 1:
type += 1
await remember_user(userreacs[0]['id'], username=userreacs[0]['username'], userorgid=userreacs[0]['orgid'])
else:
ns['mobile'] = ns['username']
ns.pop('username')
userreacs = await sor.R('users', ns)
user_sql = """select * from users where mobile = '%s' and password = '%s' and tenant_orgid = '%s' and del_flg = '0' limit 1;""" % (ns.get('username'), ns.get('password'), tenant_orgid)
userreacs = await sor.sqlExe(user_sql, {})
if len(userreacs) >= 1:
type += 1
await remember_user(userreacs[0]['id'], username=userreacs[0]['username'], userorgid=userreacs[0]['orgid'])

View File

@ -93,6 +93,22 @@ async def check_login_allowed(user_name):
print("exception:", user_name, e)
return {'status': False, 'msg': '登录操作失败, %s' % str(e)}
async def get_login_tenant_orgid(sor, ns):
domain_name = ns.get('domain_name')
if (not domain_name) and ns.get('url_link'):
domain_name = ns.get('url_link').split("//")[1].split("/")[0]
if domain_name:
domain_name = domain_name.strip().replace('https://', '').replace('http://', '').replace('/', '')
if 'localhost' in domain_name:
domain_name = 'dev.opencomputing.cn'
reseller = await sor.R('reseller', {'domain_name': domain_name, 'del_flg': '0'})
if len(reseller) >= 1:
return reseller[0]['orgid']
org = await sor.R('organization', {'org_type': '0', 'del_flg': '0'})
if len(org) >= 1:
return org[0]['id']
return None
async def logintype(ns):
"""
1、判断用户是否为主级如果在reseller没要找到数据证明就是主级
@ -140,11 +156,16 @@ async def logintype(ns):
async with db.sqlorContext('kboss') as sor:
domain_name = ns.get('domain_name')
tenant_orgid = await get_login_tenant_orgid(sor, ns)
if not tenant_orgid and ns.get('username') != 'admin':
return {'status': False, 'msg': '未找到当前域名所属租户'}
login_name = ns.get('username') or ns.get('mobile') or ''
login_fail_key = '%s:%s' % (tenant_orgid, login_name)
# if domain_name in ['www.opencomputing.cn', 'dev.opencomputing.cn', 'localhost:9527', 'www.ncmatch.cn'] and ns.get('username') not in ['开元云(北京)科技有限公司', 'admin', 'kyy_root', 'kyy_kaiyuan', 'kyacloud', 'kyy_运营', 'kyy_销售', 'kyy_财务', '测试用户', 'kycloud']:
if domain_name in ['www.opencomputing.cn', 'dev.opencomputing.cn', 'localhost:9527', 'www.ncmatch.cn'] and not ns.get('username') and not ns.get('codeid'):
# 登录失败次数限制
login_allowed = await check_login_allowed(ns.get('username'))
login_allowed = await check_login_allowed(login_fail_key)
if not login_allowed.get('status'):
return {'status': False, 'msg': login_allowed.get('msg')}
@ -153,7 +174,8 @@ async def logintype(ns):
'status': False,
'msg': '请输入手机号'
}
real_mobile_li = await sor.R('users', {'username': ns['username']})
real_mobile_sql = """select * from users where username = '%s' and tenant_orgid = '%s' and del_flg = '0' limit 1;""" % (ns.get('username'), tenant_orgid)
real_mobile_li = await sor.sqlExe(real_mobile_sql, {})
if not real_mobile_li:
return {
'status': False,
@ -179,13 +201,14 @@ async def logintype(ns):
}
code = await sor.R('validatecode', {'id': ns.get('codeid'), 'vcode': ns.get('vcode')})
if len(code) < 1:
await handle_login_failed(ns.get('username'))
await handle_login_failed(login_fail_key)
return {'status': False, 'msg': '验证码不正确'}
password = password_encode(ns['password'])
users = await sor.R('users', {'username': ns.get('username'), 'password': password})
users_sql = """select * from users where username = '%s' and password = '%s' and tenant_orgid = '%s' and del_flg = '0' limit 1;""" % (ns.get('username'), password, tenant_orgid)
users = await sor.sqlExe(users_sql, {})
if len(users) < 1:
await handle_login_failed(ns.get('username'))
await handle_login_failed(login_fail_key)
return {"status": False,'msg':'用户名或密码错误'}
return {'status': True}
@ -199,14 +222,20 @@ async def logintype(ns):
return {'status': False, 'msg': '验证码不正确'}
if type == 1:
# 手机号登录
users = await sor.R('users', {'mobile': ns.get('mobile')})
users_sql = """select * from users where mobile = '%s' and tenant_orgid = '%s' and del_flg = '0' limit 1;""" % (ns.get('mobile'), tenant_orgid)
users = await sor.sqlExe(users_sql, {})
if not users:
users = await sor.R('users', {'username': ns.get('username')})
users_sql = """select * from users where username = '%s' and tenant_orgid = '%s' and del_flg = '0' limit 1;""" % (ns.get('username'), tenant_orgid)
users = await sor.sqlExe(users_sql, {})
else:
password = password_encode(ns['password'])
users = await sor.R('users', {'username': ns.get('username'), 'password': password})
if ns.get('username') == 'admin':
users = await sor.R('users', {'username': ns.get('username'), 'password': password})
else:
users_sql = """select * from users where username = '%s' and password = '%s' and tenant_orgid = '%s' and del_flg = '0' limit 1;""" % (ns.get('username'), password, tenant_orgid)
users = await sor.sqlExe(users_sql, {})
if len(users) < 1:
await handle_login_failed(ns.get('username'))
await handle_login_failed(login_fail_key)
return {"status": False,'msg':'用户名或密码错误'}
elif ns.get('username') == "admin":
return {'status': True}