登陆日志及导出问题修改
This commit is contained in:
parent
c7d5310aeb
commit
9eca905f20
|
|
@ -1,6 +1,8 @@
|
||||||
package com.bonus.auth.controller;
|
package com.bonus.auth.controller;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.web.bind.annotation.DeleteMapping;
|
import org.springframework.web.bind.annotation.DeleteMapping;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
|
@ -23,6 +25,7 @@ import com.bonus.system.api.model.LoginUser;
|
||||||
* @author bonus
|
* @author bonus
|
||||||
*/
|
*/
|
||||||
@RestController
|
@RestController
|
||||||
|
@Slf4j
|
||||||
public class TokenController
|
public class TokenController
|
||||||
{
|
{
|
||||||
@Autowired
|
@Autowired
|
||||||
|
|
@ -41,16 +44,21 @@ public class TokenController
|
||||||
}
|
}
|
||||||
|
|
||||||
@DeleteMapping("logout")
|
@DeleteMapping("logout")
|
||||||
public R<?> logout(HttpServletRequest request)
|
public R<?> logout(HttpServletRequest request) {
|
||||||
{
|
try{
|
||||||
String token = SecurityUtils.getToken(request);
|
String token = SecurityUtils.getToken(request);
|
||||||
if (StringUtils.isNotEmpty(token))
|
if (StringUtils.isNotEmpty(token))
|
||||||
{
|
{
|
||||||
String username = JwtUtils.getUserName(token);
|
String username = JwtUtils.getUserName(token);
|
||||||
// 删除用户缓存记录
|
String userId= JwtUtils.getUserId(token);
|
||||||
AuthUtil.logoutByToken(token);
|
// 删除用户缓存记录
|
||||||
// 记录用户退出日志
|
AuthUtil.logoutByToken(token);
|
||||||
sysLoginService.logout(username);
|
// 记录用户退出日志
|
||||||
|
sysLoginService.logout(username,userId);
|
||||||
|
}
|
||||||
|
}catch (Exception e){
|
||||||
|
sysLoginService.logout("","");
|
||||||
|
log.error(e.toString(),e);
|
||||||
}
|
}
|
||||||
return R.ok();
|
return R.ok();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,11 +1,8 @@
|
||||||
package com.bonus.auth.service;
|
package com.bonus.auth.service;
|
||||||
|
|
||||||
|
import com.bonus.common.core.constant.*;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import com.bonus.common.core.constant.CacheConstants;
|
|
||||||
import com.bonus.common.core.constant.Constants;
|
|
||||||
import com.bonus.common.core.constant.SecurityConstants;
|
|
||||||
import com.bonus.common.core.constant.UserConstants;
|
|
||||||
import com.bonus.common.core.domain.R;
|
import com.bonus.common.core.domain.R;
|
||||||
import com.bonus.common.core.enums.UserStatus;
|
import com.bonus.common.core.enums.UserStatus;
|
||||||
import com.bonus.common.core.exception.ServiceException;
|
import com.bonus.common.core.exception.ServiceException;
|
||||||
|
|
@ -41,70 +38,60 @@ public class SysLoginService
|
||||||
/**
|
/**
|
||||||
* 登录
|
* 登录
|
||||||
*/
|
*/
|
||||||
public LoginUser login(String username, String password)
|
public LoginUser login(String username, String password) {
|
||||||
{
|
|
||||||
// 用户名或密码为空 错误
|
// 用户名或密码为空 错误
|
||||||
if (StringUtils.isAnyBlank(username, password))
|
if (StringUtils.isAnyBlank(username, password)) {
|
||||||
{
|
recordLogService.saveLogs(username, Constants.LOGIN_FAIL, "用户名/密码为空","用户名/密码必须填写",null,null);
|
||||||
recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "用户/密码必须填写");
|
throw new ServiceException("用户名/密码必须填写");
|
||||||
throw new ServiceException("用户/密码必须填写");
|
|
||||||
}
|
}
|
||||||
// 密码如果不在指定范围内 错误
|
// 密码如果不在指定范围内 错误
|
||||||
if (password.length() < UserConstants.PASSWORD_MIN_LENGTH
|
if (password.length() < ValidateUtils.MIN_LENGTH
|
||||||
|| password.length() > UserConstants.PASSWORD_MAX_LENGTH)
|
|| password.length() > ValidateUtils.MAX_LENGTH) {
|
||||||
{
|
recordLogService.saveLogs(username, Constants.LOGIN_FAIL, "密码格式不正确","用户名/密码格式不正确",null,null);
|
||||||
recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "用户密码不在指定范围");
|
throw new ServiceException("用户名/密码格式不正确");
|
||||||
throw new ServiceException("用户密码不在指定范围");
|
|
||||||
}
|
}
|
||||||
// 用户名不在指定范围内 错误
|
// 用户名不在指定范围内 错误
|
||||||
if (username.length() < UserConstants.USERNAME_MIN_LENGTH
|
if (username.length() < UserConstants.USERNAME_MIN_LENGTH
|
||||||
|| username.length() > UserConstants.USERNAME_MAX_LENGTH)
|
|| username.length() > UserConstants.USERNAME_MAX_LENGTH) {
|
||||||
{
|
recordLogService.saveLogs(username, Constants.LOGIN_FAIL, "用户名格式不正确","用户名/密码格式不正确",null,null);
|
||||||
recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "用户名不在指定范围");
|
throw new ServiceException("用户名/密码格式不正确");
|
||||||
throw new ServiceException("用户名不在指定范围");
|
|
||||||
}
|
}
|
||||||
// IP黑名单校验
|
// IP黑名单校验
|
||||||
String blackStr = Convert.toStr(redisService.getCacheObject(CacheConstants.SYS_LOGIN_BLACKIPLIST));
|
String blackStr = Convert.toStr(redisService.getCacheObject(CacheConstants.SYS_LOGIN_BLACKIPLIST));
|
||||||
if (IpUtils.isMatchedIp(blackStr, IpUtils.getIpAddr()))
|
if (IpUtils.isMatchedIp(blackStr, IpUtils.getIpAddr())) {
|
||||||
{
|
recordLogService.saveLogs(username, Constants.LOGIN_FAIL, "访问IP已被列入系统黑名单","很遗憾,访问IP已被列入系统黑名单",null,null);
|
||||||
recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "很遗憾,访问IP已被列入系统黑名单");
|
|
||||||
throw new ServiceException("很遗憾,访问IP已被列入系统黑名单");
|
throw new ServiceException("很遗憾,访问IP已被列入系统黑名单");
|
||||||
}
|
}
|
||||||
// 查询用户信息
|
// 查询用户信息
|
||||||
R<LoginUser> userResult = remoteUserService.getUserInfo(username, SecurityConstants.INNER);
|
R<LoginUser> userResult = remoteUserService.getUserInfo(username, SecurityConstants.INNER);
|
||||||
|
|
||||||
if (StringUtils.isNull(userResult) || StringUtils.isNull(userResult.getData()))
|
if (StringUtils.isNull(userResult) || StringUtils.isNull(userResult.getData())) {
|
||||||
{
|
recordLogService.saveLogs(username, Constants.LOGIN_FAIL, "登录用户不存在","用户名/密码错误",null,null);
|
||||||
recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "登录用户不存在");
|
throw new ServiceException("用户名/密码错误");
|
||||||
throw new ServiceException("登录用户:" + username + " 不存在");
|
|
||||||
}
|
}
|
||||||
|
if (R.FAIL == userResult.getCode()) {
|
||||||
if (R.FAIL == userResult.getCode())
|
recordLogService.saveLogs(username, Constants.LOGIN_FAIL, "系统错误",userResult.getMsg(),null,null);
|
||||||
{
|
|
||||||
throw new ServiceException(userResult.getMsg());
|
throw new ServiceException(userResult.getMsg());
|
||||||
}
|
}
|
||||||
|
|
||||||
LoginUser userInfo = userResult.getData();
|
LoginUser userInfo = userResult.getData();
|
||||||
SysUser user = userResult.getData().getSysUser();
|
SysUser user = userResult.getData().getSysUser();
|
||||||
if (UserStatus.DELETED.getCode().equals(user.getDelFlag()))
|
if (UserStatus.DELETED.getCode().equals(user.getDelFlag())) {
|
||||||
{
|
recordLogService.saveLogs(username, Constants.LOGIN_FAIL, "账号已被删除","用户不存在",null,null);
|
||||||
recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "对不起,您的账号已被删除");
|
throw new ServiceException("用户不存在");
|
||||||
throw new ServiceException("对不起,您的账号:" + username + " 已被删除");
|
|
||||||
}
|
}
|
||||||
if (UserStatus.DISABLE.getCode().equals(user.getStatus()))
|
if (UserStatus.DISABLE.getCode().equals(user.getStatus())) {
|
||||||
{
|
recordLogService.saveLogs(username, Constants.LOGIN_FAIL, "用户已停用","用户不存在",null,null);
|
||||||
recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, "用户已停用,请联系管理员");
|
throw new ServiceException("用户不存在");
|
||||||
throw new ServiceException("对不起,您的账号:" + username + " 已停用");
|
|
||||||
}
|
}
|
||||||
passwordService.validate(user, password);
|
passwordService.validate(user, password);
|
||||||
recordLogService.recordLogininfor(username, Constants.LOGIN_SUCCESS, "登录成功");
|
recordLogService.saveLogs(username, Constants.LOGIN_FAIL, "登陆成功","登陆成功",user.getUserId().toString(),"登陆成功");
|
||||||
return userInfo;
|
return userInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void logout(String loginName)
|
public void logout(String loginName,String userId) {
|
||||||
{
|
recordLogService.saveLogout(loginName,"退出成功","退出成功",userId,"退出成功");
|
||||||
recordLogService.recordLogininfor(loginName, Constants.LOGOUT, "退出成功");
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 注册
|
* 注册
|
||||||
|
|
|
||||||
|
|
@ -39,28 +39,23 @@ public class SysPasswordService
|
||||||
return CacheConstants.PWD_ERR_CNT_KEY + username;
|
return CacheConstants.PWD_ERR_CNT_KEY + username;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void validate(SysUser user, String password)
|
public void validate(SysUser user, String password) {
|
||||||
{
|
|
||||||
String username = user.getUserName();
|
String username = user.getUserName();
|
||||||
|
|
||||||
Integer retryCount = redisService.getCacheObject(getCacheKey(username));
|
Integer retryCount = redisService.getCacheObject(getCacheKey(username));
|
||||||
|
if (retryCount == null) {
|
||||||
if (retryCount == null)
|
|
||||||
{
|
|
||||||
retryCount = 0;
|
retryCount = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (retryCount >= Integer.valueOf(maxRetryCount).intValue())
|
if (retryCount >= Integer.valueOf(maxRetryCount).intValue()) {
|
||||||
{
|
long time=redisService.getExpire(getCacheKey(username));
|
||||||
String errMsg = String.format("密码输入错误%s次,帐户锁定%s分钟", maxRetryCount, lockTime);
|
long times=time/60 +1;
|
||||||
recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL,errMsg);
|
String errMsg = String.format("密码输入错误%s次,帐户锁定,请%s分钟后重试", maxRetryCount, times);
|
||||||
|
recordLogService.saveLogs(username, Constants.LOGIN_FAIL, "用户账号锁定","用户账号已锁定,请"+times+"后重试",null,null);
|
||||||
throw new ServiceException(errMsg);
|
throw new ServiceException(errMsg);
|
||||||
}
|
}
|
||||||
|
if (!matches(user, password)) {
|
||||||
if (!matches(user, password))
|
|
||||||
{
|
|
||||||
retryCount = retryCount + 1;
|
retryCount = retryCount + 1;
|
||||||
recordLogService.recordLogininfor(username, Constants.LOGIN_FAIL, String.format("密码输入错误%s次", retryCount));
|
recordLogService.saveLogs(username, Constants.LOGIN_FAIL, "密码输入错误","用户不存在/密码错误",null,null);
|
||||||
redisService.setCacheObject(getCacheKey(username), retryCount, lockTime, TimeUnit.MINUTES);
|
redisService.setCacheObject(getCacheKey(username), retryCount, lockTime, TimeUnit.MINUTES);
|
||||||
throw new ServiceException("用户不存在/密码错误");
|
throw new ServiceException("用户不存在/密码错误");
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,10 @@
|
||||||
package com.bonus.auth.service;
|
package com.bonus.auth.service;
|
||||||
|
|
||||||
|
import com.alibaba.nacos.common.utils.UuidUtils;
|
||||||
|
import com.bonus.common.core.utils.DateUtils;
|
||||||
|
import com.bonus.common.core.utils.global.SystemGlobal;
|
||||||
|
import com.bonus.system.api.domain.SysLogsVo;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import com.bonus.common.core.constant.Constants;
|
import com.bonus.common.core.constant.Constants;
|
||||||
|
|
@ -9,12 +14,15 @@ import com.bonus.common.core.utils.ip.IpUtils;
|
||||||
import com.bonus.system.api.RemoteLogService;
|
import com.bonus.system.api.RemoteLogService;
|
||||||
import com.bonus.system.api.domain.SysLogininfor;
|
import com.bonus.system.api.domain.SysLogininfor;
|
||||||
|
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 记录日志方法
|
* 记录日志方法
|
||||||
*
|
*
|
||||||
* @author bonus
|
* @author bonus
|
||||||
*/
|
*/
|
||||||
@Component
|
@Component
|
||||||
|
@Slf4j
|
||||||
public class SysRecordLogService
|
public class SysRecordLogService
|
||||||
{
|
{
|
||||||
@Autowired
|
@Autowired
|
||||||
|
|
@ -45,4 +53,86 @@ public class SysRecordLogService
|
||||||
}
|
}
|
||||||
remoteLogService.saveLogininfor(logininfor, SecurityConstants.INNER);
|
remoteLogService.saveLogininfor(logininfor, SecurityConstants.INNER);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 记录登录信息
|
||||||
|
*
|
||||||
|
* @param username 用户名
|
||||||
|
* @param status 状态
|
||||||
|
* @param message 消息内容
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public void saveLogs(String username, String status, String message,String resultData,String userId,String result) {
|
||||||
|
SysLogsVo sysLogsVo = new SysLogsVo();
|
||||||
|
String uuid= UUID.randomUUID().toString().replace("-","").toUpperCase();
|
||||||
|
sysLogsVo.setLogId(uuid);
|
||||||
|
sysLogsVo.setOperaUserName(username);
|
||||||
|
sysLogsVo.setIp(IpUtils.getIpAddr());
|
||||||
|
sysLogsVo.setModel("系统登陆");
|
||||||
|
sysLogsVo.setOperaTime(DateUtils.getTime());
|
||||||
|
sysLogsVo.setMethodType(SystemGlobal.POST);
|
||||||
|
sysLogsVo.setMethod("login()");
|
||||||
|
sysLogsVo.setParams("{\"username\":\""+username+"\"}");
|
||||||
|
sysLogsVo.setOperateDetail("用户登陆系统");
|
||||||
|
sysLogsVo.setOperaType("登陆");
|
||||||
|
sysLogsVo.setOperaUri("/login");
|
||||||
|
sysLogsVo.setLogType(0);
|
||||||
|
if (StringUtils.isNotEmpty(result)){
|
||||||
|
sysLogsVo.setResult(result);
|
||||||
|
}else{
|
||||||
|
sysLogsVo.setResult("失败");
|
||||||
|
}
|
||||||
|
if (StringUtils.isNotEmpty(userId)){
|
||||||
|
sysLogsVo.setUserId(result);
|
||||||
|
}
|
||||||
|
sysLogsVo.setFailureReason(message);
|
||||||
|
sysLogsVo.setTitle("系统登陆");
|
||||||
|
sysLogsVo.setResultData(resultData);
|
||||||
|
try{
|
||||||
|
remoteLogService.addLogs(sysLogsVo, SecurityConstants.INNER);
|
||||||
|
}catch (Exception e){
|
||||||
|
log.error(e.toString(),e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 记录登录信息
|
||||||
|
*
|
||||||
|
* @param username 用户名
|
||||||
|
* @param status 状态
|
||||||
|
* @param message 消息内容
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
public void saveLogout(String username, String message,String resultData,String userId,String result) {
|
||||||
|
SysLogsVo sysLogsVo = new SysLogsVo();
|
||||||
|
String uuid= UUID.randomUUID().toString().replace("-","").toUpperCase();
|
||||||
|
sysLogsVo.setLogId(uuid);
|
||||||
|
sysLogsVo.setOperaUserName(username);
|
||||||
|
sysLogsVo.setIp(IpUtils.getIpAddr());
|
||||||
|
sysLogsVo.setModel("退出登录");
|
||||||
|
sysLogsVo.setLogType(0);
|
||||||
|
if (StringUtils.isNotEmpty(userId)){
|
||||||
|
sysLogsVo.setUserId(result);
|
||||||
|
}
|
||||||
|
sysLogsVo.setOperaTime(DateUtils.getTime());
|
||||||
|
sysLogsVo.setMethodType(SystemGlobal.POST);
|
||||||
|
sysLogsVo.setMethod("logout()");
|
||||||
|
sysLogsVo.setParams("{\"username\":\""+username+"\"}");
|
||||||
|
sysLogsVo.setOperateDetail("用户退出登录");
|
||||||
|
sysLogsVo.setOperaType("登出");
|
||||||
|
sysLogsVo.setOperaUri("/logout");
|
||||||
|
if (StringUtils.isNotEmpty(result)){
|
||||||
|
sysLogsVo.setResult(result);
|
||||||
|
}else{
|
||||||
|
sysLogsVo.setResult("成功");
|
||||||
|
}
|
||||||
|
sysLogsVo.setFailureReason(message);
|
||||||
|
sysLogsVo.setTitle("退出登录");
|
||||||
|
sysLogsVo.setResultData(resultData);
|
||||||
|
try{
|
||||||
|
remoteLogService.addLogs(sysLogsVo, SecurityConstants.INNER);
|
||||||
|
}catch (Exception e){
|
||||||
|
log.error(e.toString(),e);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -5,8 +5,7 @@ package com.bonus.common.core.constant;
|
||||||
*
|
*
|
||||||
* @author bonus
|
* @author bonus
|
||||||
*/
|
*/
|
||||||
public class UserConstants
|
public class UserConstants {
|
||||||
{
|
|
||||||
/**
|
/**
|
||||||
* 平台内系统用户的唯一标志
|
* 平台内系统用户的唯一标志
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
package com.bonus.common.core.constant;
|
package com.bonus.common.core.constant;
|
||||||
|
|
||||||
import com.bonus.common.core.utils.StringUtils;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @className:ValidateUtils
|
* @className:ValidateUtils
|
||||||
|
|
@ -14,17 +14,51 @@ public class ValidateUtils {
|
||||||
/**
|
/**
|
||||||
* 密码校验规则
|
* 密码校验规则
|
||||||
*/
|
*/
|
||||||
public static final String PWD_REGEX = "^(?=.*[A-Za-z])(?=.*\\d)(?=.*[@$!%*#?&])[A-Za-z\\d@$!%*#?&]{8,20}$";
|
public static int MAX_LENGTH=26;
|
||||||
|
|
||||||
|
public static int MIN_LENGTH=8;
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
System.err.println(("Admin@1234567"));
|
||||||
|
System.err.println(isPwd("admin@123456"));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 密码校验
|
* 密码校验
|
||||||
*
|
*
|
||||||
* @param pwd
|
* @param password
|
||||||
* @return String
|
* @return String
|
||||||
* @author cwchen
|
* @author cwchen
|
||||||
* @date 2024/6/28 15:01
|
* @date 2024/6/28 15:01
|
||||||
*/
|
*/
|
||||||
public static String isPwd(String pwd) {
|
public static String isPwd(String password) {
|
||||||
return StringUtils.isEmpty(pwd) ? "密码不能为空" : pwd.matches(PWD_REGEX) ? null : "密码必须包含字母、数字、特殊字符,且长度在8-20位之间";
|
|
||||||
|
if (password.length() < MIN_LENGTH) {
|
||||||
|
return "密码必须包含大小写字母、数字、特殊字符,且长度在"+MIN_LENGTH+"-"+MAX_LENGTH+"位之间";
|
||||||
|
}
|
||||||
|
if (password.length() > MAX_LENGTH) {
|
||||||
|
return "密码必须包含大小写字母、数字、特殊字符,且长度在"+MIN_LENGTH+"-"+MAX_LENGTH+"位之间";
|
||||||
|
}
|
||||||
|
boolean hasUpperCase = false;
|
||||||
|
boolean hasLowerCase = false;
|
||||||
|
boolean hasDigit = false;
|
||||||
|
boolean hasSpecialChar = false;
|
||||||
|
|
||||||
|
for (char c : password.toCharArray()) {
|
||||||
|
if (Character.isUpperCase(c)) {
|
||||||
|
hasUpperCase = true;
|
||||||
|
} else if (Character.isLowerCase(c)) {
|
||||||
|
hasLowerCase = true;
|
||||||
|
} else if (Character.isDigit(c)) {
|
||||||
|
hasDigit = true;
|
||||||
|
} else {
|
||||||
|
hasSpecialChar = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(hasUpperCase && hasLowerCase && hasDigit && hasSpecialChar){
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
return "密码必须包含大小写字母、数字、特殊字符,且长度在"+MIN_LENGTH+"-"+MAX_LENGTH+"位之间";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -27,4 +27,10 @@ public class SystemGlobal {
|
||||||
* 成功的200 字符串
|
* 成功的200 字符串
|
||||||
*/
|
*/
|
||||||
public final static String SUCCESS_CODE_STR="200";
|
public final static String SUCCESS_CODE_STR="200";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* POST 请求
|
||||||
|
*/
|
||||||
|
public final static String POST="POST";
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -452,8 +452,7 @@ public class ExcelUtil<T>
|
||||||
* @param list 导出数据集合
|
* @param list 导出数据集合
|
||||||
* @param sheetName 工作表的名称
|
* @param sheetName 工作表的名称
|
||||||
*/
|
*/
|
||||||
public void exportExcel(HttpServletResponse response, List<T> list, String sheetName)
|
public void exportExcel(HttpServletResponse response, List<T> list, String sheetName) {
|
||||||
{
|
|
||||||
exportExcel(response, list, sheetName, StringUtils.EMPTY);
|
exportExcel(response, list, sheetName, StringUtils.EMPTY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -40,4 +40,9 @@ public class OperaType {
|
||||||
* 其他
|
* 其他
|
||||||
*/
|
*/
|
||||||
public final static String OTHER="其他";
|
public final static String OTHER="其他";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 其他
|
||||||
|
*/
|
||||||
|
public final static String FLASH="刷新";
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,9 @@
|
||||||
package com.bonus.common.security.config;
|
package com.bonus.common.security.config;
|
||||||
|
|
||||||
|
|
||||||
|
import com.bonus.common.core.utils.global.SystemGlobal;
|
||||||
import com.bonus.common.security.interceptor.ReadHttpRequestWrapper;
|
import com.bonus.common.security.interceptor.ReadHttpRequestWrapper;
|
||||||
|
import jdk.nashorn.internal.runtime.PropertyDescriptor;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
import org.springframework.web.filter.OncePerRequestFilter;
|
import org.springframework.web.filter.OncePerRequestFilter;
|
||||||
|
|
||||||
|
|
@ -11,13 +13,22 @@ import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
import static cn.hutool.http.Method.POST;
|
||||||
|
import static jdk.nashorn.internal.runtime.PropertyDescriptor.GET;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
@WebFilter("/*")
|
@WebFilter("/*")
|
||||||
public class MyFilter extends OncePerRequestFilter {
|
public class MyFilter extends OncePerRequestFilter {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
|
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
|
||||||
ReadHttpRequestWrapper requestWrapper = new ReadHttpRequestWrapper(request);
|
if (SystemGlobal.POST.equals(request.getMethod())){
|
||||||
filterChain.doFilter(requestWrapper, response);
|
//解决 无法重复读取的我呢提
|
||||||
}
|
ReadHttpRequestWrapper requestWrapper = new ReadHttpRequestWrapper(request);
|
||||||
|
filterChain.doFilter(requestWrapper, response);
|
||||||
|
}else{
|
||||||
|
filterChain.doFilter(request, response);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
@ -61,11 +61,13 @@ public class TokenService
|
||||||
claimsMap.put(SecurityConstants.USER_KEY, token);
|
claimsMap.put(SecurityConstants.USER_KEY, token);
|
||||||
claimsMap.put(SecurityConstants.DETAILS_USER_ID, userId);
|
claimsMap.put(SecurityConstants.DETAILS_USER_ID, userId);
|
||||||
claimsMap.put(SecurityConstants.DETAILS_USERNAME, userName);
|
claimsMap.put(SecurityConstants.DETAILS_USERNAME, userName);
|
||||||
|
String accessToken= JwtUtils.createToken(claimsMap);
|
||||||
// 接口返回信息
|
|
||||||
Map<String, Object> rspMap = new HashMap<String, Object>();
|
Map<String, Object> rspMap = new HashMap<String, Object>();
|
||||||
rspMap.put("access_token", JwtUtils.createToken(claimsMap));
|
rspMap.put("access_token", accessToken);
|
||||||
rspMap.put("expires_in", expireTime);
|
rspMap.put("expires_in", expireTime);
|
||||||
|
//对token和 进行混粗糙你存储
|
||||||
|
redisService.setCacheObject(userName+":"+accessToken,userName, 120l, TimeUnit.MINUTES);
|
||||||
|
redisService.setCacheObject(userId+":"+accessToken,userId.toString(), 120l, TimeUnit.MINUTES);
|
||||||
return rspMap;
|
return rspMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -22,6 +22,8 @@ import com.bonus.gateway.config.properties.IgnoreWhiteProperties;
|
||||||
import io.jsonwebtoken.Claims;
|
import io.jsonwebtoken.Claims;
|
||||||
import reactor.core.publisher.Mono;
|
import reactor.core.publisher.Mono;
|
||||||
|
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 网关鉴权
|
* 网关鉴权
|
||||||
*
|
*
|
||||||
|
|
@ -56,19 +58,19 @@ public class AuthFilter implements GlobalFilter, Ordered
|
||||||
return chain.filter(exchange);
|
return chain.filter(exchange);
|
||||||
}
|
}
|
||||||
String token = getToken(request);
|
String token = getToken(request);
|
||||||
if (StringUtils.isEmpty(token))
|
if (StringUtils.isEmpty(token)) {
|
||||||
{
|
|
||||||
return unauthorizedResponse(exchange, "令牌不能为空");
|
return unauthorizedResponse(exchange, "令牌不能为空");
|
||||||
}
|
}
|
||||||
Claims claims = JwtUtils.parseToken(token);
|
Claims claims = JwtUtils.parseToken(token);
|
||||||
if (claims == null)
|
if (claims == null) {
|
||||||
{
|
|
||||||
return unauthorizedResponse(exchange, "令牌已过期或验证不正确!");
|
return unauthorizedResponse(exchange, "令牌已过期或验证不正确!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
String userkey = JwtUtils.getUserKey(claims);
|
String userkey = JwtUtils.getUserKey(claims);
|
||||||
boolean islogin = redisService.hasKey(getTokenKey(userkey));
|
boolean islogin = redisService.hasKey(getTokenKey(userkey));
|
||||||
if (!islogin)
|
if (!islogin) {
|
||||||
{
|
|
||||||
return unauthorizedResponse(exchange, "登录状态已过期");
|
return unauthorizedResponse(exchange, "登录状态已过期");
|
||||||
}
|
}
|
||||||
String userid = JwtUtils.getUserId(claims);
|
String userid = JwtUtils.getUserId(claims);
|
||||||
|
|
@ -77,7 +79,22 @@ public class AuthFilter implements GlobalFilter, Ordered
|
||||||
{
|
{
|
||||||
return unauthorizedResponse(exchange, "令牌验证失败");
|
return unauthorizedResponse(exchange, "令牌验证失败");
|
||||||
}
|
}
|
||||||
|
try{
|
||||||
|
String userName = JwtUtils.getUserName(claims);
|
||||||
|
String userId = JwtUtils.getUserId(claims);
|
||||||
|
String name=redisService.getCacheObject(userName+":"+token);
|
||||||
|
if (StringUtils.isEmpty(name) || !name.equals(userName)) {
|
||||||
|
return unauthorizedResponse(exchange, "令牌已过期或验证不正确!");
|
||||||
|
}
|
||||||
|
String id=redisService.getCacheObject(userId+":"+token);
|
||||||
|
if (StringUtils.isEmpty(id) || !id.equals(userId)) {
|
||||||
|
return unauthorizedResponse(exchange, "令牌已过期或验证不正确!");
|
||||||
|
}
|
||||||
|
redisService.setCacheObject(userName+":"+token,userName, 120l, TimeUnit.MINUTES);
|
||||||
|
redisService.setCacheObject(userId+":"+token,userId+"", 120l, TimeUnit.MINUTES);
|
||||||
|
}catch (Exception e){
|
||||||
|
return unauthorizedResponse(exchange, "令牌已过期或验证不正确!");
|
||||||
|
}
|
||||||
// 设置用户信息到请求
|
// 设置用户信息到请求
|
||||||
addHeader(mutate, SecurityConstants.USER_KEY, userkey);
|
addHeader(mutate, SecurityConstants.USER_KEY, userkey);
|
||||||
addHeader(mutate, SecurityConstants.DETAILS_USER_ID, userid);
|
addHeader(mutate, SecurityConstants.DETAILS_USER_ID, userid);
|
||||||
|
|
|
||||||
|
|
@ -33,7 +33,7 @@ import reactor.core.publisher.Mono;
|
||||||
@Component
|
@Component
|
||||||
public class ValidateCodeFilter extends AbstractGatewayFilterFactory<Object>
|
public class ValidateCodeFilter extends AbstractGatewayFilterFactory<Object>
|
||||||
{
|
{
|
||||||
private final static String[] VALIDATE_URL = new String[] { "/auth/login2", "/auth/register" };
|
private final static String[] VALIDATE_URL = new String[] { "/auth/login", "/auth/register" };
|
||||||
|
|
||||||
@Value("${system.jie-enable}")
|
@Value("${system.jie-enable}")
|
||||||
public boolean jaData;
|
public boolean jaData;
|
||||||
|
|
|
||||||
|
|
@ -36,8 +36,8 @@ import com.bonus.system.service.ISysConfigService;
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/config")
|
@RequestMapping("/config")
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class SysConfigController extends BaseController
|
public class SysConfigController extends BaseController {
|
||||||
{
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private ISysConfigService configService;
|
private ISysConfigService configService;
|
||||||
|
|
||||||
|
|
@ -63,71 +63,95 @@ public class SysConfigController extends BaseController
|
||||||
@PostMapping("/export")
|
@PostMapping("/export")
|
||||||
@SysLog(title = "参数配置", businessType = OperaType.EXPORT,logType = 0,module = "系统管理->参数配置")
|
@SysLog(title = "参数配置", businessType = OperaType.EXPORT,logType = 0,module = "系统管理->参数配置")
|
||||||
public void export(HttpServletResponse response, SysConfig config) {
|
public void export(HttpServletResponse response, SysConfig config) {
|
||||||
List<SysConfig> list = configService.selectConfigList(config);
|
try{
|
||||||
ExcelUtil<SysConfig> util = new ExcelUtil<SysConfig>(SysConfig.class);
|
List<SysConfig> list = configService.selectConfigList(config);
|
||||||
util.exportExcel(response, list, "参数数据");
|
ExcelUtil<SysConfig> util = new ExcelUtil<SysConfig>(SysConfig.class);
|
||||||
|
util.exportExcel(response, list, "参数数据");
|
||||||
|
}catch (Exception e){
|
||||||
|
ExcelUtil<SysConfig> util = new ExcelUtil<SysConfig>(SysConfig.class);
|
||||||
|
util.exportExcel(response, new ArrayList<SysConfig>(), "参数数据");
|
||||||
|
log.error(e.toString(),e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据参数编号获取详细信息
|
* 根据参数编号获取详细信息
|
||||||
*/
|
*/
|
||||||
@GetMapping(value = "/{configId}")
|
@GetMapping(value = "/{configId}")
|
||||||
public AjaxResult getInfo(@PathVariable Long configId)
|
public AjaxResult getInfo(@PathVariable Long configId) {
|
||||||
{
|
try{
|
||||||
return success(configService.selectConfigById(configId));
|
return success(configService.selectConfigById(configId));
|
||||||
|
}catch (Exception e){
|
||||||
|
log.error(e.toString(),e);
|
||||||
|
return error("系统异常");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据参数键名查询参数值
|
* 根据参数键名查询参数值
|
||||||
*/
|
*/
|
||||||
@GetMapping(value = "/configKey/{configKey}")
|
@GetMapping(value = "/configKey/{configKey}")
|
||||||
public AjaxResult getConfigKey(@PathVariable String configKey)
|
public AjaxResult getConfigKey(@PathVariable String configKey) {
|
||||||
{
|
try{
|
||||||
return success(configService.selectConfigByKey(configKey));
|
return success(configService.selectConfigByKey(configKey));
|
||||||
|
}catch (Exception e){
|
||||||
|
log.error(e.toString(),e);
|
||||||
|
return error("系统异常");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 新增参数配置
|
* 新增参数配置
|
||||||
*/
|
*/
|
||||||
@RequiresPermissions("system:config:add")
|
@RequiresPermissions("system:config:add")
|
||||||
@Log(title = "参数管理", businessType = BusinessType.INSERT)
|
@SysLog(title = "参数配置", businessType = OperaType.INSERT,logType = 0,module = "系统管理->参数配置")
|
||||||
@PostMapping
|
@PostMapping
|
||||||
public AjaxResult add(@Validated @RequestBody SysConfig config)
|
public AjaxResult add(@Validated @RequestBody SysConfig config) {
|
||||||
{
|
try{
|
||||||
if (!configService.checkConfigKeyUnique(config))
|
if (!configService.checkConfigKeyUnique(config)) {
|
||||||
{
|
return error("新增参数'" + config.getConfigName() + "'失败,参数键名已存在");
|
||||||
return error("新增参数'" + config.getConfigName() + "'失败,参数键名已存在");
|
}
|
||||||
|
config.setCreateBy(SecurityUtils.getUsername());
|
||||||
|
return toAjax(configService.insertConfig(config));
|
||||||
|
}catch (Exception e){
|
||||||
|
log.error(e.toString(),e);
|
||||||
|
return error("系统异常");
|
||||||
}
|
}
|
||||||
config.setCreateBy(SecurityUtils.getUsername());
|
|
||||||
return toAjax(configService.insertConfig(config));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 修改参数配置
|
* 修改参数配置
|
||||||
*/
|
*/
|
||||||
@RequiresPermissions("system:config:edit")
|
@RequiresPermissions("system:config:edit")
|
||||||
@Log(title = "参数管理", businessType = BusinessType.UPDATE)
|
|
||||||
@PutMapping
|
@PutMapping
|
||||||
public AjaxResult edit(@Validated @RequestBody SysConfig config)
|
@SysLog(title = "参数配置", businessType = OperaType.UPDATE,logType = 0,module = "系统管理->参数配置")
|
||||||
{
|
public AjaxResult edit(@Validated @RequestBody SysConfig config) {
|
||||||
if (!configService.checkConfigKeyUnique(config))
|
try{
|
||||||
{
|
if (!configService.checkConfigKeyUnique(config)) {
|
||||||
return error("修改参数'" + config.getConfigName() + "'失败,参数键名已存在");
|
return error("修改参数'" + config.getConfigName() + "'失败,参数键名已存在");
|
||||||
|
}
|
||||||
|
config.setUpdateBy(SecurityUtils.getUsername());
|
||||||
|
return toAjax(configService.updateConfig(config));
|
||||||
|
}catch (Exception e){
|
||||||
|
log.error(e.toString(),e);
|
||||||
|
return error("系统异常");
|
||||||
}
|
}
|
||||||
config.setUpdateBy(SecurityUtils.getUsername());
|
|
||||||
return toAjax(configService.updateConfig(config));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 删除参数配置
|
* 删除参数配置
|
||||||
*/
|
*/
|
||||||
@RequiresPermissions("system:config:remove")
|
@RequiresPermissions("system:config:remove")
|
||||||
@Log(title = "参数管理", businessType = BusinessType.DELETE)
|
@SysLog(title = "参数配置", businessType = OperaType.DELETE,logType = 0,module = "系统管理->参数配置")
|
||||||
@DeleteMapping("/{configIds}")
|
@DeleteMapping("/{configIds}")
|
||||||
public AjaxResult remove(@PathVariable Long[] configIds)
|
public AjaxResult remove(@PathVariable Long[] configIds) {
|
||||||
{
|
try{
|
||||||
configService.deleteConfigByIds(configIds);
|
configService.deleteConfigByIds(configIds);
|
||||||
return success();
|
return success();
|
||||||
|
}catch (Exception e){
|
||||||
|
log.error(e.toString(),e);
|
||||||
|
return error("系统异常");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
@ -136,9 +160,14 @@ public class SysConfigController extends BaseController
|
||||||
@RequiresPermissions("system:config:remove")
|
@RequiresPermissions("system:config:remove")
|
||||||
@Log(title = "参数管理", businessType = BusinessType.CLEAN)
|
@Log(title = "参数管理", businessType = BusinessType.CLEAN)
|
||||||
@DeleteMapping("/refreshCache")
|
@DeleteMapping("/refreshCache")
|
||||||
public AjaxResult refreshCache()
|
@SysLog(title = "参数配置", businessType = OperaType.FLASH,logType = 0,module = "系统管理->参数配置")
|
||||||
{
|
public AjaxResult refreshCache() {
|
||||||
configService.resetConfigCache();
|
try{
|
||||||
return success();
|
configService.resetConfigCache();
|
||||||
|
return success();
|
||||||
|
}catch (Exception e){
|
||||||
|
log.error(e.toString(),e);
|
||||||
|
return error("系统异常");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -67,8 +67,7 @@ public class SysDeptController extends BaseController
|
||||||
*/
|
*/
|
||||||
@RequiresPermissions("system:dept:query")
|
@RequiresPermissions("system:dept:query")
|
||||||
@GetMapping(value = "/{deptId}")
|
@GetMapping(value = "/{deptId}")
|
||||||
public AjaxResult getInfo(@PathVariable Long deptId)
|
public AjaxResult getInfo(@PathVariable Long deptId) {
|
||||||
{
|
|
||||||
deptService.checkDeptDataScope(deptId);
|
deptService.checkDeptDataScope(deptId);
|
||||||
return success(deptService.selectDeptById(deptId));
|
return success(deptService.selectDeptById(deptId));
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -141,7 +141,9 @@ public class SysOperLogServiceImpl implements ISysOperLogService
|
||||||
maps.put("bussType",OperaType.DOWNLOAD);
|
maps.put("bussType",OperaType.DOWNLOAD);
|
||||||
}else if(vo.getMenuName().contains(OperaType.EXPORT)){
|
}else if(vo.getMenuName().contains(OperaType.EXPORT)){
|
||||||
maps.put("bussType",OperaType.EXPORT);
|
maps.put("bussType",OperaType.EXPORT);
|
||||||
}else {
|
}else if(vo.getMenuName().contains(OperaType.FLASH)){
|
||||||
|
maps.put("bussType",OperaType.FLASH);
|
||||||
|
} else {
|
||||||
maps.put("bussType",OperaType.OTHER);
|
maps.put("bussType",OperaType.OTHER);
|
||||||
}
|
}
|
||||||
maps.put("title",vo.getMenuName2());
|
maps.put("title",vo.getMenuName2());
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue