思路:相比与注册功能,登录需要的参数少了一个确认密码,但是多了一个请求实体类用于记录用户的登录态。主要步骤是,首先是验证账号,密码的规范性,其次对数据库进行查询是否已经存在,然后,对用户信息进行脱敏,只提取出不敏感的信息,最后,记录登录态,返回脱敏后的用户实体。
@Override
public User UserLogin(String userAccount, String userPassword, HttpServletRequest request) {
if (StringUtils.isAnyBlank(userAccount,userPassword)){
return null;
}
if (userAccount.length()<4){
return null;
}
if(userPassword.length()<8){
return null;
}
//使用正则表达式来判断userAccount当中是否有特殊字符
String regex = "[`~!@#$%^&*()+=|{}':;',\\\\[\\\\].<>/?~!@#¥%…… &*()——+|{}【】‘;:”“’。,、?]";
Matcher matcher = Pattern.compile(regex).matcher(userAccount);
//m.find:如果匹配到相同的字符就返回true,这里如果匹配到相同的字符,说明使用了特殊字符
if(matcher.find()){
return null;
}
//2.加密
String encryptPassword = DigestUtils.md5DigestAsHex((SALT + userPassword).getBytes());//使用md5加密算法
//查询账户是否重复
//3.mybatis_plus当中的查询方法
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//在数据库中userAccount字段中的值是userAccount的有多少条
queryWrapper.eq("userAccount",userAccount);
queryWrapper.eq("userPassword",encryptPassword);
User user =userMapper.selectOne(queryWrapper);
if (user==null){
log.info("user login failed,userAccount cannot match userPassword");
return null;
}
//3.用户脱敏
User safetyUser=new User();
safetyUser.setId(user.getId());
safetyUser.setUsername(user.getUsername());
safetyUser.setUserAccount(user.getUserAccount());
safetyUser.setAvatarUrl(user.getAvatarUrl());
safetyUser.setGender(user.getGender());
safetyUser.setPhone(user.getPhone());
safetyUser.setEmail(user.getEmail());
safetyUser.setUserStatus(user.getUserStatus());
safetyUser.setCreateTime(user.getCreateTime());
safetyUser.setUpdateTime(user.getUpdateTime());
//4.记录用户的登录态
request.getSession().setAttribute(USER_LOGIN_STATE,safetyUser);
return safetyUser;
1.验证账号,密码的规范性
长度验证+特殊字符验证+加密
2.对数据库进行查询
使用的是queryWrapper对数据库进行查询,如果没有查询到返回错误日志信息
3.用户脱敏
4.记录用户的登录态