Browse Source

update

main
wangshaoping 1 year ago
parent
commit
685c62086f
  1. 2
      io.sc.platform.core.frontend/package.json
  2. 17
      io.sc.platform.core.frontend/src/platform/components-ext/options/BooleanOptions.ts
  3. 6
      io.sc.platform.core.frontend/src/platform/components-ext/options/index.ts
  4. 4
      io.sc.platform.core.frontend/template-project/package.json
  5. 3
      io.sc.platform.core/src/main/java/io/sc/platform/core/annotation/AuditLog.java
  6. 2
      io.sc.platform.core/src/main/java/io/sc/platform/core/audit/AuditLog.java
  7. 17
      io.sc.platform.core/src/main/java/io/sc/platform/core/audit/AuditLogAction.java
  8. 23
      io.sc.platform.core/src/main/java/io/sc/platform/core/enums/AuditLogAction.java
  9. 2
      io.sc.platform.core/src/main/java/io/sc/platform/core/enums/AuditLogStatus.java
  10. 3
      io.sc.platform.core/src/main/java/io/sc/platform/core/enums/LogLevel.java
  11. 12
      io.sc.platform.core/src/main/java/io/sc/platform/core/util/EnumUtil.java
  12. 32
      io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/enums.properties
  13. 32
      io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/enums_tw_CN.properties
  14. 32
      io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/enums_zh_CN.properties
  15. 1
      io.sc.platform.mvc/build.gradle
  16. 14
      io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/autoconfigure/support/AuditLogAspectorBean.java
  17. 104
      io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/controller/support/RestCrudController.java
  18. 2
      io.sc.platform.orm/src/main/java/io/sc/platform/orm/service/support/QueryResult.java
  19. 29
      io.sc.platform.security.loginform/src/main/java/io/sc/platform/security/loginform/autoconfigure/WebSecurityAutoConfiguration.java
  20. 2
      io.sc.platform.security.oauth2.server.authorization/src/main/java/io/sc/platform/security/oauth2/server/authorization/configure/PlatformOauth2AuthorizationServerAutoConfiguration.java
  21. 2
      io.sc.platform.security.oauth2.server.authorization/src/main/java/io/sc/platform/security/oauth2/server/authorization/configure/PlatformWebSecurityAutoConfiguration.java
  22. 2
      io.sc.platform.security.oauth2.server.authorization/src/main/java/io/sc/platform/security/oauth2/server/authorization/configure/SecurityAutoConfiguration.java
  23. 2
      io.sc.platform.security.oauth2.server.resource/src/main/java/io/sc/platform/security/oauth2/server/resource/configure/PlatformOauth2ResourceServerAutoConfiguration.java
  24. 1
      io.sc.platform.security/src/main/java/io/sc/platform/security/autoconfigure/PlatformWebSecurityAutoConfiguration.java
  25. 37
      io.sc.platform.security/src/main/java/io/sc/platform/security/handler/PlatformAuthenticationFailureHandler.java
  26. 30
      io.sc.platform.security/src/main/java/io/sc/platform/security/handler/PlatformAuthenticationSuccessHandler.java
  27. 48
      io.sc.platform.security/src/main/java/io/sc/platform/security/handler/PlatformLogoutSuccessHandler.java
  28. 2
      io.sc.platform.security/src/main/java/io/sc/platform/security/service/impl/UserDetailsServiceImpl.java
  29. 2
      io.sc.platform.system.frontend/package.json
  30. 20
      io.sc.platform.system.frontend/src/views/corporation/Corporation.vue
  31. 32
      io.sc.platform.system.frontend/src/views/monitor/AuditLog.vue
  32. 21
      io.sc.platform.system.frontend/src/views/monitor/Log.vue
  33. 102
      io.sc.platform.system/src/main/java/io/sc/platform/system/monitor/controller/LogViewerWebController.java
  34. 25
      io.sc.platform.system/src/main/java/io/sc/platform/system/monitor/support/LogLevelConfiguredLevelComparator.java
  35. 24
      io.sc.platform.system/src/main/java/io/sc/platform/system/monitor/support/LogLevelEffectiveLevelComparator.java
  36. 26
      io.sc.platform.system/src/main/java/io/sc/platform/system/monitor/support/LogLevelNameComparator.java
  37. 5
      io.sc.platform.system/src/main/resources/META-INF/platform/plugins/p6spy.json

2
io.sc.platform.core.frontend/package.json

@ -1,6 +1,6 @@
{ {
"name": "platform-core", "name": "platform-core",
"version": "8.1.92", "version": "8.1.94",
"description": "前端核心包,用于快速构建前端的脚手架", "description": "前端核心包,用于快速构建前端的脚手架",
"//main": "库的主文件", "//main": "库的主文件",
"main": "dist/platform-core.js", "main": "dist/platform-core.js",

17
io.sc.platform.core.frontend/src/platform/components-ext/options/BooleanOptions.ts

@ -30,4 +30,19 @@ const trueFalse = (includeEmpty: boolean = true) => {
} }
}; };
export { yesNo, trueFalse }; const successFailed = (includeEmpty: boolean = true) => {
if (includeEmpty) {
return [
{ value: null, label: '' },
{ value: 'success', label: i18n.global.t('success') },
{ value: 'failed', label: i18n.global.t('failed') },
];
} else {
return [
{ value: 'success', label: i18n.global.t('success') },
{ value: 'failed', label: i18n.global.t('failed') },
];
}
};
export { yesNo, trueFalse, successFailed };

6
io.sc.platform.core.frontend/src/platform/components-ext/options/index.ts

@ -1,5 +1,5 @@
import type { EnumType } from '@/platform/types'; import type { EnumType } from '@/platform/types';
import { yesNo, trueFalse } from './BooleanOptions'; import { yesNo, trueFalse, successFailed } from './BooleanOptions';
import { EnumOptions } from './EnumOptions'; import { EnumOptions } from './EnumOptions';
class Options { class Options {
@ -13,6 +13,10 @@ class Options {
return trueFalse(); return trueFalse();
} }
public static successFailed() {
return successFailed();
}
public static enum(enumType: EnumType, includeEmpty: boolean = true) { public static enum(enumType: EnumType, includeEmpty: boolean = true) {
if (enumType) { if (enumType) {
let enumOptions = Options.#enumOptionsMap[enumType.name]; let enumOptions = Options.#enumOptionsMap[enumType.name];

4
io.sc.platform.core.frontend/template-project/package.json

@ -1,6 +1,6 @@
{ {
"name": "platform-core", "name": "platform-core",
"version": "8.1.92", "version": "8.1.94",
"description": "前端核心包,用于快速构建前端的脚手架", "description": "前端核心包,用于快速构建前端的脚手架",
"private": false, "private": false,
"keywords": [], "keywords": [],
@ -92,7 +92,7 @@
"luckyexcel": "1.0.1", "luckyexcel": "1.0.1",
"mockjs": "1.1.0", "mockjs": "1.1.0",
"pinia": "2.1.7", "pinia": "2.1.7",
"platform-core": "8.1.92", "platform-core": "8.1.94",
"quasar": "2.14.2", "quasar": "2.14.2",
"tailwindcss": "3.4.0", "tailwindcss": "3.4.0",
"vue": "3.4.3", "vue": "3.4.3",

3
io.sc.platform.core/src/main/java/io/sc/platform/core/annotation/AuditLog.java

@ -1,5 +1,6 @@
package io.sc.platform.core.annotation; package io.sc.platform.core.annotation;
import io.sc.platform.core.enums.AuditLogAction;
import org.springframework.core.annotation.AliasFor; import org.springframework.core.annotation.AliasFor;
import java.lang.annotation.Documented; import java.lang.annotation.Documented;
@ -25,4 +26,6 @@ public @interface AuditLog {
@AliasFor("value") @AliasFor("value")
String category() default ""; String category() default "";
AuditLogAction action() default AuditLogAction.UNKNOWN;
} }

2
io.sc.platform.core/src/main/java/io/sc/platform/core/audit/AuditLog.java

@ -26,7 +26,7 @@ public class AuditLog {
private String action; //AuditLog 注解中指定的操作 private String action; //AuditLog 注解中指定的操作
private String status; //请求方法的执行状态 private String status; //请求方法的执行状态
private Date startDate; //方法开始执行时间 private Date startDate =new Date();//方法开始执行时间
private Long executeTime; //方法执行的时间(单位:毫秒) private Long executeTime; //方法执行的时间(单位:毫秒)
private String url; //请求的 URL private String url; //请求的 URL

17
io.sc.platform.core/src/main/java/io/sc/platform/core/audit/AuditLogAction.java

@ -1,17 +0,0 @@
package io.sc.platform.core.audit;
/**
* 审计日志分类常量
*/
public class AuditLogAction {
public static final String ADD ="io.sc.platform.core.audit.AuditLogAction.ADD";
public static final String REMOVE ="io.sc.platform.core.audit.AuditLogAction.REMOVE";
public static final String UPDATE ="io.sc.platform.core.audit.AuditLogAction.UPDATE";
public static final String QUERY ="io.sc.platform.core.audit.AuditLogAction.QUERY";
public static final String FIND_ONE ="io.sc.platform.core.audit.AuditLogAction.FIND_ONE";
public static final String EXPORT ="io.sc.platform.core.audit.AuditLogAction.EXPORT";
public static final String LOGIN ="io.sc.platform.core.audit.AuditLogAction.LOGIN";
public static final String LOGOUT ="io.sc.platform.core.audit.AuditLogAction.LOGOUT";
private AuditLogAction(){}
}

23
io.sc.platform.core/src/main/java/io/sc/platform/core/enums/AuditLogAction.java

@ -0,0 +1,23 @@
package io.sc.platform.core.enums;
public enum AuditLogAction {
UNKNOWN("UNKNOWN"),
ADD("ADD"),
REMOVE("REMOVE"),
UPDATE("UPDATE"),
QUERY("QUERY"),
FIND_ONE("FIND_ONE"),
EXPORT("EXPORT"),
LOGIN("LOGIN"),
LOGOUT("LOGOUT");
private final String value;
private AuditLogAction(String value){
this.value =value;
}
public String getValue(){
return this.value;
}
}

2
io.sc.platform.core/src/main/java/io/sc/platform/core/audit/AuditLogStatus.java → io.sc.platform.core/src/main/java/io/sc/platform/core/enums/AuditLogStatus.java

@ -1,4 +1,4 @@
package io.sc.platform.core.audit; package io.sc.platform.core.enums;
/** /**
* 审计日志状态枚举 * 审计日志状态枚举

3
io.sc.platform.core/src/main/java/io/sc/platform/core/support/LogLevel.java → io.sc.platform.core/src/main/java/io/sc/platform/core/enums/LogLevel.java

@ -1,10 +1,9 @@
package io.sc.platform.core.support; package io.sc.platform.core.enums;
/** /**
* 日志级别枚举 * 日志级别枚举
*/ */
public enum LogLevel { public enum LogLevel {
OFF, //关闭
ERROR, //错误 ERROR, //错误
WARN, //警告 WARN, //警告
INFO, //信息 INFO, //信息

12
io.sc.platform.core/src/main/java/io/sc/platform/core/util/EnumUtil.java

@ -140,6 +140,18 @@ public class EnumUtil {
return null; return null;
} }
public static <E extends Enum<E>> int compare(E o1, E o2){
if(o1!=null && o2==null){
return 1;
}else if(o1==null && o2!=null){
return -1;
}else if(o1==null && o2==null){
return 0;
}else{
return o1.compareTo(o2);
}
}
private static boolean contain(String[] arrays,String str) { private static boolean contain(String[] arrays,String str) {
if(arrays==null || arrays.length==0) { if(arrays==null || arrays.length==0) {
return false; return false;

32
io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/enums.properties

@ -1,21 +1,21 @@
io.sc.platform.core.support.LogLevel.OFF=OFF io.sc.platform.core.enums.LogLevel.ERROR=ERROR
io.sc.platform.core.support.LogLevel.ERROR=ERROR io.sc.platform.core.enums.LogLevel.WARN=WARN
io.sc.platform.core.support.LogLevel.WARN=WARN io.sc.platform.core.enums.LogLevel.INFO=INFO
io.sc.platform.core.support.LogLevel.INFO=INFO io.sc.platform.core.enums.LogLevel.DEBUG=DEBUG
io.sc.platform.core.support.LogLevel.DEBUG=DEBUG io.sc.platform.core.enums.LogLevel.TRACE=TRACE
io.sc.platform.core.support.LogLevel.TRACE=TRACE
io.sc.platform.core.audit.AuditLogStatus.SUCCESS=Success io.sc.platform.core.enums.AuditLogStatus.SUCCESS=Success
io.sc.platform.core.audit.AuditLogStatus.FAILED=Failed io.sc.platform.core.enums.AuditLogStatus.FAILED=Failed
io.sc.platform.core.audit.AuditLogAction.ADD=Add io.sc.platform.core.enums.AuditLogAction.UNKNOWN=Unknown
io.sc.platform.core.audit.AuditLogAction.REMOVE=Remove io.sc.platform.core.enums.AuditLogAction.ADD=Add
io.sc.platform.core.audit.AuditLogAction.UPDATE=Update io.sc.platform.core.enums.AuditLogAction.REMOVE=Remove
io.sc.platform.core.audit.AuditLogAction.QUERY=Query io.sc.platform.core.enums.AuditLogAction.UPDATE=Update
io.sc.platform.core.audit.AuditLogAction.FIND_ONE=Find One io.sc.platform.core.enums.AuditLogAction.QUERY=Query
io.sc.platform.core.audit.AuditLogAction.EXPORT=Export io.sc.platform.core.enums.AuditLogAction.FIND_ONE=Find One
io.sc.platform.core.audit.AuditLogAction.LOGIN=Login io.sc.platform.core.enums.AuditLogAction.EXPORT=Export
io.sc.platform.core.audit.AuditLogAction.LOGOUT=Logout io.sc.platform.core.enums.AuditLogAction.LOGIN=Login
io.sc.platform.core.enums.AuditLogAction.LOGOUT=Logout
io.sc.platform.core.enums.Language.en=English io.sc.platform.core.enums.Language.en=English
io.sc.platform.core.enums.Language.zh_CN=\u7B80\u4F53\u4E2D\u6587 io.sc.platform.core.enums.Language.zh_CN=\u7B80\u4F53\u4E2D\u6587

32
io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/enums_tw_CN.properties

@ -1,21 +1,21 @@
io.sc.platform.core.support.LogLevel.OFF=\u95DC\u9589 io.sc.platform.core.enums.LogLevel.ERROR=\u932F\u8AA4
io.sc.platform.core.support.LogLevel.ERROR=\u932F\u8AA4 io.sc.platform.core.enums.LogLevel.WARN=\u8B66\u544A
io.sc.platform.core.support.LogLevel.WARN=\u8B66\u544A io.sc.platform.core.enums.LogLevel.INFO=\u4FE1\u606F
io.sc.platform.core.support.LogLevel.INFO=\u4FE1\u606F io.sc.platform.core.enums.LogLevel.DEBUG=\u8ABF\u8A66
io.sc.platform.core.support.LogLevel.DEBUG=\u8ABF\u8A66 io.sc.platform.core.enums.LogLevel.TRACE=\u8DDF\u8E64
io.sc.platform.core.support.LogLevel.TRACE=\u8DDF\u8E64
io.sc.platform.core.audit.AuditLogStatus.SUCCESS=\u6210\u529F io.sc.platform.core.enums.AuditLogStatus.SUCCESS=\u6210\u529F
io.sc.platform.core.audit.AuditLogStatus.FAILED=\u5931\u6557 io.sc.platform.core.enums.AuditLogStatus.FAILED=\u5931\u6557
io.sc.platform.core.audit.AuditLogAction.ADD=\u65B0\u589E io.sc.platform.core.enums.AuditLogAction.UNKNOWN=\u672A\u77E5
io.sc.platform.core.audit.AuditLogAction.REMOVE=\u522A\u9664 io.sc.platform.core.enums.AuditLogAction.ADD=\u65B0\u589E
io.sc.platform.core.audit.AuditLogAction.UPDATE=\u66F4\u65B0 io.sc.platform.core.enums.AuditLogAction.REMOVE=\u522A\u9664
io.sc.platform.core.audit.AuditLogAction.QUERY=\u67E5\u8A62 io.sc.platform.core.enums.AuditLogAction.UPDATE=\u66F4\u65B0
io.sc.platform.core.audit.AuditLogAction.FIND_ONE=\u67E5\u627E\u55AE\u500B io.sc.platform.core.enums.AuditLogAction.QUERY=\u67E5\u8A62
io.sc.platform.core.audit.AuditLogAction.EXPORT=\u5C0E\u51FA io.sc.platform.core.enums.AuditLogAction.FIND_ONE=\u67E5\u627E\u55AE\u500B
io.sc.platform.core.audit.AuditLogAction.LOGIN=\u767B\u9304 io.sc.platform.core.enums.AuditLogAction.EXPORT=\u5C0E\u51FA
io.sc.platform.core.audit.AuditLogAction.LOGOUT=\u9000\u51FA io.sc.platform.core.enums.AuditLogAction.LOGIN=\u767B\u9304
io.sc.platform.core.enums.AuditLogAction.LOGOUT=\u9000\u51FA
io.sc.platform.core.enums.Language.en=English io.sc.platform.core.enums.Language.en=English
io.sc.platform.core.enums.Language.zh_CN=\u7B80\u4F53\u4E2D\u6587 io.sc.platform.core.enums.Language.zh_CN=\u7B80\u4F53\u4E2D\u6587

32
io.sc.platform.core/src/main/resources/io/sc/platform/core/i18n/enums_zh_CN.properties

@ -1,21 +1,21 @@
io.sc.platform.core.support.LogLevel.OFF=\u5173\u95ED io.sc.platform.core.enums.LogLevel.ERROR=\u9519\u8BEF
io.sc.platform.core.support.LogLevel.ERROR=\u9519\u8BEF io.sc.platform.core.enums.LogLevel.WARN=\u8B66\u544A
io.sc.platform.core.support.LogLevel.WARN=\u8B66\u544A io.sc.platform.core.enums.LogLevel.INFO=\u4FE1\u606F
io.sc.platform.core.support.LogLevel.INFO=\u4FE1\u606F io.sc.platform.core.enums.LogLevel.DEBUG=\u8C03\u8BD5
io.sc.platform.core.support.LogLevel.DEBUG=\u8C03\u8BD5 io.sc.platform.core.enums.LogLevel.TRACE=\u8DDF\u8E2A
io.sc.platform.core.support.LogLevel.TRACE=\u8DDF\u8E2A
io.sc.platform.core.audit.AuditLogStatus.SUCCESS=\u6210\u529F io.sc.platform.core.enums.AuditLogStatus.SUCCESS=\u6210\u529F
io.sc.platform.core.audit.AuditLogStatus.FAILED=\u5931\u8D25 io.sc.platform.core.enums.AuditLogStatus.FAILED=\u5931\u8D25
io.sc.platform.core.audit.AuditLogAction.ADD=\u65B0\u589E io.sc.platform.core.enums.AuditLogAction.UNKNOWN=\u672A\u77E5
io.sc.platform.core.audit.AuditLogAction.REMOVE=\u522A\u9664 io.sc.platform.core.enums.AuditLogAction.ADD=\u65B0\u589E
io.sc.platform.core.audit.AuditLogAction.UPDATE=\u66F4\u65B0 io.sc.platform.core.enums.AuditLogAction.REMOVE=\u522A\u9664
io.sc.platform.core.audit.AuditLogAction.QUERY=\u67E5\u8BE2 io.sc.platform.core.enums.AuditLogAction.UPDATE=\u66F4\u65B0
io.sc.platform.core.audit.AuditLogAction.FIND_ONE=\u67E5\u627E\u5355\u4E2A io.sc.platform.core.enums.AuditLogAction.QUERY=\u67E5\u8BE2
io.sc.platform.core.audit.AuditLogAction.EXPORT=\u5BFC\u51FA io.sc.platform.core.enums.AuditLogAction.FIND_ONE=\u67E5\u627E\u5355\u4E2A
io.sc.platform.core.audit.AuditLogAction.LOGIN=\u767B\u5F55 io.sc.platform.core.enums.AuditLogAction.EXPORT=\u5BFC\u51FA
io.sc.platform.core.audit.AuditLogAction.LOGOUT=\u9000\u51FA io.sc.platform.core.enums.AuditLogAction.LOGIN=\u767B\u5F55
io.sc.platform.core.enums.AuditLogAction.LOGOUT=\u9000\u51FA
io.sc.platform.core.enums.Language.en=English io.sc.platform.core.enums.Language.en=English
io.sc.platform.core.enums.Language.zh_CN=\u7B80\u4F53\u4E2D\u6587 io.sc.platform.core.enums.Language.zh_CN=\u7B80\u4F53\u4E2D\u6587

1
io.sc.platform.mvc/build.gradle

@ -1,6 +1,7 @@
dependencies { dependencies {
api( api(
project(":io.sc.platform.orm"), project(":io.sc.platform.orm"),
project(":io.sc.platform.security"),
project(":io.sc.platform.mvc.frontend"), project(":io.sc.platform.mvc.frontend"),
"org.webjars:webjars-locator-core", "org.webjars:webjars-locator-core",

14
io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/autoconfigure/support/AuditLogAspectorBean.java

@ -2,13 +2,15 @@ package io.sc.platform.mvc.autoconfigure.support;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import io.sc.platform.core.audit.AuditLog; import io.sc.platform.core.audit.AuditLog;
import io.sc.platform.core.audit.AuditLogStatus; import io.sc.platform.core.enums.AuditLogAction;
import io.sc.platform.core.enums.AuditLogStatus;
import io.sc.platform.core.response.ValidationError; import io.sc.platform.core.response.ValidationError;
import io.sc.platform.core.service.AuditLogPersistenter; import io.sc.platform.core.service.AuditLogPersistenter;
import io.sc.platform.core.service.AuditLogPersistenterManager; import io.sc.platform.core.service.AuditLogPersistenterManager;
import io.sc.platform.core.util.IpUtil; import io.sc.platform.core.util.IpUtil;
import io.sc.platform.orm.entity.AuditorEntity; import io.sc.platform.orm.entity.AuditorEntity;
import io.sc.platform.orm.service.support.QueryParameter; import io.sc.platform.orm.service.support.QueryParameter;
import io.sc.platform.security.util.SecurityUtil;
import org.apache.commons.lang3.exception.ExceptionUtils; import org.apache.commons.lang3.exception.ExceptionUtils;
import org.aspectj.lang.JoinPoint; import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.ProceedingJoinPoint;
@ -19,6 +21,7 @@ import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature; import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.MessageSource; import org.springframework.context.MessageSource;
import org.springframework.util.StringUtils;
import org.springframework.validation.BindingResult; import org.springframework.validation.BindingResult;
import org.springframework.validation.FieldError; import org.springframework.validation.FieldError;
@ -110,12 +113,17 @@ public class AuditLogAspectorBean {
if(httpServletRequest!=null) { if(httpServletRequest!=null) {
auditLog.setUrl(httpServletRequest.getRequestURL().toString()); auditLog.setUrl(httpServletRequest.getRequestURL().toString());
auditLog.setLoginName(httpServletRequest.getRemoteUser()); //auditLog.setLoginName(httpServletRequest.getRemoteUser());
auditLog.setLoginName(SecurityUtil.getLoginName());
auditLog.setIp(IpUtil.getRemoteIp(httpServletRequest)); auditLog.setIp(IpUtil.getRemoteIp(httpServletRequest));
//审计日志注解 //审计日志注解
io.sc.platform.core.annotation.AuditLog annotation = method.getAnnotation(io.sc.platform.core.annotation.AuditLog.class); io.sc.platform.core.annotation.AuditLog annotation = method.getAnnotation(io.sc.platform.core.annotation.AuditLog.class);
String key =annotation.value(); String key = annotation.value();
if(!StringUtils.hasText(key)){
AuditLogAction action =annotation.action();
key =action.toString();
}
String action =messageSource.getMessage(key, null, key, httpServletRequest.getLocale()); String action =messageSource.getMessage(key, null, key, httpServletRequest.getLocale());
auditLog.setAction(action); auditLog.setAction(action);
} }

104
io.sc.platform.mvc/src/main/java/io/sc/platform/mvc/controller/support/RestCrudController.java

@ -1,7 +1,7 @@
package io.sc.platform.mvc.controller.support; package io.sc.platform.mvc.controller.support;
import io.sc.platform.core.annotation.AuditLog; import io.sc.platform.core.annotation.AuditLog;
import io.sc.platform.core.audit.AuditLogAction; import io.sc.platform.core.enums.AuditLogAction;
import io.sc.platform.core.response.ValidateException; import io.sc.platform.core.response.ValidateException;
import io.sc.platform.core.util.ValidatorUtil; import io.sc.platform.core.util.ValidatorUtil;
import io.sc.platform.orm.api.vo.BaseVo; import io.sc.platform.orm.api.vo.BaseVo;
@ -26,7 +26,7 @@ import java.util.List;
public abstract class RestCrudController<V extends BaseVo, E extends BaseEntity<V>, ID extends Serializable, R extends DaoRepository<E,ID>, S extends DaoService<E,ID,R>> { public abstract class RestCrudController<V extends BaseVo, E extends BaseEntity<V>, ID extends Serializable, R extends DaoRepository<E,ID>, S extends DaoService<E,ID,R>> {
@Autowired protected S service; @Autowired protected S service;
@AuditLog(AuditLogAction.ADD) @AuditLog(action= AuditLogAction.ADD)
@PostMapping("") @PostMapping("")
@ResponseBody @ResponseBody
public V _add(HttpServletRequest request,HttpServletResponse response,@RequestBody @Valid E entity,BindingResult bindingResult) throws Exception{ public V _add(HttpServletRequest request,HttpServletResponse response,@RequestBody @Valid E entity,BindingResult bindingResult) throws Exception{
@ -45,7 +45,7 @@ public abstract class RestCrudController<V extends BaseVo, E extends BaseEntity<
return null; return null;
} }
@AuditLog(AuditLogAction.REMOVE) @AuditLog(action=AuditLogAction.REMOVE)
@DeleteMapping("{id}") @DeleteMapping("{id}")
@ResponseBody @ResponseBody
public ID _remove(HttpServletRequest request,HttpServletResponse response,@PathVariable(name="id")ID id) throws Exception{ public ID _remove(HttpServletRequest request,HttpServletResponse response,@PathVariable(name="id")ID id) throws Exception{
@ -56,7 +56,7 @@ public abstract class RestCrudController<V extends BaseVo, E extends BaseEntity<
return service.remove(id); return service.remove(id);
} }
@AuditLog(AuditLogAction.UPDATE) @AuditLog(action=AuditLogAction.UPDATE)
@PutMapping("{id}") @PutMapping("{id}")
@ResponseBody @ResponseBody
public V _update(HttpServletRequest request,HttpServletResponse response,@PathVariable(name="id")ID id,@RequestBody @Valid E entity,BindingResult bindingResult) throws Exception{ public V _update(HttpServletRequest request,HttpServletResponse response,@PathVariable(name="id")ID id,@RequestBody @Valid E entity,BindingResult bindingResult) throws Exception{
@ -75,7 +75,7 @@ public abstract class RestCrudController<V extends BaseVo, E extends BaseEntity<
return null; return null;
} }
@AuditLog(AuditLogAction.FIND_ONE) @AuditLog(action=AuditLogAction.FIND_ONE)
@GetMapping("{id}") @GetMapping("{id}")
@ResponseBody @ResponseBody
public V _findById(HttpServletRequest request,HttpServletResponse response,@PathVariable(name="id")ID id) throws Exception{ public V _findById(HttpServletRequest request,HttpServletResponse response,@PathVariable(name="id")ID id) throws Exception{
@ -90,7 +90,7 @@ public abstract class RestCrudController<V extends BaseVo, E extends BaseEntity<
return null; return null;
} }
@AuditLog(AuditLogAction.QUERY) @AuditLog(action=AuditLogAction.QUERY)
@GetMapping("") @GetMapping("")
@ResponseBody @ResponseBody
public Page<V> _query(HttpServletRequest request,HttpServletResponse response,QueryParameter queryParameter) throws Exception{ public Page<V> _query(HttpServletRequest request,HttpServletResponse response,QueryParameter queryParameter) throws Exception{
@ -111,96 +111,4 @@ public abstract class RestCrudController<V extends BaseVo, E extends BaseEntity<
} }
return new PageImpl<>(vos,page.getPageable(),page.getTotalElements()); return new PageImpl<>(vos,page.getPageable(),page.getTotalElements());
} }
/*
@AuditLog(AuditLogAction.ADD)
@PostMapping("")
@ResponseBody
public E _add(HttpServletRequest request,HttpServletResponse response,@RequestBody @Valid E entity,BindingResult bindingResult) throws Exception{
ValidateException result =validationError(bindingResult);
if(result!=null){
throw result;
}
return add(request,response,entity);
}
protected E add(HttpServletRequest request,HttpServletResponse response,@RequestBody @Valid E entity) throws Exception{
return service.add(entity);
}
@AuditLog(AuditLogAction.REMOVE)
@DeleteMapping("{id}")
@ResponseBody
public ID _remove(HttpServletRequest request,HttpServletResponse response,@PathVariable(name="id")ID id) throws Exception{
return remove(request,response,id);
}
protected ID remove(HttpServletRequest request,HttpServletResponse response,@PathVariable(name="id")ID id) throws Exception{
return service.remove(id);
}
@AuditLog(AuditLogAction.UPDATE)
@PutMapping("{id}")
@ResponseBody
public E _update(HttpServletRequest request,HttpServletResponse response,@PathVariable(name="id")ID id,@RequestBody @Valid E entity,BindingResult bindingResult) throws Exception{
ValidateException result =validationError(bindingResult);
if(result!=null){
throw result;
}
return update(request,response,id,entity);
}
protected E update(HttpServletRequest request,HttpServletResponse response,@PathVariable(name="id")ID id,@RequestBody @Valid E entity) throws Exception{
return service.update(id,entity);
}
@AuditLog(AuditLogAction.FIND_ONE)
@GetMapping("{id}")
@ResponseBody
public E _findById(HttpServletRequest request,HttpServletResponse response,@PathVariable(name="id")ID id) throws Exception{
return findById(request,response,id);
}
protected E findById(HttpServletRequest request,HttpServletResponse response,@PathVariable(name="id")ID id) throws Exception{
return service.findById(id);
}
@AuditLog(AuditLogAction.QUERY)
@GetMapping("")
@ResponseBody
public Page<E> _query(HttpServletRequest request,HttpServletResponse response,QueryParameter queryParameter) throws Exception{
return query(request,response,queryParameter);
}
protected Page<E> query(HttpServletRequest request,HttpServletResponse response,QueryParameter queryParameter) throws Exception{
return service.query(queryParameter);
}
private ValidateException validationError(BindingResult bindingResult) {
if(bindingResult==null || !bindingResult.hasErrors()){
return null;
}
List<FieldError> errors =bindingResult.getFieldErrors();
if(errors==null || errors.size()==0){
return null;
}
List<ValidationError> errorList =new ArrayList<ValidationError>();
for(FieldError error : errors){
errorList.add(new ValidationError(getFieldName(error.getField()),error.getDefaultMessage()));
}
return new ValidateException(errorList);
}
private String getFieldName(String field){
int index =field.lastIndexOf(".");
if(index>-1){
return field.substring(index+1);
}else{
return field;
}
}
*/
} }

2
io.sc.platform.orm/src/main/java/io/sc/platform/orm/service/support/QueryResult.java

@ -33,7 +33,7 @@ public class QueryResult {
int total =list.size(); int total =list.size();
int first =pageSize * page; int first =pageSize * page;
List<T> result =new ArrayList<>(); List<T> result =new ArrayList<>();
for(int i=first;i<first+pageSize;i++){ for(int i=first;i<first+pageSize && i<total;i++){
result.add(list.get(i)); result.add(list.get(i));
} }
return new PageImpl<T>(result,pageable,total); return new PageImpl<T>(result,pageable,total);

29
io.sc.platform.security.loginform/src/main/java/io/sc/platform/security/loginform/autoconfigure/WebSecurityAutoConfiguration.java

@ -1,13 +1,11 @@
package io.sc.platform.security.loginform.autoconfigure; package io.sc.platform.security.loginform.autoconfigure;
import io.sc.platform.core.service.AuditLogPersistenterManager;
import io.sc.platform.core.service.RuntimeService; import io.sc.platform.core.service.RuntimeService;
import io.sc.platform.security.handler.PlatformAccessDeniedHandler;
import io.sc.platform.security.handler.PlatformAuthenticationEntryPoint;
import io.sc.platform.security.handler.PlatformAuthenticationFailureHandler;
import io.sc.platform.security.handler.PlatformAuthenticationSuccessHandler;
import io.sc.platform.security.service.SecurityConfigureService;
import io.sc.platform.security.SecurityProperties; import io.sc.platform.security.SecurityProperties;
import io.sc.platform.security.handler.*;
import io.sc.platform.security.service.SecurityConfigureService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigureOrder; import org.springframework.boot.autoconfigure.AutoConfigureOrder;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@ -26,6 +24,7 @@ import org.springframework.security.web.SecurityFilterChain;
import org.springframework.security.web.access.AccessDeniedHandler; import org.springframework.security.web.access.AccessDeniedHandler;
import org.springframework.security.web.authentication.AuthenticationFailureHandler; import org.springframework.security.web.authentication.AuthenticationFailureHandler;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler; import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
/** /**
* 框架安全自动配置类 * 框架安全自动配置类
@ -41,6 +40,7 @@ public class WebSecurityAutoConfiguration {
@Autowired private UserDetailsService userDetailsService; @Autowired private UserDetailsService userDetailsService;
@Autowired private PasswordEncoder passwordEncoder; @Autowired private PasswordEncoder passwordEncoder;
@Autowired private AuthenticationProvider authenticationProvider; @Autowired private AuthenticationProvider authenticationProvider;
@Autowired private AuditLogPersistenterManager auditLogPersistenterManager;
/** /**
* 认证成功处理器 * 认证成功处理器
@ -49,7 +49,7 @@ public class WebSecurityAutoConfiguration {
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean
public AuthenticationSuccessHandler authenticationSuccessHandler(){ public AuthenticationSuccessHandler authenticationSuccessHandler(){
return new PlatformAuthenticationSuccessHandler(); return new PlatformAuthenticationSuccessHandler(securityProperties,auditLogPersistenterManager);
} }
/** /**
@ -59,7 +59,17 @@ public class WebSecurityAutoConfiguration {
@Bean @Bean
@ConditionalOnMissingBean @ConditionalOnMissingBean
public AuthenticationFailureHandler authenticationFailureHandler(){ public AuthenticationFailureHandler authenticationFailureHandler(){
return new PlatformAuthenticationFailureHandler(securityProperties.getFormLogin().getFailureUrl()); return new PlatformAuthenticationFailureHandler(securityProperties,auditLogPersistenterManager);
}
/**
* 退出处理器
* @return 退出处理器
*/
@Bean
@ConditionalOnMissingBean
public LogoutSuccessHandler logoutSuccessHandler(){
return new PlatformLogoutSuccessHandler(auditLogPersistenterManager);
} }
/** /**
@ -84,12 +94,13 @@ public class WebSecurityAutoConfiguration {
@Bean @Bean
@Order(Ordered.HIGHEST_PRECEDENCE + 300) @Order(Ordered.HIGHEST_PRECEDENCE + 300)
public SecurityFilterChain platformWebSecurityFilterChain(HttpSecurity http) throws Exception { public SecurityFilterChain loginFormWebSecurityFilterChain(HttpSecurity http) throws Exception {
if(!runtimeService.isReady()) { if(!runtimeService.isReady()) {
return http.csrf(csrfConfigurer -> { return http.csrf(csrfConfigurer -> {
csrfConfigurer.disable(); csrfConfigurer.disable();
}).build(); }).build();
} }
return http return http
// 在匹配了上述 SecurityFilterChain 规则的基础上进行权限控制 // 在匹配了上述 SecurityFilterChain 规则的基础上进行权限控制
.authorizeRequests(authorizeRequests -> { .authorizeRequests(authorizeRequests -> {
@ -127,6 +138,7 @@ public class WebSecurityAutoConfiguration {
.logout(logoutConfigurer -> { .logout(logoutConfigurer -> {
logoutConfigurer.logoutUrl(securityProperties.getLogout().getLogoutUrl()); logoutConfigurer.logoutUrl(securityProperties.getLogout().getLogoutUrl());
logoutConfigurer.logoutSuccessUrl(securityProperties.getLogout().getLogoutSuccessUrl()); logoutConfigurer.logoutSuccessUrl(securityProperties.getLogout().getLogoutSuccessUrl());
logoutConfigurer.logoutSuccessHandler(logoutSuccessHandler());
}) })
.headers(headersConfigurer -> { .headers(headersConfigurer -> {
//接收从 iframe 发送的请求 //接收从 iframe 发送的请求
@ -136,6 +148,7 @@ public class WebSecurityAutoConfiguration {
.exceptionHandling() .exceptionHandling()
.authenticationEntryPoint(authenticationEntryPoint()) .authenticationEntryPoint(authenticationEntryPoint())
.accessDeniedHandler(accessDeniedHandler()).and() .accessDeniedHandler(accessDeniedHandler()).and()
.build(); .build();
} }
} }

2
io.sc.platform.security.oauth2.server.authorization/src/main/java/io/sc/platform/security/oauth2/server/authorization/configure/PlatformOauth2AuthorizationServerAutoConfiguration.java

@ -62,7 +62,7 @@ public class PlatformOauth2AuthorizationServerAutoConfiguration {
} }
@Bean @Bean
public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception { public SecurityFilterChain auth2AuthorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
if(!runtimeService.isReady()) { if(!runtimeService.isReady()) {
return http.csrf(csrfConfigurer -> { return http.csrf(csrfConfigurer -> {
csrfConfigurer.disable(); csrfConfigurer.disable();

2
io.sc.platform.security.oauth2.server.authorization/src/main/java/io/sc/platform/security/oauth2/server/authorization/configure/PlatformWebSecurityAutoConfiguration.java

@ -34,7 +34,7 @@ public class PlatformWebSecurityAutoConfiguration {
} }
@Bean @Bean
public SecurityFilterChain platformWebSecurityFilterChain(HttpSecurity http) throws Exception { public SecurityFilterChain auth2WebSecurityFilterChain(HttpSecurity http) throws Exception {
if(!runtimeService.isReady()) { if(!runtimeService.isReady()) {
return http.csrf(csrfConfigurer -> { return http.csrf(csrfConfigurer -> {
csrfConfigurer.disable(); csrfConfigurer.disable();

2
io.sc.platform.security.oauth2.server.authorization/src/main/java/io/sc/platform/security/oauth2/server/authorization/configure/SecurityAutoConfiguration.java

@ -39,7 +39,7 @@ public class SecurityAutoConfiguration {
@Bean @Bean
@Order(1) @Order(1)
public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception { public SecurityFilterChain auth2AuthorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {
OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http); OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http);
// Enable OpenID Connect 1.0 // Enable OpenID Connect 1.0
http.getConfigurer(OAuth2AuthorizationServerConfigurer.class).oidc(Customizer.withDefaults()); http.getConfigurer(OAuth2AuthorizationServerConfigurer.class).oidc(Customizer.withDefaults());

2
io.sc.platform.security.oauth2.server.resource/src/main/java/io/sc/platform/security/oauth2/server/resource/configure/PlatformOauth2ResourceServerAutoConfiguration.java

@ -48,7 +48,7 @@ public class PlatformOauth2ResourceServerAutoConfiguration {
*/ */
@Bean @Bean
@Order(Ordered.HIGHEST_PRECEDENCE + 100) @Order(Ordered.HIGHEST_PRECEDENCE + 100)
SecurityFilterChain frameworkResourceServerSecurityFilterChain(HttpSecurity http) throws Exception { SecurityFilterChain oauth2ResourceServerSecurityFilterChain(HttpSecurity http) throws Exception {
if(!runtimeService.isReady()) { if(!runtimeService.isReady()) {
return http.csrf(csrfConfigurer -> { return http.csrf(csrfConfigurer -> {
csrfConfigurer.disable(); csrfConfigurer.disable();

1
io.sc.platform.security/src/main/java/io/sc/platform/security/autoconfigure/PlatformWebSecurityAutoConfiguration.java

@ -2,7 +2,6 @@ package io.sc.platform.security.autoconfigure;
import io.sc.platform.security.autoconfigure.support.EncodePasswordAuthenticationProvider; import io.sc.platform.security.autoconfigure.support.EncodePasswordAuthenticationProvider;
import io.sc.platform.security.service.impl.UserDetailsServiceImpl; import io.sc.platform.security.service.impl.UserDetailsServiceImpl;
import org.apache.catalina.security.SecurityConfig;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;

37
io.sc.platform.security/src/main/java/io/sc/platform/security/handler/PlatformAuthenticationFailureHandler.java

@ -1,12 +1,18 @@
package io.sc.platform.security.handler; package io.sc.platform.security.handler;
import io.sc.platform.core.response.ResponseWrapper; import io.sc.platform.core.audit.AuditLog;
import io.sc.platform.core.response.ResponseWrapperBuilder; import io.sc.platform.core.enums.AuditLogAction;
import io.sc.platform.core.enums.AuditLogStatus;
import io.sc.platform.core.service.AuditLogPersistenter;
import io.sc.platform.core.service.AuditLogPersistenterManager;
import io.sc.platform.core.util.HttpServletRequestUtil; import io.sc.platform.core.util.HttpServletRequestUtil;
import io.sc.platform.core.util.ObjectMapper4Json; import io.sc.platform.core.util.IpUtil;
import io.sc.platform.security.SecurityProperties;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.AuthenticationException;
import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler; import org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@ -14,12 +20,33 @@ import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
public class PlatformAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler { public class PlatformAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler {
public PlatformAuthenticationFailureHandler(String defaultFailureUrl) { private SecurityProperties securityProperties;
setDefaultFailureUrl(defaultFailureUrl); private AuditLogPersistenterManager auditLogPersistenterManager;
public PlatformAuthenticationFailureHandler(SecurityProperties securityProperties,AuditLogPersistenterManager auditLogPersistenterManager) {
this.auditLogPersistenterManager =auditLogPersistenterManager;
setDefaultFailureUrl(securityProperties.getFormLogin().getFailureUrl());
} }
@Override @Override
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException { public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
AuditLogPersistenter logger =auditLogPersistenterManager.getAuditLogPersister();
if(logger!=null){
AuditLog auditLog =new AuditLog();
auditLog.setAction(AuditLogAction.LOGIN.getValue());
auditLog.setExecuteTime(10L);
auditLog.setClassName(UsernamePasswordAuthenticationFilter.class.getName());
auditLog.setMethodName("attemptAuthentication");
auditLog.setHttpMethod("POST");
auditLog.setStatus(AuditLogStatus.FAILED.getValue());
auditLog.setUrl(request.getRequestURL().toString());
auditLog.setLoginName(request.getParameter(UsernamePasswordAuthenticationFilter.SPRING_SECURITY_FORM_USERNAME_KEY));
auditLog.setIp(IpUtil.getRemoteIp(request));
auditLog.setException(exception.getClass().getName());
auditLog.setExceptionMessage(exception.getMessage());
auditLog.setExceptionStackTrace(ExceptionUtils.getStackTrace(exception));
logger.log(auditLog);
}
if(HttpServletRequestUtil.isTextHtmlMediaType(request)) { if(HttpServletRequestUtil.isTextHtmlMediaType(request)) {
super.onAuthenticationFailure(request,response,exception); super.onAuthenticationFailure(request,response,exception);
} else { } else {

30
io.sc.platform.security/src/main/java/io/sc/platform/security/handler/PlatformAuthenticationSuccessHandler.java

@ -1,12 +1,20 @@
package io.sc.platform.security.handler; package io.sc.platform.security.handler;
import io.sc.platform.core.audit.AuditLog;
import io.sc.platform.core.enums.AuditLogAction;
import io.sc.platform.core.enums.AuditLogStatus;
import io.sc.platform.core.response.ResponseWrapper; import io.sc.platform.core.response.ResponseWrapper;
import io.sc.platform.core.response.ResponseWrapperBuilder; import io.sc.platform.core.response.ResponseWrapperBuilder;
import io.sc.platform.core.service.AuditLogPersistenter;
import io.sc.platform.core.service.AuditLogPersistenterManager;
import io.sc.platform.core.util.HttpServletRequestUtil; import io.sc.platform.core.util.HttpServletRequestUtil;
import io.sc.platform.core.util.IpUtil;
import io.sc.platform.core.util.ObjectMapper4Json; import io.sc.platform.core.util.ObjectMapper4Json;
import io.sc.platform.security.SecurityProperties;
import io.sc.platform.security.util.SecurityUtil; import io.sc.platform.security.util.SecurityUtil;
import org.springframework.security.core.Authentication; import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler; import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import javax.servlet.ServletException; import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
@ -14,8 +22,30 @@ import javax.servlet.http.HttpServletResponse;
import java.io.IOException; import java.io.IOException;
public class PlatformAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler { public class PlatformAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {
private SecurityProperties securityProperties;
private AuditLogPersistenterManager auditLogPersistenterManager;
public PlatformAuthenticationSuccessHandler(SecurityProperties securityProperties,AuditLogPersistenterManager auditLogPersistenterManager){
this.securityProperties =securityProperties;
this.auditLogPersistenterManager =auditLogPersistenterManager;
}
@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 {
AuditLogPersistenter logger =auditLogPersistenterManager.getAuditLogPersister();
if(logger!=null){
AuditLog auditLog =new AuditLog();
auditLog.setAction(AuditLogAction.LOGIN.getValue());
auditLog.setExecuteTime(10L);
auditLog.setClassName(UsernamePasswordAuthenticationFilter.class.getName());
auditLog.setMethodName("attemptAuthentication");
auditLog.setHttpMethod("POST");
auditLog.setStatus(AuditLogStatus.SUCCESS.getValue());
auditLog.setUrl(request.getRequestURL().toString());
auditLog.setLoginName(request.getParameter(UsernamePasswordAuthenticationFilter.SPRING_SECURITY_FORM_USERNAME_KEY));
auditLog.setIp(IpUtil.getRemoteIp(request));
logger.log(auditLog);
}
if(HttpServletRequestUtil.isTextHtmlMediaType(request)) { if(HttpServletRequestUtil.isTextHtmlMediaType(request)) {
super.onAuthenticationSuccess(request,response,authentication); super.onAuthenticationSuccess(request,response,authentication);
}else{ }else{

48
io.sc.platform.security/src/main/java/io/sc/platform/security/handler/PlatformLogoutSuccessHandler.java

@ -0,0 +1,48 @@
package io.sc.platform.security.handler;
import io.sc.platform.core.audit.AuditLog;
import io.sc.platform.core.enums.AuditLogAction;
import io.sc.platform.core.enums.AuditLogStatus;
import io.sc.platform.core.service.AuditLogPersistenter;
import io.sc.platform.core.service.AuditLogPersistenterManager;
import io.sc.platform.core.util.IpUtil;
import io.sc.platform.security.support.SecurityUser;
import io.sc.platform.security.util.SecurityUtil;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
import org.springframework.security.web.authentication.logout.LogoutFilter;
import org.springframework.security.web.authentication.logout.LogoutHandler;
import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
public class PlatformLogoutSuccessHandler implements LogoutSuccessHandler {
private AuditLogPersistenterManager auditLogPersistenterManager;
public PlatformLogoutSuccessHandler(AuditLogPersistenterManager auditLogPersistenterManager){
this.auditLogPersistenterManager =auditLogPersistenterManager;
}
@Override
public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
AuditLogPersistenter logger =auditLogPersistenterManager.getAuditLogPersister();
if(logger!=null){
AuditLog auditLog =new AuditLog();
auditLog.setAction(AuditLogAction.LOGOUT.getValue());
auditLog.setExecuteTime(10L);
auditLog.setClassName(LogoutHandler.class.getName());
auditLog.setMethodName("logout");
auditLog.setHttpMethod("POST");
auditLog.setStatus(AuditLogStatus.SUCCESS.getValue());
auditLog.setUrl(request.getRequestURL().toString());
if(authentication!=null && authentication.getPrincipal() instanceof SecurityUser){
auditLog.setLoginName(((SecurityUser)authentication.getPrincipal()).getLoginName());
}
auditLog.setIp(IpUtil.getRemoteIp(request));
logger.log(auditLog);
}
}
}

2
io.sc.platform.security/src/main/java/io/sc/platform/security/service/impl/UserDetailsServiceImpl.java

@ -1,5 +1,7 @@
package io.sc.platform.security.service.impl; package io.sc.platform.security.service.impl;
import io.sc.platform.core.annotation.AuditLog;
import io.sc.platform.core.enums.AuditLogAction;
import io.sc.platform.security.service.support.*; import io.sc.platform.security.service.support.*;
import io.sc.platform.security.support.SecurityRole; import io.sc.platform.security.support.SecurityRole;
import io.sc.platform.security.support.SecurityUser; import io.sc.platform.security.support.SecurityUser;

2
io.sc.platform.system.frontend/package.json

@ -78,7 +78,7 @@
"luckyexcel": "1.0.1", "luckyexcel": "1.0.1",
"mockjs": "1.1.0", "mockjs": "1.1.0",
"pinia": "2.1.7", "pinia": "2.1.7",
"platform-core": "8.1.92", "platform-core": "8.1.94",
"quasar": "2.14.2", "quasar": "2.14.2",
"tailwindcss": "3.4.0", "tailwindcss": "3.4.0",
"vue": "3.4.3", "vue": "3.4.3",

20
io.sc.platform.system.frontend/src/views/corporation/Corporation.vue

@ -5,7 +5,6 @@
<w-grid <w-grid
ref="corporationTreeGridRef" ref="corporationTreeGridRef"
:tree="true" :tree="true"
dense-body
:title="$t('system.corporation.grid.title')" :title="$t('system.corporation.grid.title')"
:data-url="Environment.apiContextPath('/api/system/corporation')" :data-url="Environment.apiContextPath('/api/system/corporation')"
selection="multiple" selection="multiple"
@ -20,12 +19,12 @@
:toolbar-configure="{ noIcon: false }" :toolbar-configure="{ noIcon: false }"
:toolbar-actions="['refresh', 'separator', ['addTop', 'addChild'], 'edit', 'remove', 'separator', 'view']" :toolbar-actions="['refresh', 'separator', ['addTop', 'addChild'], 'edit', 'remove', 'separator', 'view']"
:columns="[ :columns="[
{ width: 250, name: 'name', label: $t('name') }, { width: '100%', name: 'name', label: $t('name') },
{ name: 'code', label: $t('code') }, { width: 150, name: 'code', label: $t('code') },
{ name: 'dataComeFrom', label: $t('dataComeFrom'), format: Formater.enum(DataComeFromEnum) }, { width: 90, name: 'dataComeFrom', label: $t('dataComeFrom'), format: Formater.enum(DataComeFromEnum) },
{ name: 'lastModifier', label: $t('lastModifier') }, { width: 100, name: 'lastModifier', label: $t('lastModifier') },
{ name: 'lastModifyDate', label: $t('lastModifyDate'), format: Formater.dateOnly() }, { width: 110, name: 'lastModifyDate', label: $t('lastModifyDate'), format: Formater.dateOnly() },
{ width: 100, name: 'enable', label: $t('status'), format: Formater.enableTag() }, { width: 80, name: 'enable', label: $t('status'), format: Formater.enableTag() },
]" ]"
:editor="{ :editor="{
dialog: { dialog: {
@ -65,6 +64,13 @@
userGridRef?.refresh(); userGridRef?.refresh();
} }
" "
@request-data-before="
() => {
console.log('>>>>>');
currentSelectedCorporationCode = '';
userGridRef?.refresh();
}
"
></w-grid> ></w-grid>
</div> </div>
</template> </template>

32
io.sc.platform.system.frontend/src/views/monitor/AuditLog.vue

@ -5,10 +5,10 @@
selection="multiple" selection="multiple"
:data-url="Environment.apiContextPath('/api/system/monitor/auditlog')" :data-url="Environment.apiContextPath('/api/system/monitor/auditlog')"
:query-form-fields="[ :query-form-fields="[
{ name: 'code', label: $t('code'), type: 'text' }, { name: 'status', label: $t('status'), type: 'select', queryOperator: 'equals', options: Options.successFailed() },
{ name: 'message', label: $t('i18nMessage'), type: 'text' }, { name: 'action', label: $t('action'), type: 'select', queryOperator: 'equals', options: Options.enum(AuditLogActionEnum) },
{ name: 'lang', label: $t('language'), type: 'select' }, { name: 'loginName', label: $t('loginName'), type: 'text' },
{ name: 'dataComeFrom', label: $t('dataComeFrom'), type: 'select' }, { name: 'startDate', label: $t('startDate'), type: 'text' },
]" ]"
:toolbar-configure="{ noIcon: false }" :toolbar-configure="{ noIcon: false }"
:toolbar-actions="['query', 'refresh', 'separator', 'view', 'export']" :toolbar-actions="['query', 'refresh', 'separator', 'view', 'export']"
@ -16,16 +16,14 @@
sortBy: 'startDate', sortBy: 'startDate',
descending: true, descending: true,
}" }"
:checkbox-selection="false"
:columns="[ :columns="[
{ width: 80, name: 'status', label: $t('status'), format: Formater.successTag() }, { width: 80, name: 'status', label: $t('status'), format: Formater.successTag() },
{ {
width: 60, width: 80,
name: 'action', name: 'action',
label: $t('action'), label: $t('action'),
format: (value) => { format: Formater.enum(AuditLogActionEnum),
console.log(value);
return value ? AuditLogAction[value] : '';
},
}, },
{ width: 150, name: 'startDate', label: $t('startDate') }, { width: 150, name: 'startDate', label: $t('startDate') },
{ width: 100, name: 'executeTime', label: $t('executeTime') }, { width: 100, name: 'executeTime', label: $t('executeTime') },
@ -82,21 +80,9 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref } from 'vue'; import { ref } from 'vue';
import { useI18n } from 'vue-i18n'; import { Environment, EnumTools, Formater, Options } from 'platform-core';
import { Environment, axios, Formater, Options } from 'platform-core';
const { t } = useI18n(); const AuditLogActionEnum = await EnumTools.fetch('io.sc.platform.core.enums.AuditLogAction');
const AuditLogAction = {
'io.sc.platform.core.audit.AuditLogAction.ADD': t('io.sc.platform.core.audit.AuditLogAction.ADD'),
'io.sc.platform.core.audit.AuditLogAction.REMOVE': t('io.sc.platform.core.audit.AuditLogAction.REMOVE'),
'io.sc.platform.core.audit.AuditLogAction.UPDATE': t('io.sc.platform.core.audit.AuditLogAction.UPDATE'),
'io.sc.platform.core.audit.AuditLogAction.QUERY': t('io.sc.platform.core.audit.AuditLogAction.QUERY'),
'io.sc.platform.core.audit.AuditLogAction.FIND_ONE': t('io.sc.platform.core.audit.AuditLogAction.FIND_ONE'),
'io.sc.platform.core.audit.AuditLogAction.EXPORT': t('io.sc.platform.core.audit.AuditLogAction.EXPORT'),
'io.sc.platform.core.audit.AuditLogAction.LOGIN': t('io.sc.platform.core.audit.AuditLogAction.LOGIN'),
'io.sc.platform.core.audit.AuditLogAction.LOGOUT': t('io.sc.platform.core.audit.AuditLogAction.LOGOUT'),
};
const auditLogGridRef = ref(); const auditLogGridRef = ref();
</script> </script>

21
io.sc.platform.system.frontend/src/views/monitor/Log.vue

@ -47,8 +47,6 @@
}, },
}, },
]" ]"
:pageable="false"
dense-body
:pagination="{ :pagination="{
sortBy: 'startDate', sortBy: 'startDate',
descending: true, descending: true,
@ -77,15 +75,15 @@
:data-url="Environment.apiContextPath('/api/monitor/logger/getLogConfigurationLevels')" :data-url="Environment.apiContextPath('/api/monitor/logger/getLogConfigurationLevels')"
:toolbar-configure="{ noIcon: false }" :toolbar-configure="{ noIcon: false }"
:toolbar-actions="['query', 'refresh', 'separator', 'edit']" :toolbar-actions="['query', 'refresh', 'separator', 'edit']"
dense-body :checkbox-selection="false"
:pagination="{ :pagination="{
sortBy: 'startDate', sortBy: 'name',
descending: true, descending: false,
}" }"
:query-form-fields="[ :query-form-fields="[
{ name: 'name', label: $t('name'), type: 'text' }, { name: 'name', label: $t('name'), type: 'text' },
{ name: 'configuredLevel', label: $t('system.monitor.log.level.entity.configuredLevel'), type: 'select' }, { name: 'configuredLevel', label: $t('system.monitor.log.level.entity.configuredLevel'), type: 'select', options: Options.enum(LogLevelEnum) },
{ name: 'effectiveLevel', label: $t('system.monitor.log.level.entity.effectiveLevel'), type: 'select' }, { name: 'effectiveLevel', label: $t('system.monitor.log.level.entity.effectiveLevel'), type: 'select', options: Options.enum(LogLevelEnum) },
]" ]"
:columns="[ :columns="[
{ width: 700, name: 'name', label: $t('name') }, { width: 700, name: 'name', label: $t('name') },
@ -99,7 +97,9 @@
}, },
form: { form: {
colsNum: 1, colsNum: 1,
fields: [{ name: 'effectiveLevel', label: $t('system.monitor.log.level.entity.effectiveLevel'), type: 'select' }], fields: [
{ name: 'effectiveLevel', label: $t('system.monitor.log.level.entity.effectiveLevel'), type: 'select', options: Options.enum(LogLevelEnum) },
],
}, },
}" }"
> >
@ -111,10 +111,9 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { ref, onMounted } from 'vue'; import { ref, onMounted } from 'vue';
import { useI18n } from 'vue-i18n'; import { Environment, axios, EnumTools, Options } from 'platform-core';
import { Environment, axios } from 'platform-core';
const { t } = useI18n(); const LogLevelEnum = await EnumTools.fetch('io.sc.platform.core.enums.LogLevel');
const selectedTabRef = ref('view'); const selectedTabRef = ref('view');
const logRows = ref(20); const logRows = ref(20);

102
io.sc.platform.system/src/main/java/io/sc/platform/system/monitor/controller/LogViewerWebController.java

@ -7,9 +7,7 @@ import io.sc.platform.core.util.FileUtil;
import io.sc.platform.mvc.support.FileDownloader; import io.sc.platform.mvc.support.FileDownloader;
import io.sc.platform.orm.service.support.QueryParameter; import io.sc.platform.orm.service.support.QueryParameter;
import io.sc.platform.orm.service.support.QueryResult; import io.sc.platform.orm.service.support.QueryResult;
import io.sc.platform.system.monitor.support.LogFileLastModifyDateComparator; import io.sc.platform.system.monitor.support.*;
import io.sc.platform.system.monitor.support.LogFileNameComparator;
import io.sc.platform.system.monitor.support.LogFileSizeComparator;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.actuate.logging.LoggersEndpoint; import org.springframework.boot.actuate.logging.LoggersEndpoint;
import org.springframework.boot.actuate.logging.LoggersEndpoint.LoggerLevels; import org.springframework.boot.actuate.logging.LoggersEndpoint.LoggerLevels;
@ -17,14 +15,16 @@ import org.springframework.core.io.DefaultResourceLoader;
import org.springframework.core.io.Resource; import org.springframework.core.io.Resource;
import org.springframework.data.domain.Page; import org.springframework.data.domain.Page;
import org.springframework.data.domain.Sort.Order; import org.springframework.data.domain.Sort.Order;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
import java.util.*; import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
@RestController @RestController
@RequestMapping("/api/monitor/logger") @RequestMapping("/api/monitor/logger")
@ -73,7 +73,7 @@ public class LogViewerWebController {
} }
} }
} }
return QueryResult.page(result); return QueryResult.page(result,queryParameter.getJpaPageable());
} }
return QueryResult.emptyPage(); return QueryResult.emptyPage();
} }
@ -88,7 +88,7 @@ public class LogViewerWebController {
if(o==null){ if(o==null){
return QueryResult.emptyPage(); return QueryResult.emptyPage();
} }
List<LoggerLevelInfo> result =new ArrayList<LoggerLevelInfo>(); List<LoggerLevelInfo> result =new ArrayList<LoggerLevelInfo>(10000);
if(o instanceof Map){ if(o instanceof Map){
Map<String, LoggerLevels> map =(Map<String, LoggerLevels>)o; Map<String, LoggerLevels> map =(Map<String, LoggerLevels>)o;
for(String key : map.keySet()){ for(String key : map.keySet()){
@ -96,6 +96,32 @@ public class LogViewerWebController {
result.add(new LoggerLevelInfo(key,loggerLevels.getConfiguredLevel(),"INFO")); result.add(new LoggerLevelInfo(key,loggerLevels.getConfiguredLevel(),"INFO"));
} }
} }
if(queryParameter!=null){
Order order =queryParameter.getFirstSort();
if(order!=null){
String fieldName =order.getProperty();
boolean asc =order.isAscending();
if("name".equalsIgnoreCase(fieldName)){
if(asc){
result.sort(new LogLevelNameComparator(true));
}else{
result.sort(new LogLevelNameComparator(false));
}
}else if("configuredLevel".equalsIgnoreCase(fieldName)){
if(asc){
result.sort(new LogLevelConfiguredLevelComparator(true));
}else{
result.sort(new LogLevelConfiguredLevelComparator(false));
}
}else if("effectiveLevel".equalsIgnoreCase(fieldName)){
if(asc){
result.sort(new LogLevelEffectiveLevelComparator(true));
}else{
result.sort(new LogLevelEffectiveLevelComparator(false));
}
}
}
}
return QueryResult.page(result,queryParameter.getJpaPageable()); return QueryResult.page(result,queryParameter.getJpaPageable());
} }
@ -111,66 +137,4 @@ public class LogViewerWebController {
Resource resource =new DefaultResourceLoader().getResource("file://" + DirectoryManager.getInstance().getByName("dir.log") + "/" + fileName); Resource resource =new DefaultResourceLoader().getResource("file://" + DirectoryManager.getInstance().getByName("dir.log") + "/" + fileName);
FileDownloader.download(request, response, fileName, resource); FileDownloader.download(request, response, fileName, resource);
} }
public Page<LoggerLevelInfo> findLevelsFromActuator(QueryParameter queryParameter) throws Exception {
Map<String,Object> configurations =loggersEndpoint.loggers();
if(configurations==null){
return QueryResult.emptyPage();
}
Object o =configurations.get("loggers");
if(o==null){
return QueryResult.emptyPage();
}
List<LoggerLevelInfo> result =new ArrayList<LoggerLevelInfo>();
if(o instanceof Map){
Map<String, LoggerLevels> map =(Map<String, LoggerLevels>)o;
for(String key : map.keySet()){
LoggerLevels loggerLevels =map.get(key);
result.add(new LoggerLevelInfo(key,loggerLevels.getConfiguredLevel(),"INFO"));
}
}
return QueryResult.page(result,queryParameter.getJpaPageable());
/*
if(
!StringUtils.hasText(levelInfo.getName())
&& levelInfo.getConfiguredLevel()!=null
&& levelInfo.getEffectiveLevel()!=null
){
return result;
}
//filter
List<LoggerLevelInfo> filter =new ArrayList<LoggerLevelInfo>();
if(StringUtils.hasText(levelInfo.getName())){
for(LoggerLevelInfo info : result){
if(info.getName().toLowerCase().contains(levelInfo.getName().trim().toLowerCase())){
filter.add(info);
}
}
result =filter;
}
filter =new ArrayList<LoggerLevelInfo>();
if(levelInfo.getConfiguredLevel()!=null){
for(LoggerLevelInfo info : result){
if(info.getConfiguredLevel()!=null && info.getConfiguredLevel().equals(levelInfo.getConfiguredLevel())){
filter.add(info);
}
}
result =filter;
}
filter =new ArrayList<LoggerLevelInfo>();
if(levelInfo.getEffectiveLevel()!=null){
for(LoggerLevelInfo info : result){
if(info.getEffectiveLevel()!=null && info.getEffectiveLevel().equals(levelInfo.getEffectiveLevel())){
filter.add(info);
}
}
result =filter;
}
return result;
*/
}
} }

25
io.sc.platform.system/src/main/java/io/sc/platform/system/monitor/support/LogLevelConfiguredLevelComparator.java

@ -0,0 +1,25 @@
package io.sc.platform.system.monitor.support;
import io.sc.platform.core.support.LoggerLevelInfo;
import io.sc.platform.core.util.EnumUtil;
import java.util.Comparator;
public class LogLevelConfiguredLevelComparator implements Comparator<LoggerLevelInfo> {
private boolean asc =true;
public LogLevelConfiguredLevelComparator(){}
public LogLevelConfiguredLevelComparator(boolean asc){
this.asc =asc;
}
@Override
public int compare(LoggerLevelInfo o1, LoggerLevelInfo o2) {
if(asc) {
return EnumUtil.compare(o1.getConfiguredLevel(),o2.getConfiguredLevel());
}else{
return EnumUtil.compare(o2.getConfiguredLevel(),o1.getConfiguredLevel());
}
}
}

24
io.sc.platform.system/src/main/java/io/sc/platform/system/monitor/support/LogLevelEffectiveLevelComparator.java

@ -0,0 +1,24 @@
package io.sc.platform.system.monitor.support;
import io.sc.platform.core.support.LoggerLevelInfo;
import java.util.Comparator;
public class LogLevelEffectiveLevelComparator implements Comparator<LoggerLevelInfo> {
private boolean asc =true;
public LogLevelEffectiveLevelComparator(){}
public LogLevelEffectiveLevelComparator(boolean asc){
this.asc =asc;
}
@Override
public int compare(LoggerLevelInfo o1, LoggerLevelInfo o2) {
if(asc) {
return o1.getEffectiveLevel().compareTo(o2.getEffectiveLevel());
}else{
return o2.getEffectiveLevel().compareTo(o1.getEffectiveLevel());
}
}
}

26
io.sc.platform.system/src/main/java/io/sc/platform/system/monitor/support/LogLevelNameComparator.java

@ -0,0 +1,26 @@
package io.sc.platform.system.monitor.support;
import io.sc.platform.core.support.FileWrapper;
import io.sc.platform.core.support.LoggerLevelInfo;
import io.sc.platform.core.util.PinyinUtil;
import java.util.Comparator;
public class LogLevelNameComparator implements Comparator<LoggerLevelInfo> {
private boolean asc =true;
public LogLevelNameComparator(){}
public LogLevelNameComparator(boolean asc){
this.asc =asc;
}
@Override
public int compare(LoggerLevelInfo o1, LoggerLevelInfo o2) {
if(asc) {
return o1.getName().compareTo(o2.getName());
}else{
return o2.getName().compareTo(o1.getName());
}
}
}

5
io.sc.platform.system/src/main/resources/META-INF/platform/plugins/p6spy.json

@ -0,0 +1,5 @@
{
"ignoredPatterns":[
"^insert into sys_audit_log"
]
}
Loading…
Cancel
Save