Procházet zdrojové kódy

增加策略配置功能

xusl před 2 roky
rodič
revize
42a524263f

+ 125 - 0
backend/src/main/java/com/jiayue/ssi/controller/SysPolicyController.java

@@ -0,0 +1,125 @@
+package com.jiayue.ssi.controller;
+
+import cn.hutool.core.util.NumberUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.jiayue.ssi.annotation.OperateLog;
+import com.jiayue.ssi.backenum.AuditType;
+import com.jiayue.ssi.backenum.BusinessType;
+import com.jiayue.ssi.entity.SysPolicy;
+import com.jiayue.ssi.service.SysPolicyService;
+import com.jiayue.ssi.util.*;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ * 策略配置接口
+ *
+ * @author xsl
+ * @since 2023/03/13
+ */
+@RestController
+@RequestMapping("/sysPolicyController")
+@Slf4j
+public class SysPolicyController {
+    @Autowired
+    SysPolicyService sysPolicyService;
+
+    /**
+     * 获取策略配置
+     *
+     * @return 用户信息
+     */
+    @GetMapping(value = "/getAll")
+    @PreAuthorize("@ss.hasPermi('system:policy:getAll')")
+    public ResponseVO getAll() {
+        try {
+            SysPolicy sysPolicy = sysPolicyService.getOne(new QueryWrapper<>());
+            return ResponseVO.success(sysPolicy);
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("获取策略配置信息异常");
+            return ResponseVO.error(null);
+        }
+    }
+
+    /**
+     * 保存策略配置
+     */
+    @PutMapping
+    @OperateLog(title = "策略配置", businessType = BusinessType.UPDATE, auditType = AuditType.SYS)
+    @PreAuthorize("@ss.hasPermi('system:policy:update')")
+    public ResponseVO update(@RequestBody SysPolicy sysPolicy) {
+        if (sysPolicy.getLoginFails()==null) {
+            return ResponseVO.fail("登录失败次数限制不能为空!");
+        } else if (!String.valueOf(sysPolicy.getLoginFails()).matches("^([1-9]|10)$")) {
+            return ResponseVO.fail("登录失败次数限制请输入1-10整数");
+        }
+
+        if (sysPolicy.getLoginLock()==null) {
+            return ResponseVO.fail("登录失败锁定时长不能为空!");
+        } else if (!String.valueOf(sysPolicy.getLoginLock()).matches("^(?:[2-9]\\d|100)$")) {
+            return ResponseVO.fail("登录失败锁定时长请输入20-100整数");
+        }
+
+        if (sysPolicy.getInactiveLogout()==null) {
+            return ResponseVO.fail("非活动状态登出系统不能为空!");
+        } else if (!String.valueOf(sysPolicy.getInactiveLogout()).matches("^(?:[2-9]\\d|100)$")) {
+            return ResponseVO.fail("非活动状态登出系统请输入20-100整数");
+        }
+
+        if (sysPolicy.getMemoryWarn()==null) {
+            return ResponseVO.fail("检测内存低于百分比告警不能为空!");
+        } else if (!String.valueOf(sysPolicy.getMemoryWarn()).matches("^(?:[2-8]\\d|90)$")) {
+            return ResponseVO.fail("检测内存低于百分比告警请输入20-90整数");
+        }
+
+        if (sysPolicy.getAuditLog()==null) {
+            return ResponseVO.fail("审计日志保留月数不能为空!");
+        } else if (!String.valueOf(sysPolicy.getAuditLog()).matches("^([3-9]|(1[0-2]))$")) {
+            return ResponseVO.fail("审计日志保留月数请输入3-12整数");
+        }
+
+        if (StringUtils.isEmpty(sysPolicy.getScanAccount())) {
+            return ResponseVO.fail("自动扫描未使用锁定账号不能为空!");
+        } else if (sysPolicy.getScanAccount().length() > 1) {
+            return ResponseVO.fail("自动扫描未使用锁定账号字符过长!");
+        }
+        if (StringUtils.isEmpty(sysPolicy.getExcNoticeWayA())) {
+            return ResponseVO.fail("A级别异常通知方式不能为空!");
+        } else if (!NumberUtil.isInteger(sysPolicy.getExcNoticeWayA())) {
+            return ResponseVO.fail("A级别异常通知方式不是整型!");
+        }
+        if (StringUtils.isEmpty(sysPolicy.getExcNoticeWayB())) {
+            return ResponseVO.fail("B级别异常通知方式不能为空!");
+        } else if (!NumberUtil.isInteger(sysPolicy.getExcNoticeWayB())) {
+            return ResponseVO.fail("B级别异常通知方式不是整型!");
+        }
+        if (StringUtils.isEmpty(sysPolicy.getExcLevelLogin())) {
+            return ResponseVO.fail("连续登录失败异常级别不能为空!");
+        } else if (!NumberUtil.isInteger(sysPolicy.getExcLevelLogin())) {
+            return ResponseVO.fail("连续登录失败异常级别不是整型!");
+        }
+        if (StringUtils.isEmpty(sysPolicy.getExcLevelSameUser())) {
+            return ResponseVO.fail("同一用户多点登录异常级别不能为空!");
+        } else if (!NumberUtil.isInteger(sysPolicy.getExcLevelSameUser())) {
+            return ResponseVO.fail("同一用户多点登录异常级别不是整型!");
+        }
+
+        try {
+            boolean bo = sysPolicyService.saveOrUpdate(sysPolicy);
+            if (bo) {
+                return ResponseVO.success("策略配置保存成功");
+            } else {
+                log.error("添加用户信息失败");
+                return ResponseVO.fail("策略配置保存失败");
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            log.error("策略配置保存异常");
+            return ResponseVO.fail("策略配置保存失败");
+        }
+    }
+}

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

@@ -0,0 +1,62 @@
+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_policy")
+public class SysPolicy extends BaseEntity{
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 登录失败次数限制(1-10次)
+     */
+    private Integer loginFails;
+    /**
+     * 登录失败锁定时长(至少20分钟)
+     */
+    private Integer loginLock;
+    /**
+     * 是否自动扫描账号(3个月及以上未使用进行锁定),0自动扫描 1不扫描
+     */
+    private String scanAccount;
+    /**
+     * 非活动状态时登出系统(单位:分钟)
+     */
+    private Integer inactiveLogout;
+    /**
+     * 审计日志保留月数
+     */
+    private Integer auditLog;
+    /**
+     * 内存检测小于百分几之报警
+     */
+    private Integer memoryWarn;
+    /**
+     * 连续登录失败异常级别设置(A/B两个级别)
+     */
+    private String excLevelLogin;
+    /**
+     * 同一用户多点登录异常级别设置(A/B两个级别)
+     */
+    private String excLevelSameUser;
+    /**
+     * 异常A级别通知方式(0邮件 1告警)
+     */
+    private String excNoticeWayA;
+    /**
+     * 异常B级别通知方式(0邮件 1告警)
+     */
+    private String excNoticeWayB;
+}

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

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

+ 14 - 0
backend/src/main/java/com/jiayue/ssi/service/SysPolicyService.java

@@ -0,0 +1,14 @@
+package com.jiayue.ssi.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.jiayue.ssi.entity.SysPolicy;
+
+
+/**
+* 策略配置接口
+* @author xsl
+* @date 2023/2/16
+*/
+public interface SysPolicyService extends IService<SysPolicy> {
+
+}

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

@@ -0,0 +1,17 @@
+package com.jiayue.ssi.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.jiayue.ssi.entity.SysPolicy;
+import com.jiayue.ssi.mapper.SysPolicyMapper;
+import com.jiayue.ssi.service.SysPolicyService;
+import org.springframework.stereotype.Service;
+
+/**
+* 用户管理服务类
+* @author xsl
+* @date 2023/2/16
+*/
+@Service
+public class SysPolicyServiceImpl extends ServiceImpl<SysPolicyMapper, SysPolicy> implements SysPolicyService {
+
+}

+ 37 - 1
ui/src/layout/components/Navbar.vue

@@ -17,7 +17,16 @@
 <!--          <ruo-yi-doc id="ruoyi-doc" class="right-menu-item hover-effect" />-->
 <!--          <ruo-yi-doc id="ruoyi-doc" class="right-menu-item hover-effect" />-->
 <!--        </el-tooltip>-->
 <!--        </el-tooltip>-->
 
 
-        <screenfull id="screenfull" class="right-menu-item hover-effect" />
+      <!-- 消息中心 -->
+      <el-badge is-dot class="item">
+        <span class="el-icon-bell"></span>
+      </el-badge>
+
+
+
+
+
+      <screenfull id="screenfull" class="right-menu-item hover-effect" />
 
 
 <!--        <el-tooltip content="布局大小" effect="dark" placement="bottom">-->
 <!--        <el-tooltip content="布局大小" effect="dark" placement="bottom">-->
 <!--          <size-select id="size-select" class="right-menu-item hover-effect" />-->
 <!--          <size-select id="size-select" class="right-menu-item hover-effect" />-->
@@ -56,6 +65,12 @@ import Screenfull from '@/components/Screenfull'
 // import RuoYiDoc from '@/components/RuoYi/Doc'
 // import RuoYiDoc from '@/components/RuoYi/Doc'
 
 
 export default {
 export default {
+  data() {
+    return {
+      message: 2
+    }
+  },
+
   components: {
   components: {
     Breadcrumb,
     Breadcrumb,
     TopNav,
     TopNav,
@@ -118,6 +133,27 @@ export default {
 </script>
 </script>
 
 
 <style lang="scss" scoped>
 <style lang="scss" scoped>
+.item {
+  margin-top: 0px;
+  margin-right: 15px;
+}
+.btn-bell{
+  position: relative;
+  text-align: center;
+  border-radius: 15px;
+  cursor: pointer;
+}
+.btn-bell-badge{
+  position: absolute;
+  right: 0;
+  top: -2px;
+  border-radius: 4px;
+  background: #f56c6c;
+  color: #fff;
+}
+.btn-bell .el-icon-bell{
+  color: #fff;
+}
 .navbar {
 .navbar {
   height: 50px;
   height: 50px;
   overflow: hidden;
   overflow: hidden;

+ 155 - 0
ui/src/views/sysManager/sysPolicy/index.vue

@@ -0,0 +1,155 @@
+<template>
+  <div class="app-container">
+        <el-form :model="form" ref="form" :rules="rules" size="small"  label-width="250px">
+          <el-form-item label="登录失败次数限制" prop="loginFails">
+            <el-input v-model="form.loginFails" style="width: 240px"></el-input>
+          </el-form-item>
+          <el-form-item label="登录失败锁定时长(至少20分钟)" prop="loginLock">
+            <el-input v-model="form.loginLock" style="width: 240px"></el-input>
+          </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>
+          <el-form-item label="非活动状态登出系统(单位:分钟)" prop="inactiveLogout">
+            <el-input v-model="form.inactiveLogout" style="width: 240px"></el-input>
+          </el-form-item>
+          <el-form-item label="审计日志保留月数" prop="auditLog">
+            <el-input v-model="form.auditLog" style="width: 240px"></el-input>
+          </el-form-item>
+          <el-form-item label="检测内存低于百分比告警" prop="memoryWarn">
+            <el-input v-model="form.memoryWarn" style="width: 240px"></el-input>
+          </el-form-item>
+          <el-form-item label="A级别异常通知方式" prop="excNoticeWayA">
+            <el-select style="width: 240px" v-model="form.excNoticeWayA" placeholder="请选择通知方式">
+              <el-option
+                v-for="item in excNoticeOptions"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="B级别异常通知方式" prop="excNoticeWayB">
+            <el-select style="width: 240px" v-model="form.excNoticeWayB" placeholder="请选择通知方式">
+              <el-option
+                v-for="item in excNoticeOptions"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="连续登录失败异常级别" prop="excLevelLogin">
+            <el-select style="width: 240px" v-model="form.excLevelLogin" placeholder="请选择异常级别">
+              <el-option
+                v-for="item in excLevelOptions"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="同一用户多点登录异常级别" prop="excLevelSameUser">
+            <el-select style="width: 240px" v-model="form.excLevelSameUser" placeholder="请选择异常级别">
+              <el-option
+                v-for="item in excLevelOptions"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value"
+              ></el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item>
+            <el-button type="primary" @click="onSubmit">保存</el-button>
+          </el-form-item>
+        </el-form>
+  </div>
+</template>
+<script>
+import {debounce} from "lodash";
+
+export default {
+  data() {
+    return {
+      excNoticeOptions: [
+        {value: '0', label: '邮件'},
+        {value: '1', label: '告警'}
+      ],
+      excLevelOptions: [
+        {value: '0', label: 'A'},
+        {value: '1', label: 'B'}
+      ],
+      form: {
+        loginFails: '',
+        loginLock: '',
+        scanAccount: '0',
+        inactiveLogout: '',
+        auditLog: '',
+        memoryWarn: '',
+        excNoticeWayA: '0',
+        excNoticeWayB: '0',
+        excLevelLogin: "0",
+        excLevelSameUser: '0',
+      },
+      // 表单校验
+      rules: {
+        loginFails: [
+          { required: true, message: "登录失败次数限制不能为空", trigger: "blur" },
+          { pattern: /^([1-9]|10)$/, message: "请输入1-10整数", trigger: "blur"}
+        ],
+        loginLock: [
+          { required: true, message: "登录失败锁定时长不能为空", trigger: "blur" },
+          { pattern: /^(?:[2-9]\d|100)$/, message: "请输入20-100整数", trigger: "blur"}
+        ],
+        inactiveLogout: [
+          { required: true, message: "非活动状态登出系统不能为空", trigger: "blur" },
+          { pattern: /^(?:[2-9]\d|100)$/, message: "请输入20-100整数", trigger: "blur"}
+        ],
+        auditLog: [
+          { required: true, message: "审计日志保留月数不能为空", trigger: "blur" },
+          { pattern: /^([3-9]|(1[0-2]))$/, message: "请输入3-12整数", trigger: "blur"}
+        ],
+        memoryWarn: [
+          { required: true, message: "检测内存低于百分比告警不能为空", trigger: "blur" },
+          { pattern: /^(?:[2-8]\d|90)$/, message: "请输入20-90整数", trigger: "blur"}
+        ]
+      },
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    /** 查询用户列表 */
+    getList(){
+      this.$axios.get('/sysPolicyController/getAll').then((res) => {
+        this.form = res.data
+      }).catch((error) => {
+        // this.$message.error(error)
+      })
+    },
+    onSubmit:debounce(function(){
+      this.loading = true
+      this.$axios.put('/sysPolicyController', this.form).then((res) => {
+        if (res.code == 0) {
+          this.$message.success('策略配置保存成功')
+        }
+        if (res.code == 1) {
+          this.$message.error(res.data)
+        }
+        this.loading = false
+      }).catch((error) => {
+        this.$message.error(error)
+        this.loading = false
+      })
+    },1000)
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+
+</style>