登录功能的源代码介绍
由于当前已经完成了商城后台管理系统管理员用户的相关功能,因此这里以管理员用户功能模块下的登录功能进行源代码讲解。
登录接口的代码如下:
@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
值保存到数据库中。
结合前文中的登录流程来理解,管理员用户登录的详细过程如下。
-
根据用户名和密码查询管理员用户数据,如果存在,则继续后续流程。
-
生成
token
值,这里可以简单理解为生成一个随机字符串,在这一步其实已经完成了登录逻辑,只是后续需要对token
值进行查询,所以还需要将管理员用户的token
值入库。 -
根据管理员用户
id
查询商城管理员token
表,决定是进行更新操作还是进行新增操作。 -
根据当前时间获取过期时间。
-
封装管理员用户的
token
值并进行入库操作(新增或修改)。 -
返回
token
值。
管理员用户登录功能的实现逻辑就讲解完了,具体实现主要用到了商城管理员 token
表。不过,这是单体版本的实现方式,后续在实现网关层鉴权改造时,会对这部分逻辑进行修改。