From 04321fe6a29fb139944936451b07ae67338430d0 Mon Sep 17 00:00:00 2001 From: ping <1017253325@qq.com> Date: Thu, 16 Jul 2026 11:28:57 +0800 Subject: [PATCH] =?UTF-8?q?=E7=99=BB=E5=BD=95=E6=8E=A5=E5=8F=A3=E6=94=B9?= =?UTF-8?q?=E9=80=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- b/user/loginUser.dspy | 38 +++++++++++++++++++++++++++------- b/user/logintype.dspy | 47 ++++++++++++++++++++++++++++++++++--------- 2 files changed, 69 insertions(+), 16 deletions(-) diff --git a/b/user/loginUser.dspy b/b/user/loginUser.dspy index 5efdb04..803b154 100644 --- a/b/user/loginUser.dspy +++ b/b/user/loginUser.dspy @@ -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']) diff --git a/b/user/logintype.dspy b/b/user/logintype.dspy index 8151223..a208675 100644 --- a/b/user/logintype.dspy +++ b/b/user/logintype.dspy @@ -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}