偶然间在项目中看到其他大神写的一个简单的登录校验,一次也没有正式写过,简单汇总一下
过程
前端传过来的值
package com.wscar.xny.auth.domain.dto;
import lombok.Data;
/**
* 登录
*/
@Data
public class LoginDTO {
private String phone;
private String password;
}
service.java的校验
/**
* 登录
* @param loginDTO
* @return
*/
@Override
public LoginResultDTO login(LoginDTO loginDTO) {
Example example = new Example(AuthAccountDO.class);
Example.Criteria criteria = example.createCriteria();
criteria.andEqualTo("phone", loginDTO.getPhone());
AuthAccountDO authAccountDO = this.authAccountMapper.selectOneByExample(example);
if (authAccountDO == null) {
throw new BusinessException(AuthBusinessError.SYS_DATA_NOT_EXISTS_ERROR, "员工账号不存在");
}
/**
* 判断用户账号状态, 如果是2停用状态, 不能登录
*/
if (authAccountDO.getStatus() == 2) {
throw new BusinessException(AuthBusinessError.SYS_DATA_ACCOUNT_STOPPED);
}
if(!MD5Util.string2MD5(authAccountDO.getPassword()).equals(loginDTO.getPassword()))
{
throw new BusinessException(AuthBusinessError.SYS_REQUEST_PARAMETER_ERROR, "用户名或密码错误");
}
/**
* 更新用户最后一次登录时间
*/
AuthAccountDO accountDO = new AuthAccountDO();
accountDO.setId(authAccountDO.getId());
accountDO.setLastLoginTime(System.currentTimeMillis() / 1000);
this.authAccountMapper.updateByPrimaryKeySelective(accountDO);
/**
* 缓存 员工角色
*/
AuthAccountDTO accountDTO = new AuthAccountDTO();
BeanUtils.copyProperties(authAccountDO, accountDTO);
AuthRoleDTO authRoleDTO = this.getAuthRole(accountDTO);
if (authRoleDTO != null) {
this.authRoleDao.cacheAuthRole(authRoleDTO);
authAccountDO.setDataRoleId(authRoleDTO.getDataRoleId());
authAccountDO.setFunctionRoleId(authRoleDTO.getFunctionRoleId());
}
/**
* 缓存员工信息【实际redis中是根据员工的id为Key,员工的整体信息authAccoutDo为value,并设置过期时间缓存的】
*/
authAccountDO.setLastLoginTime(accountDO.getLastLoginTime());
this.authAccountDao.cacheAuthAccount(authAccountDO);
/**
* 返回登录token
*/
LoginResultDTO loginResultDTO = new LoginResultDTO();
/**
* 生成Token
*/
String token = TokenUtil.getUserToken(authAccountDO.getId(), AccountTypeConstants.ACCOUNT_TYPE_AUTH_ACCOUNT);
loginResultDTO.setToken(token);
loginResultDTO.setAccountNo(authAccountDO.getAccountNo());
loginResultDTO.setPhone(authAccountDO.getPhone());
loginResultDTO.setUsername(authAccountDO.getUsername());
if (authRoleDTO != null && authRoleDTO.getPriorityNodeDTO().size() > 0 ) {
loginResultDTO.setPriorityNodeDTO(authRoleDTO.getPriorityNodeDTO());
}
return loginResultDTO;
}
步骤
- 由于前端传过来的参数是手机号和密码,所以首先根据手机号从库里查找出对应的一条记录,判断是否有此手机号
- 手机号存在的情况下,判断此条记录的账号是否处于可用状态(因为业务需要,数据库表里有此字段,当然,一般的用户账号信息也应该有此字段,或者是is_deleted字段来判断账户是否可用),不可用直接返回错误信息和错误码
- 可用的情况下,对前端传过来的密码进行加密,判断加密后的密码和数据库表里存的用同样方式加密的密码是否相等,不相等直接返回错误信息和错误码
- 相等的情况下,在redis里缓存员工的信息并更新用户最后一次登录的时间(更新登录时间是因为数据库表里有此字段)
- 根据TokenUtil生成对应的token,把对应的前端需要的值返回回去