瀏覽代碼

增加异常事件通知

xusl 2 年之前
父節點
當前提交
599acc725a
共有 23 個文件被更改,包括 337 次插入54 次删除
  1. 1 1
      backend/src/main/java/com/jiayue/ssi/config/SendMailUtil.java
  2. 0 1
      backend/src/main/java/com/jiayue/ssi/controller/ServerController.java
  3. 5 4
      backend/src/main/java/com/jiayue/ssi/controller/SysPolicyController.java
  4. 2 1
      backend/src/main/java/com/jiayue/ssi/controller/SysUserController.java
  5. 2 1
      backend/src/main/java/com/jiayue/ssi/controller/UserLoginController.java
  6. 30 0
      backend/src/main/java/com/jiayue/ssi/entity/SysAlarm.java
  7. 4 4
      backend/src/main/java/com/jiayue/ssi/entity/SysPolicy.java
  8. 0 3
      backend/src/main/java/com/jiayue/ssi/filter/JwtAuthenticationTokenFilter.java
  9. 48 16
      backend/src/main/java/com/jiayue/ssi/handler/CustomAuthenticationFailureHandler.java
  10. 49 0
      backend/src/main/java/com/jiayue/ssi/handler/CustomAuthenticationSuccessHandler.java
  11. 0 3
      backend/src/main/java/com/jiayue/ssi/handler/MyMetaObjectHandler.java
  12. 7 5
      backend/src/main/java/com/jiayue/ssi/job/AutoScanAccount.java
  13. 49 0
      backend/src/main/java/com/jiayue/ssi/job/AutoScanMemory.java
  14. 16 0
      backend/src/main/java/com/jiayue/ssi/mapper/SysAlarmMapper.java
  15. 9 1
      backend/src/main/java/com/jiayue/ssi/mapper/SysUserMapper.java
  16. 15 0
      backend/src/main/java/com/jiayue/ssi/service/SysAlarmService.java
  17. 6 0
      backend/src/main/java/com/jiayue/ssi/service/SysUserService.java
  18. 17 0
      backend/src/main/java/com/jiayue/ssi/service/impl/SysAlarmServiceImpl.java
  19. 11 0
      backend/src/main/java/com/jiayue/ssi/service/impl/SysUserServiceImpl.java
  20. 10 5
      backend/src/main/java/com/jiayue/ssi/util/JwtTokenUtil.java
  21. 45 0
      backend/src/main/resources/mapper/system/SysUserMapper.xml
  22. 1 0
      ui/src/views/monitor/server/index.vue
  23. 10 9
      ui/src/views/sysManager/sysPolicy/index.vue

+ 1 - 1
backend/src/main/java/com/jiayue/ssi/config/SendMailUtil.java

@@ -28,7 +28,7 @@ public class SendMailUtil {
      * @param mailContent   邮件内容
      * @param mailContent   邮件内容
      * @throws Exception
      * @throws Exception
      */
      */
-    public void executeSendMail(String toMailAddress,String subject,String mailContent) throws Exception{
+    public void executeSendMail(String[] toMailAddress,String subject,String mailContent) throws Exception{
         MimeMessage mimeMessage = javaMailSender.createMimeMessage();
         MimeMessage mimeMessage = javaMailSender.createMimeMessage();
         MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true, "utf-8");
         MimeMessageHelper mimeMessageHelper = new MimeMessageHelper(mimeMessage, true, "utf-8");
         mimeMessageHelper.setFrom(fromMailAddress);
         mimeMessageHelper.setFrom(fromMailAddress);

+ 0 - 1
backend/src/main/java/com/jiayue/ssi/controller/ServerController.java

@@ -1,6 +1,5 @@
 package com.jiayue.ssi.controller;
 package com.jiayue.ssi.controller;
 
 
-import com.jiayue.ssi.annotation.InterfaceLimit;
 import com.jiayue.ssi.entity.Server;
 import com.jiayue.ssi.entity.Server;
 import com.jiayue.ssi.util.ResponseVO;
 import com.jiayue.ssi.util.ResponseVO;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.security.access.prepost.PreAuthorize;

+ 5 - 4
backend/src/main/java/com/jiayue/ssi/controller/SysPolicyController.java

@@ -82,11 +82,12 @@ public class SysPolicyController {
             return ResponseVO.fail("审计日志保留月数请输入3-12整数");
             return ResponseVO.fail("审计日志保留月数请输入3-12整数");
         }
         }
 
 
-        if (StringUtils.isEmpty(sysPolicy.getScanAccount())) {
-            return ResponseVO.fail("自动扫描未使用锁定账号不能为空!");
-        } else if (sysPolicy.getScanAccount().length() > 1) {
-            return ResponseVO.fail("自动扫描未使用锁定账号字符过长!");
+        if (sysPolicy.getScanAccount()==null) {
+            return ResponseVO.fail("扫描未使用的账号不能为空!");
+        } else if (!String.valueOf(sysPolicy.getScanAccount()).matches("^([0-9]|(1[0-2]))$")) {
+            return ResponseVO.fail("扫描未使用的账号请输入0-12整数");
         }
         }
+
         if (StringUtils.isEmpty(sysPolicy.getExcNoticeWayA())) {
         if (StringUtils.isEmpty(sysPolicy.getExcNoticeWayA())) {
             return ResponseVO.fail("A级别异常通知方式不能为空!");
             return ResponseVO.fail("A级别异常通知方式不能为空!");
         } else if (!NumberUtil.isInteger(sysPolicy.getExcNoticeWayA())) {
         } else if (!NumberUtil.isInteger(sysPolicy.getExcNoticeWayA())) {

+ 2 - 1
backend/src/main/java/com/jiayue/ssi/controller/SysUserController.java

@@ -284,7 +284,8 @@ public class SysUserController {
             return ResponseVO.fail("密码生成失败!");
             return ResponseVO.fail("密码生成失败!");
         }
         }
         try {
         try {
-            sendMailUtil.executeSendMail(sysUser.getMailbox(), "系统登录密码", "密码:" + randomPwd);
+            String[] mailArray = {sysUser.getMailbox()};
+            sendMailUtil.executeSendMail(mailArray, "系统登录密码", "密码:" + randomPwd);
         } catch (Exception e) {
         } catch (Exception e) {
             e.printStackTrace();
             e.printStackTrace();
             return ResponseVO.fail("发送邮箱失败");
             return ResponseVO.fail("发送邮箱失败");

+ 2 - 1
backend/src/main/java/com/jiayue/ssi/controller/UserLoginController.java

@@ -130,7 +130,8 @@ public class UserLoginController {
             // uuid存入缓存,失效时间4分钟
             // uuid存入缓存,失效时间4分钟
             LocalCache.set(mailKey, mailRandom, 60000 * 4);
             LocalCache.set(mailKey, mailRandom, 60000 * 4);
             try {
             try {
-                sendMailUtil.executeSendMail(sysUser.getMailbox(),"邮箱验证码","口令:" + mailRandom + ",有效期4分钟。");
+                String[] mailArray = {sysUser.getMailbox()};
+                sendMailUtil.executeSendMail(mailArray,"邮箱验证码","口令:" + mailRandom + ",有效期4分钟。");
             } catch (Exception e) {
             } catch (Exception e) {
                 e.printStackTrace();
                 e.printStackTrace();
                 return ResponseVO.fail("邮箱验证码发送失败!");
                 return ResponseVO.fail("邮箱验证码发送失败!");

+ 30 - 0
backend/src/main/java/com/jiayue/ssi/entity/SysAlarm.java

@@ -0,0 +1,30 @@
+package com.jiayue.ssi.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 系统告警表
+ *
+ * @author xsl
+ * @version 3.0
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName(value = "sys_alarm")
+public class SysAlarm extends BaseEntity{
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 告警内容
+     */
+    private String alarmContent;
+    /**
+     * 读取标识
+     */
+    private String readSign;
+}

+ 4 - 4
backend/src/main/java/com/jiayue/ssi/entity/SysPolicy.java

@@ -28,9 +28,9 @@ public class SysPolicy extends BaseEntity{
      */
      */
     private Integer loginLock;
     private Integer loginLock;
     /**
     /**
-     * 是否自动扫描账号(3个月及以上未使用进行锁定),0自动扫描 1不扫描
+     * 扫描未使用的账号(单位:月)
      */
      */
-    private String scanAccount;
+    private Integer scanAccount;
     /**
     /**
      * 非活动状态时登出系统(单位:分钟)
      * 非活动状态时登出系统(单位:分钟)
      */
      */
@@ -44,11 +44,11 @@ public class SysPolicy extends BaseEntity{
      */
      */
     private Integer memoryWarn;
     private Integer memoryWarn;
     /**
     /**
-     * 连续登录失败异常级别设置(A/B两个级别)
+     * 连续登录失败异常级别设置(0:A 1:B两个级别)
      */
      */
     private String excLevelLogin;
     private String excLevelLogin;
     /**
     /**
-     * 同一用户多点登录异常级别设置(A/B两个级别)
+     * 同一用户多点登录异常级别设置(0:A 1:B两个级别)
      */
      */
     private String excLevelSameUser;
     private String excLevelSameUser;
     /**
     /**

+ 0 - 3
backend/src/main/java/com/jiayue/ssi/filter/JwtAuthenticationTokenFilter.java

@@ -1,7 +1,6 @@
 package com.jiayue.ssi.filter;
 package com.jiayue.ssi.filter;
 
 
 import java.io.IOException;
 import java.io.IOException;
-import java.util.Date;
 
 
 import javax.servlet.FilterChain;
 import javax.servlet.FilterChain;
 import javax.servlet.ServletException;
 import javax.servlet.ServletException;
@@ -22,8 +21,6 @@ import org.springframework.util.StringUtils;
 import org.springframework.web.filter.OncePerRequestFilter;
 import org.springframework.web.filter.OncePerRequestFilter;
 import com.jiayue.ssi.util.JwtTokenUtil;
 import com.jiayue.ssi.util.JwtTokenUtil;
 
 
-import lombok.RequiredArgsConstructor;
-
 /**
 /**
  * jwt过滤器
  * jwt过滤器
  * @author xsl
  * @author xsl

+ 48 - 16
backend/src/main/java/com/jiayue/ssi/handler/CustomAuthenticationFailureHandler.java

@@ -1,18 +1,24 @@
 package com.jiayue.ssi.handler;
 package com.jiayue.ssi.handler;
 
 
 import java.io.IOException;
 import java.io.IOException;
+import java.util.List;
 
 
 import javax.servlet.ServletException;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponse;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.jiayue.ssi.config.SendMailUtil;
 import com.jiayue.ssi.constant.CacheConstants;
 import com.jiayue.ssi.constant.CacheConstants;
 import com.jiayue.ssi.constant.Constants;
 import com.jiayue.ssi.constant.Constants;
-import com.jiayue.ssi.constant.LoginConstants;
+import com.jiayue.ssi.entity.SysAlarm;
+import com.jiayue.ssi.entity.SysPolicy;
 import com.jiayue.ssi.entity.SysUser;
 import com.jiayue.ssi.entity.SysUser;
 import com.jiayue.ssi.factory.LoginFactory;
 import com.jiayue.ssi.factory.LoginFactory;
-import com.jiayue.ssi.service.SysParameterService;
+import com.jiayue.ssi.service.SysAlarmService;
+import com.jiayue.ssi.service.SysPolicyService;
 import com.jiayue.ssi.service.SysUserService;
 import com.jiayue.ssi.service.SysUserService;
+import com.jiayue.ssi.util.AesUtils;
 import com.jiayue.ssi.util.LocalCache;
 import com.jiayue.ssi.util.LocalCache;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.core.AuthenticationException;
 import org.springframework.security.core.AuthenticationException;
@@ -29,7 +35,11 @@ public class CustomAuthenticationFailureHandler extends SimpleUrlAuthenticationF
     @Autowired
     @Autowired
     SysUserService sysUserService;
     SysUserService sysUserService;
     @Autowired
     @Autowired
-    SysParameterService sysParameterService;
+    SysPolicyService sysPolicyService;
+    @Autowired
+    SysAlarmService sysAlarmService;
+    @Autowired
+    SendMailUtil sendMailUtil;
 
 
     @Override
     @Override
     public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
     public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
@@ -42,19 +52,11 @@ public class CustomAuthenticationFailureHandler extends SimpleUrlAuthenticationF
             errorTips = "用户名或密码不正确";
             errorTips = "用户名或密码不正确";
         }
         }
         else {
         else {
+            SysPolicy sysPolicy = sysPolicyService.getOne(new QueryWrapper<>());
             // 失败总次数
             // 失败总次数
-            int errCount = 5;
-            try {
-                errCount = Integer.parseInt(sysParameterService.queryByKey("errCount", "5"));
-            } catch (Exception errCountErr) {
-                // 日志输出转换失败的提示
-            }
-            int lockedTime = 1200000;
-            try {
-                lockedTime = Integer.parseInt(sysParameterService.queryByKey("lockedTime", "1200000"));
-            } catch (Exception lockedTimeErr) {
-                // 日志输出转换失败的提示
-            }
+            int errCount = sysPolicy.getLoginFails();
+            // 锁定时长
+            int lockedTime = sysPolicy.getLoginLock()*1000*60;
             if (user.getStatus().equals("1")) {
             if (user.getStatus().equals("1")) {
                 Long xz = (user.getLockTime() + lockedTime - System.currentTimeMillis()) / 1000;
                 Long xz = (user.getLockTime() + lockedTime - System.currentTimeMillis()) / 1000;
                 if (xz < 0) {
                 if (xz < 0) {
@@ -87,6 +89,37 @@ public class CustomAuthenticationFailureHandler extends SimpleUrlAuthenticationF
                     user.setStatus("1");
                     user.setStatus("1");
                     user.setLockTime(System.currentTimeMillis());
                     user.setLockTime(System.currentTimeMillis());
                     sysUserService.updateUser(user);
                     sysUserService.updateUser(user);
+                    String noticeWay = "";
+                    if ("A".equals(sysPolicy.getExcLevelLogin())){
+                        noticeWay = sysPolicy.getExcNoticeWayA();
+                    } else if ("B".equals(sysPolicy.getExcLevelLogin())){
+                        noticeWay = sysPolicy.getExcNoticeWayB();
+                    }
+
+                    // 通知系统管理员
+                    if ("0".equals(noticeWay)){
+                        List<SysUser> sysUserList = sysUserService.selectUserByRole("1");
+                        if (sysUserList.size()>0){
+                            String[] mailArray = new String[sysUserList.size()];
+                            for (int i=0;i<sysUserList.size();i++){
+                                mailArray[i] = AesUtils.decryptStr(sysUserList.get(i).getMailbox());
+                            }
+                            try {
+                                // 发送邮件
+                                sendMailUtil.executeSendMail(mailArray,"账号【"+user.getUsername()+"】登录失败","账号【"+user.getUsername()+"】登录失败"+errCount+"次,锁定账号!");
+                            } catch (Exception ex) {
+                                System.out.println("邮箱验证码发送失败!");
+                            }
+                        }
+                    }
+                    else if ("1".equals(noticeWay)){
+                        // 告警
+                        SysAlarm sysAlarm = new SysAlarm();
+                        sysAlarm.setAlarmContent("账号【"+user.getUsername()+"】登录失败"+errCount+"次,锁定账号!");
+                        sysAlarm.setReadSign("0");
+                        // 低于策略设定值则告警
+                        sysAlarmService.save(sysAlarm);
+                    }
                 }
                 }
             }
             }
         }
         }
@@ -101,5 +134,4 @@ public class CustomAuthenticationFailureHandler extends SimpleUrlAuthenticationF
         response.setStatus(401);
         response.setStatus(401);
         response.getWriter().write(errorTips);
         response.getWriter().write(errorTips);
     }
     }
-
 }
 }

+ 49 - 0
backend/src/main/java/com/jiayue/ssi/handler/CustomAuthenticationSuccessHandler.java

@@ -3,16 +3,23 @@ package com.jiayue.ssi.handler;
 import java.io.IOException;
 import java.io.IOException;
 import java.util.Date;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Map;
 
 
 import javax.servlet.ServletException;
 import javax.servlet.ServletException;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import javax.servlet.http.HttpServletResponse;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.jiayue.ssi.config.SendMailUtil;
 import com.jiayue.ssi.constant.CacheConstants;
 import com.jiayue.ssi.constant.CacheConstants;
 import com.jiayue.ssi.constant.Constants;
 import com.jiayue.ssi.constant.Constants;
 import com.jiayue.ssi.constant.SecretKeyConstants;
 import com.jiayue.ssi.constant.SecretKeyConstants;
+import com.jiayue.ssi.entity.SysAlarm;
+import com.jiayue.ssi.entity.SysPolicy;
 import com.jiayue.ssi.factory.LoginFactory;
 import com.jiayue.ssi.factory.LoginFactory;
+import com.jiayue.ssi.service.SysAlarmService;
+import com.jiayue.ssi.service.SysPolicyService;
 import com.jiayue.ssi.service.SysUserService;
 import com.jiayue.ssi.service.SysUserService;
 import com.jiayue.ssi.util.*;
 import com.jiayue.ssi.util.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -36,6 +43,12 @@ public class CustomAuthenticationSuccessHandler extends SavedRequestAwareAuthent
     JwtTokenUtil jwtTokenUtil;
     JwtTokenUtil jwtTokenUtil;
     @Autowired
     @Autowired
     SysUserService sysUserService;
     SysUserService sysUserService;
+    @Autowired
+    SysPolicyService sysPolicyService;
+    @Autowired
+    SendMailUtil sendMailUtil;
+    @Autowired
+    SysAlarmService sysAlarmService;
 
 
     @Override
     @Override
     public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
     public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
@@ -62,6 +75,42 @@ public class CustomAuthenticationSuccessHandler extends SavedRequestAwareAuthent
 
 
         String token = jwtTokenUtil.generateToken(sysUser);
         String token = jwtTokenUtil.generateToken(sysUser);
         // 将token存储内存中,便于重复登录比对
         // 将token存储内存中,便于重复登录比对
+        if (CacheConstants.LOGIN_TOKEN_MAP.get(username)!=null){
+            // 之前有用户登录过,本次将上次用户踢出下线。并通知管理员
+            String noticeWay = "";
+            SysPolicy sysPolicy = sysPolicyService.getOne(new QueryWrapper<>());
+            if ("A".equals(sysPolicy.getExcLevelSameUser())){
+                noticeWay = sysPolicy.getExcNoticeWayA();
+            } else if ("B".equals(sysPolicy.getExcLevelSameUser())){
+                noticeWay = sysPolicy.getExcNoticeWayB();
+            }
+
+            // 通知系统管理员
+            if ("0".equals(noticeWay)){
+                List<SysUser> sysUserList = sysUserService.selectUserByRole("1");
+                if (sysUserList.size()>0){
+                    String[] mailArray = new String[sysUserList.size()];
+                    for (int i=0;i<sysUserList.size();i++){
+                        // 邮箱解密
+                        mailArray[i] = AesUtils.decryptStr(sysUserList.get(i).getMailbox());
+                    }
+                    try {
+                        // 发送邮件
+                        sendMailUtil.executeSendMail(mailArray,"账号【"+sysUser.getUsername()+"】多点登录","本次登录时间:"+DateUtils.getTime()+",登录IP:"+IPUtils.getIpAddr(request));
+                    } catch (Exception ex) {
+                        System.out.println("邮箱验证码发送失败!");
+                    }
+                }
+            }
+            else if ("1".equals(noticeWay)){
+                // 告警
+                SysAlarm sysAlarm = new SysAlarm();
+                sysAlarm.setAlarmContent("账号【"+sysUser.getUsername()+"】多点登录");
+                sysAlarm.setReadSign("0");
+                // 低于策略设定值则告警
+                sysAlarmService.save(sysAlarm);
+            }
+        }
         CacheConstants.LOGIN_TOKEN_MAP.put(username,token);
         CacheConstants.LOGIN_TOKEN_MAP.put(username,token);
 
 
         String obj = JSONUtil.toJsonStr(ResponseVO.success(token));
         String obj = JSONUtil.toJsonStr(ResponseVO.success(token));

+ 0 - 3
backend/src/main/java/com/jiayue/ssi/handler/MyMetaObjectHandler.java

@@ -17,9 +17,6 @@ import java.util.Date;
 */
 */
 @Component
 @Component
 public class MyMetaObjectHandler implements MetaObjectHandler {
 public class MyMetaObjectHandler implements MetaObjectHandler {
-
-
-
     /**
     /**
      * 插入时的填充策略
      * 插入时的填充策略
      *
      *

+ 7 - 5
backend/src/main/java/com/jiayue/ssi/job/AutoScanAccount.java

@@ -1,7 +1,9 @@
 package com.jiayue.ssi.job;
 package com.jiayue.ssi.job;
 
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.jiayue.ssi.entity.SysPolicy;
 import com.jiayue.ssi.entity.SysUser;
 import com.jiayue.ssi.entity.SysUser;
-import com.jiayue.ssi.service.SysParameterService;
+import com.jiayue.ssi.service.SysPolicyService;
 import com.jiayue.ssi.service.SysUserService;
 import com.jiayue.ssi.service.SysUserService;
 import lombok.extern.slf4j.Slf4j;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -23,17 +25,17 @@ import java.util.List;
 @Slf4j
 @Slf4j
 public class AutoScanAccount {
 public class AutoScanAccount {
     @Autowired
     @Autowired
-    SysParameterService sysParameterService;
-    @Autowired
     SysUserService sysUserService;
     SysUserService sysUserService;
+    @Autowired
+    SysPolicyService sysPolicyService;
 
 
     /**
     /**
      * 每30分钟执行一次扫描
      * 每30分钟执行一次扫描
      */
      */
     @Scheduled(cron = "0 0/10 * * * ?")
     @Scheduled(cron = "0 0/10 * * * ?")
     public void scanNotUsedAccount() throws Exception{
     public void scanNotUsedAccount() throws Exception{
-        // 获取参数配置,未设置默认3个月
-        int autoScanAccount = Integer.parseInt(sysParameterService.queryByKey("autoScanAccount", "3"));
+        SysPolicy sysPolicy = sysPolicyService.getOne(new QueryWrapper<>());
+        int autoScanAccount = sysPolicy.getScanAccount();
         if (autoScanAccount>0){
         if (autoScanAccount>0){
             log.info("自动扫描长期未使用的账号开始。。。");
             log.info("自动扫描长期未使用的账号开始。。。");
             // 进行扫描
             // 进行扫描

+ 49 - 0
backend/src/main/java/com/jiayue/ssi/job/AutoScanMemory.java

@@ -0,0 +1,49 @@
+package com.jiayue.ssi.job;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.jiayue.ssi.entity.SysAlarm;
+import com.jiayue.ssi.entity.SysPolicy;
+import com.jiayue.ssi.entity.server.Jvm;
+import com.jiayue.ssi.service.SysAlarmService;
+import com.jiayue.ssi.service.SysPolicyService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+
+/**
+* 检测内存告警
+*
+* @author xsl
+* @since 2023/04/06
+*/
+@Service
+@EnableScheduling
+@Slf4j
+public class AutoScanMemory {
+    @Autowired
+    SysPolicyService sysPolicyService;
+    @Autowired
+    SysAlarmService sysAlarmService;
+
+    /**
+     * 每30分钟执行一次扫描
+     */
+    @Scheduled(cron = "0 0/30 * * * ?")
+    public void scanMemory() throws Exception{
+        SysPolicy sysPolicy = sysPolicyService.getOne(new QueryWrapper<>());
+        int memoryWarn = sysPolicy.getMemoryWarn();
+        Jvm jvm = new Jvm();
+        jvm.setTotal(Runtime.getRuntime().totalMemory());
+        jvm.setMax(Runtime.getRuntime().maxMemory());
+        jvm.setFree(Runtime.getRuntime().freeMemory());
+        if ((100-jvm.getUsage())<memoryWarn){
+            SysAlarm sysAlarm = new SysAlarm();
+            sysAlarm.setAlarmContent("内存低于"+memoryWarn+"%");
+            sysAlarm.setReadSign("0");
+            // 低于策略设定值则告警
+            sysAlarmService.save(sysAlarm);
+        }
+    }
+}

+ 16 - 0
backend/src/main/java/com/jiayue/ssi/mapper/SysAlarmMapper.java

@@ -0,0 +1,16 @@
+package com.jiayue.ssi.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.jiayue.ssi.entity.SysAlarm;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ *  告警Mapper
+ *
+ * @author xsl
+ * @since 2023-03-10
+ */
+@Mapper
+public interface SysAlarmMapper extends BaseMapper<SysAlarm> {
+
+}

+ 9 - 1
backend/src/main/java/com/jiayue/ssi/mapper/SysUserMapper.java

@@ -4,6 +4,8 @@ import com.jiayue.ssi.entity.SysUser;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Mapper;
 
 
+import java.util.List;
+
 /**
 /**
  *  用户管理Mapper
  *  用户管理Mapper
  *
  *
@@ -12,5 +14,11 @@ import org.apache.ibatis.annotations.Mapper;
  */
  */
 @Mapper
 @Mapper
 public interface SysUserMapper extends BaseMapper<SysUser> {
 public interface SysUserMapper extends BaseMapper<SysUser> {
-
+    /**
+     * 通过角色ID查找用户
+     *
+     * @param roleId 角色ID
+     * @return 结果
+     */
+    public List<SysUser> selectUserByRole(String roleId);
 }
 }

+ 15 - 0
backend/src/main/java/com/jiayue/ssi/service/SysAlarmService.java

@@ -0,0 +1,15 @@
+package com.jiayue.ssi.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.jiayue.ssi.entity.SysAlarm;
+
+
+
+/**
+* 告警接口
+* @author xsl
+* @date 2023/2/16
+*/
+public interface SysAlarmService extends IService<SysAlarm> {
+
+}

+ 6 - 0
backend/src/main/java/com/jiayue/ssi/service/SysUserService.java

@@ -72,4 +72,10 @@ public interface SysUserService extends IService<SysUser> {
      * @param roleId 角色组
      * @param roleId 角色组
      */
      */
     int insertUserAuth(Long userId, Long roleId);
     int insertUserAuth(Long userId, Long roleId);
+    /**
+     * 通过角色ID查找用户
+     * @param roleId 角色Id
+     * @return
+     */
+    List<SysUser> selectUserByRole(String roleId);
 }
 }

+ 17 - 0
backend/src/main/java/com/jiayue/ssi/service/impl/SysAlarmServiceImpl.java

@@ -0,0 +1,17 @@
+package com.jiayue.ssi.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jiayue.ssi.entity.SysAlarm;
+import com.jiayue.ssi.mapper.SysAlarmMapper;
+import com.jiayue.ssi.service.SysAlarmService;
+import org.springframework.stereotype.Service;
+
+/**
+* 告警服务类
+* @author xsl
+* @date 2023/2/16
+*/
+@Service
+public class SysAlarmServiceImpl extends ServiceImpl<SysAlarmMapper, SysAlarm> implements SysAlarmService {
+
+}

+ 11 - 0
backend/src/main/java/com/jiayue/ssi/service/impl/SysUserServiceImpl.java

@@ -183,4 +183,15 @@ public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUser> impl
         }
         }
         return returnVal;
         return returnVal;
     }
     }
+
+    /**
+     * 通过角色ID查找用户
+     * @param roleId 角色Id
+     * @return
+     */
+    @Override
+    public List<SysUser> selectUserByRole(String roleId){
+        return sysUserMapper.selectUserByRole(roleId);
+
+    }
 }
 }

+ 10 - 5
backend/src/main/java/com/jiayue/ssi/util/JwtTokenUtil.java

@@ -2,9 +2,13 @@ package com.jiayue.ssi.util;
 
 
 
 
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.date.DateUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.jiayue.ssi.entity.SysPolicy;
 import com.jiayue.ssi.entity.SysUser;
 import com.jiayue.ssi.entity.SysUser;
+import com.jiayue.ssi.service.SysPolicyService;
 import io.jsonwebtoken.*;
 import io.jsonwebtoken.*;
 import lombok.Data;
 import lombok.Data;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.stereotype.Component;
 import org.springframework.stereotype.Component;
 
 
@@ -22,12 +26,10 @@ import java.util.Map;
 @Component
 @Component
 public class JwtTokenUtil {
 public class JwtTokenUtil {
 
 
-    private String secret = "jiayue";
+    @Autowired
+    SysPolicyService sysPolicyService;
 
 
-    /**
-     * 过期时长30分钟(毫秒)
-     */
-    private Long expiration = 1800000L;
+    private String secret = "jiayue";
 
 
     private String authorization;
     private String authorization;
 
 
@@ -38,6 +40,9 @@ public class JwtTokenUtil {
      * @return 令牌
      * @return 令牌
      */
      */
     private String generateToken(Map<String, Object> claims) {
     private String generateToken(Map<String, Object> claims) {
+        SysPolicy sysPolicy = sysPolicyService.getOne(new QueryWrapper<>());
+        // 过期时长30分钟(毫秒)
+        Long expiration = sysPolicy.getInactiveLogout().longValue()*1000*60L;
         Date expirationDate = new Date(System.currentTimeMillis() + expiration);
         Date expirationDate = new Date(System.currentTimeMillis() + expiration);
         return Jwts.builder().setClaims(claims).setExpiration(expirationDate).setIssuedAt(new Date(System.currentTimeMillis())).signWith(SignatureAlgorithm.HS512, secret).compact();
         return Jwts.builder().setClaims(claims).setExpiration(expirationDate).setIssuedAt(new Date(System.currentTimeMillis())).signWith(SignatureAlgorithm.HS512, secret).compact();
     }
     }

+ 45 - 0
backend/src/main/resources/mapper/system/SysUserMapper.xml

@@ -0,0 +1,45 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.jiayue.ssi.mapper.SysUserMapper">
+
+    <resultMap type="SysUser" id="SysUserResult">
+        <id     property="id"       column="id"      />
+        <result property="username"     column="username"    />
+        <result property="nickname"     column="nickname"    />
+        <result property="usertype"        column="usertype"        />
+        <result property="phonenumber"  column="phonenumber"  />
+        <result property="lockTime"          column="lock_time"          />
+        <result property="errNum"       column="err_num"       />
+        <result property="password"     column="password"     />
+        <result property="status"       column="status"       />
+        <result property="lastUpdatePwdTime"       column="last_update_pwd_time"       />
+        <result property="loginIp"       column="login_ip"       />
+        <result property="loginDate"       column="login_date"       />
+		<result property="delFlag"            column="del_flag"              />
+		<result property="createBy"           column="create_by"             />
+		<result property="createTime"         column="create_time"           />
+		<result property="updateBy"           column="update_by"             />
+		<result property="updateTime"         column="update_time"           />
+		<result property="remark"             column="remark"                />
+    </resultMap>
+
+    <select id="selectUserByRole" parameterType="String" resultMap="SysUserResult">
+		SELECT
+			*
+		FROM
+			sys_user u
+		WHERE
+			u.del_flag = '0'
+		  AND u.id IN (
+			SELECT
+				user_id
+			FROM
+				sys_user_role ur
+			WHERE
+				ur.role_id = #{roleId}
+			  AND ur.del_flag = '0'
+		)
+	</select>
+</mapper>

+ 1 - 0
ui/src/views/monitor/server/index.vue

@@ -320,6 +320,7 @@ export default {
     /** 查询服务器信息 */
     /** 查询服务器信息 */
     getList() {
     getList() {
       getServer().then(response => {
       getServer().then(response => {
+        console.log(response.data)
         this.server = response.data;
         this.server = response.data;
         // this.$modal.closeLoading();
         // this.$modal.closeLoading();
       });
       });

+ 10 - 9
ui/src/views/sysManager/sysPolicy/index.vue

@@ -7,13 +7,10 @@
           <el-form-item label="登录失败锁定时长(至少20分钟)" prop="loginLock">
           <el-form-item label="登录失败锁定时长(至少20分钟)" prop="loginLock">
             <el-input v-model="form.loginLock" style="width: 240px"></el-input>
             <el-input v-model="form.loginLock" style="width: 240px"></el-input>
           </el-form-item>
           </el-form-item>
-          <el-form-item label="自动扫描3个月及以上未使用锁定账号" prop="scanAccount">
-            <el-radio-group v-model="form.scanAccount">
-              <el-radio label="0">是</el-radio>
-              <el-radio label="1">否</el-radio>
-            </el-radio-group>
+          <el-form-item label="扫描未使用的账号(设定月个数)" prop="scanAccount">
+            <el-input v-model="form.scanAccount" style="width: 240px"></el-input>
           </el-form-item>
           </el-form-item>
-          <el-form-item label="非活动状态登出系统(单位:分钟)" prop="inactiveLogout">
+          <el-form-item label="非活动状态登出系统(设定分钟数)" prop="inactiveLogout">
             <el-input v-model="form.inactiveLogout" style="width: 240px"></el-input>
             <el-input v-model="form.inactiveLogout" style="width: 240px"></el-input>
           </el-form-item>
           </el-form-item>
           <el-form-item label="审计日志保留月数" prop="auditLog">
           <el-form-item label="审计日志保留月数" prop="auditLog">
@@ -79,13 +76,13 @@ export default {
         {value: '1', label: '告警'}
         {value: '1', label: '告警'}
       ],
       ],
       excLevelOptions: [
       excLevelOptions: [
-        {value: '0', label: 'A'},
-        {value: '1', label: 'B'}
+        {value: 'A', label: 'A'},
+        {value: 'B', label: 'B'}
       ],
       ],
       form: {
       form: {
         loginFails: '',
         loginFails: '',
         loginLock: '',
         loginLock: '',
-        scanAccount: '0',
+        scanAccount: '',
         inactiveLogout: '',
         inactiveLogout: '',
         auditLog: '',
         auditLog: '',
         memoryWarn: '',
         memoryWarn: '',
@@ -100,6 +97,10 @@ export default {
           { required: true, message: "登录失败次数限制不能为空", trigger: "blur" },
           { required: true, message: "登录失败次数限制不能为空", trigger: "blur" },
           { pattern: /^([1-9]|10)$/, message: "请输入1-10整数", trigger: "blur"}
           { pattern: /^([1-9]|10)$/, message: "请输入1-10整数", trigger: "blur"}
         ],
         ],
+        scanAccount: [
+          { required: true, message: "扫描未使用的账号不能为空", trigger: "blur" },
+          { pattern: /^([0-9]|(1[0-2]))$/, message: "请输入0-12整数", trigger: "blur"}
+        ],
         loginLock: [
         loginLock: [
           { required: true, message: "登录失败锁定时长不能为空", trigger: "blur" },
           { required: true, message: "登录失败锁定时长不能为空", trigger: "blur" },
           { pattern: /^(?:[2-9]\d|100)$/, message: "请输入20-100整数", trigger: "blur"}
           { pattern: /^(?:[2-9]\d|100)$/, message: "请输入20-100整数", trigger: "blur"}