万能密码

11/7/2023

# 一、需求与背景

经常会有这样的场景:
线上出bug了,我需要登录用户的账号 重现下,但是当我们登录 用户账号的时候,会问用户密码,涉及隐私,同时还会将其 踢掉线,等等一系列麻烦的操作。

那么有没有办法解决呢? 这个时候呢,万能密码出现了,有如下几点:

  • 使用万能密码可以登录任何账号
  • 不将别人 踢掉线

# 二、架构与思想

由于逻辑比较简单,这里只是简单说一下大概思路:

  • 需要在登录的时候,优先进行万能密码判断;
  • 万能密码生成的 token 不会提掉线
  • 万能密码生成的 token 有效期比较短,防止引起其他问题
  • 万能密码方便修改和配置

# 三、具体使用

SmartAdmin 中 万能密码记录在了 t_config 表中,keysuper_password;

# 四、实现原理

# 4.1、登录代码

net.lab1024.sa.admin.module.system.login.service.LoginService#login方法

   * 验证密码:
         * 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);
1
2
3
4
5
6
7
8
9
10
11
12
13

# 4.2、万能密码的token

代码:net.lab1024.sa.admin.module.system.login.service.LoginService#login

        // 生成 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();
        }

1
2
3
4
5
6
7
8

# 联系我们

1024创新实验室-主任:卓大 (opens new window),混迹于各个技术圈,研究过计算机,熟悉点 java,略懂点前端。
1024创新实验室(河南·洛阳) (opens new window) 致力于成为中原领先、国内一流的技术团队,以技术创新为驱动,合作各类项目(软件外包、技术顾问、培训等等)。

加 主任 “卓大” 微信
拉你入群,一起学习
关注 “六边形工程师”
分享:赚钱、代码、生活
请 “1024创新实验室” 喝咖啡
支持我们的开源与分享

告白气球 (钢琴版)
JESSE T