package com.fdkankan.manage.service.impl; import cn.dev33.satoken.stp.SaLoginConfig; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.extra.servlet.ServletUtil; import com.alibaba.fastjson.JSONObject; import com.fdkankan.manage.common.ResultCode; import com.fdkankan.common.util.Base64Converter; import com.fdkankan.common.util.SecurityUtil; import com.fdkankan.manage.common.RedisKeyUtil; import com.fdkankan.manage.common.ResultCode; import com.fdkankan.manage.entity.User; import com.fdkankan.manage.exception.BusinessException; import com.fdkankan.manage.service.ISysUserService; import com.fdkankan.manage.service.IUserService; import com.fdkankan.manage.vo.request.ManageLoginRequest; import com.fdkankan.manage.vo.response.ManageLoginResponse; import com.fdkankan.redis.constant.RedisKey; import com.fdkankan.redis.util.RedisUtil; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import javax.servlet.http.HttpServletRequest; import java.util.List; @Service public class ManageService { @Autowired ISysUserService sysUserService; @Autowired IUserService userService; @Autowired RedisUtil redisUtil; public ManageLoginResponse login(String ip,String userName, String password) { this.checkLoginNum(ip,userName); if(StringUtils.isBlank(userName) || StringUtils.isBlank(password)){ throw new BusinessException(ResultCode.MISSING_REQUIRED_PARAMETERS); } //对前端传的密码解密 String passwordMd5 = SecurityUtil.MD52(Base64Converter.decode(Base64Converter.subText(password))); ManageLoginResponse result = sysUserService.getUserByUserNameAndPassword(userName, passwordMd5); if(result == null){ this.addLoginErrorNum(ip,userName); throw new BusinessException(ResultCode.PASSWORD_ERROR); } if(result.getStatus() == 0){ throw new BusinessException(ResultCode.USERNAME_ERROR); } List byUserName = userService.getByUserName(result.getUserName()); if(byUserName.size() <=0){ throw new BusinessException(ResultCode.USERNAME_ERROR); } User user = byUserName.get(0); StpUtil.login(result.getId(), SaLoginConfig .setExtra("id",result.getId()) .setExtra("userId",user.getId()) .setExtra("isAdmin",1) .setExtra("userName",result.getUserName()) .setExtra("nickName",result.getNickName())); result.setToken(StpUtil.getTokenValue()); result.setUserId(user.getId()); redisUtil.set(String.format(RedisKeyUtil.loginToken ,result.getToken()), JSONObject.toJSONString(result), 2*60*60); String redisUserNameKey = String.format(RedisKeyUtil.loginUserName, userName); redisUtil.lRightPush(redisUserNameKey,result.getToken()); return result; } public void logout() { redisUtil.del(String.format(RedisKeyUtil.loginToken ,StpUtil.getTokenValue())); StpUtil.logout(); } public void checkLoginNum(String ip, String userName) { if(StringUtils.isNotBlank(userName)){ String redisKey = String.format(RedisKeyUtil.loginNum,userName,ip); if(redisUtil.hasKey(redisKey)){ String value = redisUtil.get(redisKey); if("5".equals(value)){ throw new BusinessException(ResultCode.LOGIN_NUM_MUCH); } } } } public void addLoginErrorNum(String ip, String userName) { if(StringUtils.isNotBlank(userName)){ String redisKey = String.format(RedisKeyUtil.loginNum,userName,ip); if(redisUtil.hasKey(redisKey)){ String value = redisUtil.get(redisKey); if("5".equals(value)){ throw new BusinessException(ResultCode.LOGIN_NUM_MUCH); } Integer num = Integer.parseInt(value) + 1; redisUtil.set(redisKey,num.toString(),60 * 5); }else { redisUtil.set(redisKey,"1",60 * 5); } } } public void updateLoginUserStatus(String userName,Integer status) { String redisUserNameKey = String.format(RedisKeyUtil.loginUserName, userName); List list = redisUtil.hgetValues(redisUserNameKey); if(list != null && list.size() >0){ for (String token : list) { String redisKey = String.format(RedisKeyUtil.loginToken, token); String userStr = redisUtil.get(redisKey); ManageLoginResponse result = JSONObject.parseObject(userStr,ManageLoginResponse.class); result.setStatus(status); redisUtil.set(redisKey,JSONObject.toJSONString(result), 2*60*60); } } } }