万能密码
一、需求与背景
经常会有这样的场景:
线上出bug了,需要登录用户的账号 重现下,但是当们登录 用户账号的时候,会问用户密码,涉及隐私,同时还会将其 踢掉线,等等一系列麻烦的操作。
那么有没有办法解决呢? 这个时候呢,万能密码出现了,有如下几点:
- 使用万能密码可以登录任何账号
- 不将别人 踢掉线
二、架构与思想
由于逻辑比较简单,这里只是简单说一下大概思路:
- 需要在登录的时候,优先进行万能密码判断;
- 万能密码生成的 token 不会提掉线
- 万能密码生成的 token 有效期比较短,防止引起其他问题
- 万能密码方便修改和配置
三、具体使用
SmartAdmin 中 万能密码记录在了 t_config
表中,key
为 super_password
;
四、实现原理
4.1、登录代码
net.lab1024.sa.admin.module.system.login.service.LoginService#login
方法
java
* 验证密码:
* 1、万能密码
* 2、真实密码
*/
String superPassword = EmployeeService.getEncryptPwd(configService.getConfigValue(ConfigKeyEnum.SUPER_PASSWORD));
String requestPassword = EmployeeService.getEncryptPwd(loginForm.getPassword());
if (!(superPassword.equals(requestPassword) || employeeEntity.getLoginPwd().equals(requestPassword))) {
saveLoginLog(employeeEntity, ip, userAgent, "密码错误", LoginLogResultEnum.LOGIN_FAIL);
return ResponseDTO.userErrorParam("登录名或密码错误!");
}
// 生成 登录token,保存token
Boolean superPasswordFlag = superPassword.equals(requestPassword);
4.2、万能密码的token
代码:net.lab1024.sa.admin.module.system.login.service.LoginService#login
java
// 生成 sa-token的 loginId,对于万能密码:受限制sa token 要求loginId唯一,万能密码只能插入一段uuid
String saTokenLoginId = null;
if (superPasswordFlag) {
saTokenLoginId = SUPER_PASSWORD_LOGIN_ID_PREFIX + StringConst.COLON + UUID.randomUUID().toString().replace("-", "") + StringConst.COLON + employeeEntity.getEmployeeId();
} else {
saTokenLoginId = UserTypeEnum.ADMIN_EMPLOYEE.getValue() + StringConst.COLON + employeeEntity.getEmployeeId();
}
联系我们
1024创新实验室-主任:卓大,混迹于各个技术圈,研究过计算机,熟悉点 java,略懂点前端。
1024创新实验室 致力于成为中原领先、国内一流的技术团队, 以AI+数字化为驱动,用技术为产业互联网提供无限可能, 业务如下:
- 教育领域(高职院校数字化、就业创业大数据平台、继续教育平台;在线教育系统、视频直播、题库等,包含:医学、应急管理、成考、专升本等)
- 供应链领域(网络货运平台、大宗贸易进销存ERP、物流管理TMS、B2B电商、仓储WMS、AI提效等)
- 中医领域(诊所数字化管理、互联网医院、AI辅助诊疗、中医适宜技术、在线云问诊、空中药房等)
- AI+软件领域(软件定制外包、开源技术、数据大屏、国产化改造、技术升级换代、人员外包、技术顾问、技术培训等)
加微信: 卓大 拉你入群,一起学习 | 公众号 :六边形工程师 分享:赚钱、代码、生活 | 请 “1024创新实验室” 烩面里加肉 咖啡配胡辣汤,提神又饱腹 | 抖音 : 六边形工程师 直播:赚钱、代码、中医 |