登录功能的源代码介绍

由于当前已经完成了商城后台管理系统管理员用户的相关功能,因此这里以管理员用户功能模块下的登录功能进行源代码讲解。

登录接口的代码如下:

@RequestMapping(value = "/users/admin/login", method = RequestMethod.POST)
public Result<String> login(@RequestBody @Valid AdminLoginParam AdminLoginParam) {
    String loginResult = adminUserService.login(adminLoginParam.getUserName(),
                                                adminLoginParam.getPasswordMd5());
    logger.info("manage login api,adminName={},loginResult={}", adminLoginParam.getUserName(), loginResult);

    // 登录成功
    if (StringUtils.hasText(loginResult) && loginResult.length() == 32) {
        Result result = ResultGenerator.genSuccessResult();
        result.setData(loginResult);
        return result;
    }
    // 登录失败
    return ResultGenerator.genFailResult(loginResult);
}

源代码在 newbee-mall-cloud-user-web 模块下的 ltd.user.cloud.newbee.controller.NewBeeMallCloudAdminUserController 类中。

在实现用户登录功能时,前端需要向后端传输两个参数:登录名和密码。在设计登录接口时通常会使用 POST 方法来处理,这两个参数会被封装成一个对象传递给后端接口。因此,项目中定义了 AdminLoginParam 类来接收登录参数。

在登录接口定义中,@RequestMapping(value="/users/admin/login",method=RequestMethod.POST) 表示登录请求为 POST 方式,请求路径为 /users/admin/login。使用 @RequestBody 注解对登录参数进行接收并封装成 AdminLoginParam 对象用于业务层的逻辑处理。@Valid 注解的作用为参数验证,在定义登录参数对象时使用了 @NotEmpty 注解,表示该参数不能为空,如果在这里不添加 @Valid 注解,则非空验证不会执行。之后就是调用业务层的 login() 方法进行登录逻辑的处理,根据业务层返回的内容封装请求结果并响应给前端。

登录功能的业务层代码如下:

public String login(String userName, String password) {
    AdminUser loginAdminUser = adminUserMapper.login(userName, password);
    if (loginAdminUser == null) {
        // 登录失败执行修复 token 值的操作
        return "登录失败";
    }
    // 当前时间
    String token = getNewToken(System.currentTimeMillis() + "", loginAdminUser.getAdminUserId());
    AdminUserToken adminUserToken = newBeeAdminUserTokenMapper.selectByPrimaryKey(loginAdminUser.getAdminUserId());
    // 当前时间
    Date now = new Date();
    // 过期时间
    Date expireTime = new Date(now.getTime() + 2 * 24 * 3600 * 1000); // 过期时间为 48 小时

    if (adminUserToken == null) {
        adminUserToken = new AdminUserToken();
        adminUserToken.setAdminUserId(loginAdminUser.getAdminUserId());
        adminUserToken.setToken(token);
        adminUserToken.setUpdateTime(now);
        adminUserToken.setExpireTime(expireTime);
        // 新增一个 token 值
        if (newBeeAdminUserTokenMapper.insertSelective(adminUserToken) > 0) {
            // 新增成功后返回
            return token;
        }
    } else {
        adminUserToken.setToken(token);
        adminUserToken.setUpdateTime(now);
        adminUserToken.setExpireTime(expireTime);
        // 更新
        if (newBeeAdminUserTokenMapper.updateByPrimaryKeySelective(adminUserToken) > 0) {
            // 修改成功后返回
            return token;
        }
    }
    return "登录失败";
}

源代码在 newbee-mall-cloud-user-web 模块下的 ltd.user.cloud.newbee.service.impl.AdminUserServiceImpl 类中。

管理员用户登录的方法中共有 30 行左右代码,总结一下就是先查询并验证管理员用户身份,然后进行 token 值的生成和过期时间的设置,最后将管理员用户的 token 值保存到数据库中。

结合前文中的登录流程来理解,管理员用户登录的详细过程如下。

  1. 根据用户名和密码查询管理员用户数据,如果存在,则继续后续流程。

  2. 生成 token 值,这里可以简单理解为生成一个随机字符串,在这一步其实已经完成了登录逻辑,只是后续需要对 token 值进行查询,所以还需要将管理员用户的 token 值入库。

  3. 根据管理员用户 id 查询商城管理员 token 表,决定是进行更新操作还是进行新增操作。

  4. 根据当前时间获取过期时间。

  5. 封装管理员用户的 token 值并进行入库操作(新增或修改)。

  6. 返回 token 值。

管理员用户登录功能的实现逻辑就讲解完了,具体实现主要用到了商城管理员 token 表。不过,这是单体版本的实现方式,后续在实现网关层鉴权改造时,会对这部分逻辑进行修改。