77from dash import set_props , dcc
88from flask_login import login_user
99import feffery_antd_components as fac
10- from dash .dependencies import Input , Output , State
1110from flask_principal import identity_changed , Identity
11+ from dash .dependencies import Input , Output , State , ClientsideFunction
1212
1313from server import app , User
1414from models .users import Users
1515from configs import BaseConfig
1616from models .logs import LoginLogs
17+ from utils .crypto_utils import decrypt_password
18+
19+
20+ app .clientside_callback (
21+ # 基于浏览器内置Web Crypto API加密密码
22+ ClientsideFunction (namespace = "clientside_basic" , function_name = "encryptPassword" ),
23+ Output ("login-password-crypto" , "data" ),
24+ Input ("login-password" , "value" ),
25+ State ("login-rsa-pubkey" , "data" ),
26+ )
1727
1828
1929@app .callback (
20- [Output ("login-form" , "helps" ), Output ("login-form" , "validateStatuses" )],
30+ [
31+ Output ("login-user-name-form-item" , "help" ),
32+ Output ("login-password-form-item" , "help" ),
33+ Output ("login-user-name-form-item" , "validateStatus" ),
34+ Output ("login-password-form-item" , "validateStatus" ),
35+ ],
2136 [Input ("login-button" , "nClicks" ), Input ("login-password" , "nSubmit" )],
22- [State ("login-form" , "values" ), State ("login-remember-me" , "checked" )],
37+ [
38+ State ("login-user-name" , "value" ),
39+ State ("login-password-crypto" , "data" ),
40+ State ("login-remember-me" , "checked" ),
41+ ],
2342 running = [
2443 [Output ("login-button" , "loading" ), True , False ],
2544 ],
2645 prevent_initial_call = True ,
2746)
28- def handle_login (nClicks , nSubmit , values , remember_me ):
47+ def handle_login (nClicks , nSubmit , user_name , password_crypto , remember_me ):
2948 """处理用户登录逻辑"""
3049
3150 time .sleep (0.25 )
3251
33- values = values or {}
52+ # 解密前端传输的加密密码
53+ password = decrypt_password (password_crypto )
54+
55+ # 构造兼容原有判断逻辑的表单values
56+ values = {
57+ "login-user-name" : user_name ,
58+ "login-password" : password ,
59+ }
3460
3561 # 提取当前登录行为对应的系统、浏览器信息
3662 user_agent = parse (str (request .user_agent ))
@@ -55,15 +81,11 @@ def handle_login(nClicks, nSubmit, values, remember_me):
5581
5682 return [
5783 # 表单帮助信息
58- {
59- "用户名" : "请输入用户名" if not values .get ("login-user-name" ) else None ,
60- "密码" : "请输入密码" if not values .get ("login-password" ) else None ,
61- },
84+ "请输入用户名" if not values .get ("login-user-name" ) else None ,
85+ "请输入密码" if not values .get ("login-password" ) else None ,
6286 # 表单帮助状态
63- {
64- "用户名" : "error" if not values .get ("login-user-name" ) else None ,
65- "密码" : "error" if not values .get ("login-password" ) else None ,
66- },
87+ "error" if not values .get ("login-user-name" ) else None ,
88+ "error" if not values .get ("login-password" ) else None ,
6789 ]
6890
6991 # 校验用户登录信息
@@ -96,9 +118,11 @@ def handle_login(nClicks, nSubmit, values, remember_me):
96118
97119 return [
98120 # 表单帮助信息
99- {"用户名" : "用户不存在" },
121+ "用户不存在" ,
122+ None ,
100123 # 表单帮助状态
101- {"用户名" : "error" },
124+ "error" ,
125+ None ,
102126 ]
103127
104128 else :
@@ -129,9 +153,11 @@ def handle_login(nClicks, nSubmit, values, remember_me):
129153
130154 return [
131155 # 表单帮助信息
132- {"密码" : "密码错误" },
156+ None ,
157+ "密码错误" ,
133158 # 表单帮助状态
134- {"密码" : "error" },
159+ None ,
160+ "error" ,
135161 ]
136162
137163 # 更新用户信息表session_token字段
@@ -174,4 +200,4 @@ def handle_login(nClicks, nSubmit, values, remember_me):
174200 login_datetime = datetime .now ().strftime ("%Y-%m-%d %H:%M:%S" ),
175201 )
176202
177- return [{}, {}]
203+ return [None ] * 4
0 commit comments