ludc
2023-11-28 4a2c9c11f6e660483b2a8ece1d76fc7ee138181d
登录日志代码提交
已修改14个文件
已删除1个文件
255 ■■■■■ 文件已修改
Source/UBCS-WEB/src/views/monitor/log/localLog.vue 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/monitor/log/loginLog.vue 43 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-auth/src/main/java/com/vci/ubcs/auth/endpoint/BladeTokenEndPoint.java 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-auth/src/main/java/com/vci/ubcs/auth/service/BladeUserDetailsServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops-api/ubcs-log-api/src/main/java/com/vci/ubcs/log/entity/LogOperate.java 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops-api/ubcs-log-api/src/main/java/com/vci/ubcs/log/enumpack/ServiceNameRoleEnum.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/LogApplication.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/controller/LogLocalController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/controller/LogOperateController.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/feign/LogClient.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/mapper/LogOperateMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/service/ILogOperateService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/service/impl/LogOperateServiceImpl.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/mapper/RoleMapper.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/impl/StrategyServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
Source/UBCS-WEB/src/views/monitor/log/localLog.vue
@@ -90,21 +90,22 @@
            {
              label: "日志名称",
              prop: "logName",
              width:'80',
              width:'160',
            },
            {
              label: "日志类型",
              prop: "logType"
              prop: "logType",
              width:'160'
            },
            {
              label: "创建时间",
              prop: "createTime",
              width:'180'
              width:'160'
            },
            {
              label: "最后修改时间",
              prop: "lastModifier",
              width:'180'
              width:'160'
            }
          ]
        },
@@ -117,22 +118,15 @@
      permissionList() {
        return {
          delBtn: this.vaildData(this.permission.localLog.localLog_delete, false),
          downLoadBtn: this.vaildData(this.permission.localLog.localLog_dwonload, false)
          downLoadBtn: this.vaildData(this.permission.localLog.localLog_download, false)
        };
      }
    },
    methods: {
      // åˆ¤æ–­å®¢æˆ·ç«¯æ‰€åœ¨çš„æ“ä½œç³»ç»Ÿå¹³å°
      isWindows() {
        return navigator.platform.indexOf('Win') !== -1
      },
      // æ ¹æ®æ“ä½œç³»ç»Ÿå¹³å°è¿”回相应的路径分隔符
      getPathSeparator() {
        return this.isWindows() ? '\\' : '/'
      },
    methods: {
      downLoadLogFile(row){
          this.downloadLoading = true;
          let logPath = row.hasChildren ?  row.logPath:row.logPath+this.getPathSeparator()+row.logName;
          let logPath = row.hasChildren ? row.logPath:row.logPath+"\\"+row.logName;
          downLoadLog(Object.assign({},row,{logFullPaths:logPath})).then(res=>{
              func.downloadFileByBlobHandler(res);
              this.downloadLoading = false;
Source/UBCS-WEB/src/views/monitor/log/loginLog.vue
@@ -19,7 +19,7 @@
</template>
<script>
  import {getUsualList, getUsualLogs} from "@/api/logs";
  import { listLogOperate } from "@/api/logs";
  import {mapGetters} from "vuex";
  export default {
@@ -28,6 +28,10 @@
        form: {},
        selectionList: [],
        query: {},
        //是否是三员管理员日志
        isAdmin: 0,
        // LoginOrLogout:登录日志,auth:授权日志,operate:操作日志
        logType: "LoginOrLogout",
        loading: true,
        page: {
          pageSize: 10,
@@ -52,34 +56,34 @@
          column: [
            {
              label: "用户名",
              prop: "serviceId",
              prop: "userName",
              search: true
            },
            {
              label: "姓名",
              prop: "serverHost",
              prop: "realName",
              search: true
            },
            {
              label: "用户id",
              prop: "serverIp"
              label: "用户ip",
              prop: "ip"
            },
            {
              label: "模块",
              prop: "env",
              width:'80'
              prop: "model",
              width:'160'
            },
            {
              label: "时间",
              prop: "logLevel"
              prop: "time"
            },
            {
              label: "操作结果",
              prop: "logId"
              prop: "operateResult"
            },
            {
              label: "描述",
              prop: "requestUri"
              prop: "description"
            },
          ]
        },
@@ -92,7 +96,7 @@
        return {
          viewBtn: this.vaildData(this.permission.log_usual.log_usual_view, false)
        };
      }
      },
    },
    methods: {
      searchReset() {
@@ -104,6 +108,9 @@
        this.page.currentPage = 1;
        this.onLoad(this.page, params);
        done();
      },
      underscoreName(key) {
        return key.replace(/([A-Z])/g, "_$1").toLowerCase();
      },
      beforeOpen(done, type) {
        if (["edit", "view"].includes(type)) {
@@ -123,8 +130,20 @@
        this.onLoad(this.page, this.query);
      },
      onLoad(page, params = {}) {
        let conditionMaps = {};
        conditionMaps["conditionMap[is_admin]"] = this.isAdmin;
        conditionMaps["conditionMap[log_type]"] = this.logType.trim();
        if (params) {
          Object.keys(params).forEach((key) => {
            conditionMaps["conditionMap[" + this.underscoreName(key) + "_like]"] = params[key].trim();
          });
        }
        this.loading = true;
        getUsualList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
        listLogOperate(
          page.currentPage,
          page.pageSize,
          conditionMaps
        ).then(res => {
          const data = res.data.data;
          this.page.total = data.total;
          this.data = data.records;
Source/UBCS/ubcs-auth/src/main/java/com/vci/ubcs/auth/endpoint/BladeTokenEndPoint.java
@@ -24,6 +24,8 @@
import org.springblade.core.jwt.JwtUtil;
import org.springblade.core.jwt.props.JwtProperties;
import org.springblade.core.launch.constant.TokenConstant;
import org.springblade.core.log.annotation.ApiLog;
import org.springblade.core.log.annotation.LoginOrLogoutLog;
import org.springblade.core.redis.cache.BladeRedis;
import org.springblade.core.secure.BladeUser;
import org.springblade.core.secure.utils.AuthUtil;
@@ -32,37 +34,16 @@
import org.springblade.core.tool.support.Kv;
import org.springblade.core.tool.utils.StringUtil;
import org.springblade.core.tool.utils.WebUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.authentication.InsufficientAuthenticationException;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.oauth2.common.OAuth2AccessToken;
import org.springframework.security.oauth2.common.OAuth2RefreshToken;
import org.springframework.security.oauth2.common.exceptions.InvalidClientException;
import org.springframework.security.oauth2.common.exceptions.InvalidGrantException;
import org.springframework.security.oauth2.common.exceptions.InvalidRequestException;
import org.springframework.security.oauth2.common.exceptions.UnsupportedGrantTypeException;
import org.springframework.security.oauth2.common.util.OAuth2Utils;
import org.springframework.security.oauth2.provider.AuthorizationRequest;
import org.springframework.security.oauth2.provider.ClientDetails;
import org.springframework.security.oauth2.provider.ClientDetailsService;
import org.springframework.security.oauth2.provider.TokenRequest;
import org.springframework.security.oauth2.provider.endpoint.TokenEndpoint;
import org.springframework.security.oauth2.provider.token.TokenStore;
import org.springframework.util.StringUtils;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import java.security.Principal;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpSession;
import java.time.Duration;
@@ -135,6 +116,7 @@
     * é€€å‡ºç™»å½•
     */
    @GetMapping("/oauth/logout")
    @LoginOrLogoutLog("logout")
    public Kv logout() {
        BladeUser user = AuthUtil.getUser();
        String token = JwtUtil.getToken(WebUtil.getRequest().getHeader(TokenConstant.HEADER));
Source/UBCS/ubcs-auth/src/main/java/com/vci/ubcs/auth/service/BladeUserDetailsServiceImpl.java
@@ -18,6 +18,7 @@
import com.alibaba.nacos.common.utils.StringUtils;
import com.vci.ubcs.auth.constant.AuthConstant;
import com.vci.ubcs.auth.support.BladePasswordEncoderFactories;
import com.vci.ubcs.auth.utils.TokenUtil;
import com.vci.ubcs.system.user.entity.User;
import com.vci.ubcs.system.user.entity.UserInfo;
@@ -30,6 +31,7 @@
import com.vci.ubcs.common.cache.CacheNames;
import org.springblade.core.jwt.JwtUtil;
import org.springblade.core.jwt.props.JwtProperties;
import org.springblade.core.log.annotation.LoginOrLogoutLog;
import org.springblade.core.redis.cache.BladeRedis;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.api.R;
@@ -99,6 +101,7 @@
    @Override
    @SneakyThrows
    @LoginOrLogoutLog("login")
    public BladeUserDetails loadUserByUsername(String username) {
        HttpServletRequest request = WebUtil.getRequest();
        // èŽ·å–ç”¨æˆ·ç»‘å®šID
@@ -136,9 +139,9 @@
        //超级管理员配置文件配置账号密码,实现登录, é»˜è®¤ç§Ÿæˆ·id和超管为配置出来的
        if(tenantId.equals(this.tenantId) && userName.equals(username)){
            if (!this.userName.equals(username) && !password.equalsIgnoreCase(this.password)) {
            if (!this.userName.equals(username) || !BladePasswordEncoderFactories.createDelegatingPasswordEncoder().encode(password).equalsIgnoreCase(AuthConstant.ENCRYPT+this.password)) {
                setFailCount(tenantId, username, count,strategy.getLockingTime());
                throw new UsernameNotFoundException(TokenUtil.USER_NOT_FOUND);
                throw new UsernameNotFoundException(TokenUtil.USER_NOT_FOUND+"还有【"+(failCount-count)+"】次尝试机会!");
            }
            //如果ip比对后get抛出异常No value present就直接抛异常结束登录
            if(ipEnable){
@@ -194,7 +197,7 @@
                // ç”¨æˆ·ä¸å­˜åœ¨,但提示用户名与密码错误并锁定账号
                if (user == null || user.getId() == null) {
                    setFailCount(tenantId, username, count,strategy.getLockingTime());
                    throw new UsernameNotFoundException(TokenUtil.USER_NOT_FOUND);
                    throw new UsernameNotFoundException(TokenUtil.USER_NOT_FOUND+"还有【"+(failCount-count)+"】次尝试机会!");
                }
                // ç”¨æˆ·çŠ¶æ€ä¸º1时说明该用户被锁定
                if(user.getUserStatus() == 1){
@@ -204,7 +207,7 @@
                // ç”¨æˆ·å­˜åœ¨ä½†å¯†ç é”™è¯¯,超过次数则锁定账号
                if (grantType != null && !grantType.equals(TokenUtil.REFRESH_TOKEN_KEY) && !user.getPassword().equals(hex)) {
                    setFailCount(tenantId, username, count,strategy.getLockingTime());
                    throw new UsernameNotFoundException(TokenUtil.USER_NOT_FOUND);
                    throw new UsernameNotFoundException(TokenUtil.USER_NOT_FOUND+"还有【"+(failCount-count)+"】次尝试机会!");
                }
                // ç”¨æˆ·è§’色不存在
                if (Func.isEmpty(userInfo.getRoles())) {
Source/UBCS/ubcs-ops-api/ubcs-log-api/src/main/java/com/vci/ubcs/log/entity/LogOperate.java
ÎļþÒÑɾ³ý
Source/UBCS/ubcs-ops-api/ubcs-log-api/src/main/java/com/vci/ubcs/log/enumpack/ServiceNameRoleEnum.java
@@ -71,7 +71,7 @@
    /**
     * ç”¨æˆ·ä¿¡æ¯ç®¡ç†æœåŠ¡
     */
    UBCS_ADMIN("ubcs_user","服务治理服务")
    UBCS_ADMIN("ubcs_admin","服务治理服务")
    ;
Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/LogApplication.java
@@ -29,7 +29,7 @@
 * @author Chill
 */
@EnableDiscoveryClient
@EnableFeignClients(basePackages = {"com.vci.ubcs", "org.springblade"})
@EnableFeignClients("org.springblade")
@SpringBootApplication
public class LogApplication {
Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/controller/LogLocalController.java
@@ -9,6 +9,7 @@
import com.vci.ubcs.starter.web.util.LangBaseUtil;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.core.tool.api.R;
import org.springframework.web.bind.annotation.*;
Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/controller/LogOperateController.java
@@ -1,10 +1,15 @@
package com.vci.ubcs.log.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.vci.ubcs.log.service.ILogOperateService;
import com.vci.ubcs.starter.web.pagemodel.BladeQueryObject;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springblade.core.log.model.LogOperate;
import org.springblade.core.tenant.annotation.NonDS;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springblade.core.tool.api.R;
import org.springframework.web.bind.annotation.*;
/**
 * æ“ä½œæ—¥å¿—管理:(包括登录日志、操作日志、授权日志,以及管理员的以上三种日志)
@@ -18,6 +23,16 @@
@RequestMapping("/operateLog")
public class LogOperateController {
    private final ILogOperateService operateLogService;
    /**
     * æŸ¥è¯¢æ—¥å¿—列表
     * @param bladeQueryObject
     * @return
     */
    @GetMapping("/listLogOperate")
    public R<IPage<LogOperate>> listLogOperate(BladeQueryObject bladeQueryObject) {
        return R.data(operateLogService.listByCondition(bladeQueryObject));
    }
}
Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/feign/LogClient.java
@@ -17,13 +17,16 @@
package com.vci.ubcs.log.feign;
import org.springblade.core.log.model.LogOperate;
import com.vci.ubcs.log.service.ILogApiService;
import com.vci.ubcs.log.service.ILogErrorService;
import com.vci.ubcs.log.service.ILogOperateService;
import com.vci.ubcs.log.service.ILogUsualService;
import org.springblade.core.log.feign.ILogClient;
import org.springblade.core.log.model.LogError;
import lombok.AllArgsConstructor;
import org.springblade.core.log.model.LogApi;
import org.springblade.core.log.model.LogOperate;
import org.springblade.core.log.model.LogUsual;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.core.tool.api.R;
@@ -47,6 +50,8 @@
    private final ILogErrorService errorLogService;
    private final ILogOperateService operateLogService;
    @Override
    @PostMapping(API_PREFIX + "/saveUsualLog")
    public R<Boolean> saveUsualLog(@RequestBody LogUsual log) {
@@ -68,6 +73,10 @@
        return R.data(errorLogService.save(log));
    }
    @Override
    @PostMapping(API_PREFIX + "/saveOpereateLog")
    public R<Boolean> saveOpereateLog(@RequestBody LogOperate logOperate) {
        return R.data(operateLogService.saveLogOperate(logOperate));
    }
}
Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/mapper/LogOperateMapper.java
@@ -1,8 +1,8 @@
package com.vci.ubcs.log.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.vci.ubcs.log.entity.LogOperate;
import org.apache.ibatis.annotations.Mapper;
import org.springblade.core.log.model.LogOperate;
/**
 * æ“ä½œæ—¥å¿—管理:(包括登录日志、操作日志、授权日志,以及管理员的以上三种日志)
Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/service/ILogOperateService.java
@@ -1,11 +1,12 @@
package com.vci.ubcs.log.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.vci.ubcs.log.entity.LogOperate;
import com.vci.ubcs.starter.web.pagemodel.BladeQueryObject;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.log.model.LogOperate;
import java.util.List;
/**
 * æ“ä½œæ—¥å¿—管理:(包括登录日志、操作日志、授权日志,以及管理员的以上三种日志)
@@ -26,6 +27,6 @@
     * @param bladeQueryObject
     * @return
     */
    List<LogOperate> listByCondition(BladeQueryObject bladeQueryObject) throws ServiceException;
    IPage<LogOperate> listByCondition(BladeQueryObject bladeQueryObject) throws ServiceException;
}
Source/UBCS/ubcs-ops/ubcs-log/src/main/java/com/vci/ubcs/log/service/impl/LogOperateServiceImpl.java
@@ -1,19 +1,20 @@
package com.vci.ubcs.log.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import com.vci.ubcs.log.entity.LogOperate;
import com.vci.ubcs.log.mapper.LogOperateMapper;
import com.vci.ubcs.log.service.ILogOperateService;
import com.vci.ubcs.starter.util.UBCSCondition;
import com.vci.ubcs.starter.web.pagemodel.BladeQueryObject;
import org.springblade.core.log.exception.ServiceException;
import org.springblade.core.log.model.LogOperate;
import org.springblade.core.mp.support.Condition;
import org.springblade.core.secure.utils.AuthUtil;
import org.springblade.core.tool.utils.Func;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Locale;
import java.util.Map;
/**
@@ -22,7 +23,7 @@
 * @date 2023/11/24 10:51
 */
@Service
public class LogOperateServiceImpl extends ServiceImpl<LogOperateMapper,LogOperate> implements ILogOperateService {
public class LogOperateServiceImpl extends ServiceImpl<LogOperateMapper, LogOperate> implements ILogOperateService {
    @Autowired
    private LogOperateMapper logOperateMapper;
@@ -37,6 +38,12 @@
        if(Func.isEmpty(logOperate)){
            return false;
        }
        // èŽ·å–åˆ°è§’è‰²åç§°åˆ¤æ–­æ˜¯å¦ä¸ºä¸‰å‘˜ç®¡ç†å‘˜
        String userRole = AuthUtil.getUserRole().toLowerCase(Locale.ROOT);
        userRole = Func.isBlank(userRole) ? logOperate.getUserName():userRole;
        if(userRole.contains("auditadmin") || userRole.contains("sysadmin") || userRole.contains("secadmin") || userRole.contains("admin")){
            logOperate.setIsAdmin(1);
        }
        return SqlHelper.retBool(logOperateMapper.insert(logOperate));
    }
@@ -46,14 +53,15 @@
     * @return
     */
    @Override
    public List<LogOperate> listByCondition(BladeQueryObject bladeQueryObject) throws ServiceException{
    public IPage<LogOperate> listByCondition(BladeQueryObject bladeQueryObject) throws ServiceException{
        Map<String, Object> conditionMap = bladeQueryObject.getConditionMap();
        if(conditionMap.isEmpty() || Func.isBlank(conditionMap.get("logType").toString())){
        // ä¸»è¦ä¸ºäº†åŒºåˆ†æ˜¯æ“ä½œæ—¥å¿—还是登录日志等
        if(conditionMap.isEmpty() || Func.isBlank(conditionMap.get("log_type").toString())){
            throw new ServiceException("日志查询必传参数【日志类型】不能为空!");
        }
        // map对象转换为查询对象
        QueryWrapper<LogOperate> queryWrapper = Condition.getQueryWrapper(bladeQueryObject.getConditionMap(),LogOperate.class);
        return this.list(queryWrapper);
        IPage<LogOperate> logOperateIPage = this.logOperateMapper.selectPage(Condition.getPage(bladeQueryObject.getQuery().setDescs("TIME")), UBCSCondition.getQueryWrapper(bladeQueryObject.getConditionMap(), LogOperate.class));
        return logOperateIPage;
    }
}
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/mapper/RoleMapper.java
@@ -52,7 +52,6 @@
     * èŽ·å–æ ‘å½¢èŠ‚ç‚¹
     *
     * @param tenantId
     * @param excludeRole
     * @return
     */
    List<RoleVO> roleList(String tenantId);
Source/UBCS/ubcs-service/ubcs-system/src/main/java/com/vci/ubcs/system/service/impl/StrategyServiceImpl.java
@@ -150,7 +150,7 @@
            }
            strategy.setUpdateTime(new Date());
            CacheUtil.clear(SYS_CACHE, Boolean.FALSE);
            boolean temp1 = super.saveOrUpdate(strategy);
            boolean temp1 = this.update(strategy,Wrappers.<Strategy>update().lambda().eq(Strategy::getId,strategy.getId()));
            boolean temp2 = false;
            if(Func.isNotEmpty(oldIsDefaultStrategy)){
                temp2 = updateUserStrategyDefault(temp1, oldIsDefaultStrategy);