diff --git a/README.md b/README.md index 32e984fba..bdcd3be60 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,13 @@ -
-
-
-
-
+ * + * @param authenticationException 登录的authentication 对象 + * @param authentication 登录的authenticationException 对象 + */ + @Override + public void handle(AuthenticationException authenticationException, Authentication authentication) { + log.info("用户:{} 登录失败,异常:{}", authentication.getPrincipal(), authenticationException.getLocalizedMessage()); + } +} diff --git a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/handler/PigxAuthenticationSuccessEventHandler.java b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/handler/PigxAuthenticationSuccessEventHandler.java new file mode 100644 index 000000000..4b8cf3ad7 --- /dev/null +++ b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/handler/PigxAuthenticationSuccessEventHandler.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) 2018-2025, lengleng All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * Neither the name of the pig4cloud.com developer nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * Author: lengleng (wangiegie@gmail.com) + */ + +package com.pig4cloud.pigx.auth.handler; + +import com.pig4cloud.pigx.common.security.handler.AuthenticationSuccessEventHandler; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Component; + +/** + * @author lengleng + * @date 2018/10/8 + */ +@Slf4j +@Component +public class PigxAuthenticationSuccessEventHandler extends AuthenticationSuccessEventHandler { + + /** + * 处理登录成功方法 + *
+ * 获取到登录的authentication 对象
+ *
+ * @param authentication 登录对象
+ */
+ @Override
+ public void handle(Authentication authentication) {
+ log.info("用户:{} 登录成功", authentication.getPrincipal());
+ }
+}
diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/SecurityConstants.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/SecurityConstants.java
index a923ac523..8a9158b21 100644
--- a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/SecurityConstants.java
+++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/constant/SecurityConstants.java
@@ -47,6 +47,11 @@ public interface SecurityConstants {
*/
String FROM_IN = "Y";
+ /**
+ * 标志
+ */
+ String FROM = "from";
+
/**
* {bcrypt} 加密的特征码
*/
diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxResourceServerTokenRelayAutoConfiguration.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxResourceServerTokenRelayAutoConfiguration.java
index 54c406dea..78577d921 100644
--- a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxResourceServerTokenRelayAutoConfiguration.java
+++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PigxResourceServerTokenRelayAutoConfiguration.java
@@ -2,15 +2,13 @@ package com.pig4cloud.pigx.common.security.component;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
-import org.springframework.boot.autoconfigure.condition.AllNestedConditions;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
-import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
+import org.springframework.boot.autoconfigure.condition.*;
import org.springframework.boot.autoconfigure.security.oauth2.OAuth2AutoConfiguration;
import org.springframework.cloud.security.oauth2.client.AccessTokenContextRelay;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;
+import org.springframework.core.annotation.Order;
import org.springframework.security.oauth2.client.OAuth2ClientContext;
import org.springframework.security.oauth2.config.annotation.web.configuration.OAuth2ClientConfiguration;
import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfiguration;
@@ -38,28 +36,6 @@ public class PigxResourceServerTokenRelayAutoConfiguration {
return new AccessTokenContextRelay(context);
}
- @Configuration
- public static class ResourceServerTokenRelayRegistrationAutoConfiguration implements WebMvcConfigurer {
- @Autowired
- AccessTokenContextRelay accessTokenContextRelay;
-
- @Override
- public void addInterceptors(InterceptorRegistry registry) {
- registry.addInterceptor(
- new HandlerInterceptorAdapter() {
- @Override
- public boolean preHandle(HttpServletRequest request,
- HttpServletResponse response, Object handler) throws Exception {
- accessTokenContextRelay.copyToken();
- return true;
- }
- }
-
- );
- }
-
- }
-
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/feign/PigxFeignClientConfiguration.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/feign/PigxFeignClientConfiguration.java
index 84ffd021a..211b0bea9 100644
--- a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/feign/PigxFeignClientConfiguration.java
+++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/feign/PigxFeignClientConfiguration.java
@@ -21,7 +21,9 @@ package com.pig4cloud.pigx.common.security.feign;
import feign.RequestInterceptor;
import lombok.AllArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.cloud.security.oauth2.client.AccessTokenContextRelay;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.oauth2.client.OAuth2ClientContext;
@@ -37,10 +39,10 @@ import org.springframework.security.oauth2.client.resource.OAuth2ProtectedResour
@AllArgsConstructor
@ConditionalOnProperty("security.oauth2.client.client-id")
public class PigxFeignClientConfiguration {
-
@Bean
public RequestInterceptor oauth2FeignRequestInterceptor(OAuth2ClientContext oAuth2ClientContext,
- OAuth2ProtectedResourceDetails resource) {
- return new PigxFeignClientInterceptor(oAuth2ClientContext, resource);
+ OAuth2ProtectedResourceDetails resource,
+ AccessTokenContextRelay accessTokenContextRelay) {
+ return new PigxFeignClientInterceptor(oAuth2ClientContext, resource,accessTokenContextRelay);
}
}
diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/feign/PigxFeignClientInterceptor.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/feign/PigxFeignClientInterceptor.java
index 1c011f0ab..1aad67fc6 100644
--- a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/feign/PigxFeignClientInterceptor.java
+++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/feign/PigxFeignClientInterceptor.java
@@ -17,12 +17,17 @@
package com.pig4cloud.pigx.common.security.feign;
+import cn.hutool.core.collection.CollUtil;
+import com.pig4cloud.pigx.common.core.constant.SecurityConstants;
import feign.RequestTemplate;
import lombok.extern.slf4j.Slf4j;
+import org.springframework.cloud.security.oauth2.client.AccessTokenContextRelay;
import org.springframework.cloud.security.oauth2.client.feign.OAuth2FeignRequestInterceptor;
import org.springframework.security.oauth2.client.OAuth2ClientContext;
import org.springframework.security.oauth2.client.resource.OAuth2ProtectedResourceDetails;
+import java.util.Collection;
+
/**
* @author lengleng
* @date 2018/8/13
@@ -31,32 +36,39 @@ import org.springframework.security.oauth2.client.resource.OAuth2ProtectedResour
@Slf4j
public class PigxFeignClientInterceptor extends OAuth2FeignRequestInterceptor {
private final OAuth2ClientContext oAuth2ClientContext;
+ private final AccessTokenContextRelay accessTokenContextRelay;
/**
* Default constructor which uses the provided OAuth2ClientContext and Bearer tokens
* within Authorization header
*
- * @param oAuth2ClientContext provided context
- * @param resource type of resource to be accessed
+ * @param oAuth2ClientContext provided context
+ * @param resource type of resource to be accessed
+ * @param accessTokenContextRelay
*/
public PigxFeignClientInterceptor(OAuth2ClientContext oAuth2ClientContext
- , OAuth2ProtectedResourceDetails resource) {
+ , OAuth2ProtectedResourceDetails resource, AccessTokenContextRelay accessTokenContextRelay) {
super(oAuth2ClientContext, resource);
this.oAuth2ClientContext = oAuth2ClientContext;
+ this.accessTokenContextRelay = accessTokenContextRelay;
}
/**
* Create a template with the header of provided name and extracted extract
+ * 1. 如果使用 非web 请求,header 区别
+ * 2. 根据authentication 还原请求token
*
* @param template
*/
@Override
public void apply(RequestTemplate template) {
- if (template.headers().isEmpty()) {
+ Collection
+ *
+ * @param authenticationException 登录的authentication 对象
+ * @param authentication 登录的authenticationException 对象
+ */
+ public abstract void handle(AuthenticationException authenticationException, Authentication authentication);
+}
diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/handler/AuthenticationSuccessEventHandler.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/handler/AuthenticationSuccessEventHandler.java
new file mode 100644
index 000000000..388836fca
--- /dev/null
+++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/handler/AuthenticationSuccessEventHandler.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2018-2025, lengleng All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the pig4cloud.com developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: lengleng (wangiegie@gmail.com)
+ */
+
+package com.pig4cloud.pigx.common.security.handler;
+
+import org.springframework.context.ApplicationListener;
+import org.springframework.security.authentication.event.AuthenticationSuccessEvent;
+import org.springframework.security.core.Authentication;
+
+/**
+ * @author lengleng
+ * @date 2018/10/8
+ * 认证成功事件处理器
+ */
+public abstract class AuthenticationSuccessEventHandler implements ApplicationListener
+ * 获取到登录的authentication 对象
+ *
+ * @param authentication 登录对象
+ */
+ public abstract void handle(Authentication authentication);
+}
diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/mobile/MobileLoginSuccessHandler.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/handler/MobileLoginSuccessHandler.java
similarity index 98%
rename from pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/mobile/MobileLoginSuccessHandler.java
rename to pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/handler/MobileLoginSuccessHandler.java
index 69de555b3..53cec6c86 100644
--- a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/mobile/MobileLoginSuccessHandler.java
+++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/handler/MobileLoginSuccessHandler.java
@@ -14,7 +14,7 @@
* this software without specific prior written permission.
* Author: lengleng (wangiegie@gmail.com)
*/
-package com.pig4cloud.pigx.common.security.mobile;
+package com.pig4cloud.pigx.common.security.handler;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.CharsetUtil;
diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxUser.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxUser.java
index cae1f7f50..099d7687c 100644
--- a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxUser.java
+++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxUser.java
@@ -72,6 +72,7 @@ public class PigxUser extends User {
super(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities);
this.id = id;
this.deptId = deptId;
+ this.deptId = deptId;
this.tenantId = tenantId;
}
}
diff --git a/pigx-config/src/main/resources/config/application-dev.yml b/pigx-config/src/main/resources/config/application-dev.yml
index f0d60ca6d..9f1e379b9 100644
--- a/pigx-config/src/main/resources/config/application-dev.yml
+++ b/pigx-config/src/main/resources/config/application-dev.yml
@@ -6,7 +6,7 @@ jasypt:
spring:
redis:
password:
- host: localhost
+ host: redis
# 暴露监控端点
management:
endpoints:
diff --git a/pigx-config/src/main/resources/config/pigx-auth-dev.yml b/pigx-config/src/main/resources/config/pigx-auth-dev.yml
index 6770a0507..e4187342e 100644
--- a/pigx-config/src/main/resources/config/pigx-auth-dev.yml
+++ b/pigx-config/src/main/resources/config/pigx-auth-dev.yml
@@ -4,5 +4,5 @@ spring:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
username: root
- password: 123456
- url: jdbc:mysql://127.0.0.1:3306/pigxx?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
+ password: 123456
+ url: jdbc:mysql://mysql:3306/pigx?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
diff --git a/pigx-config/src/main/resources/config/pigx-codegen-dev.yml b/pigx-config/src/main/resources/config/pigx-codegen-dev.yml
index 8e925f6ab..133c73ab7 100644
--- a/pigx-config/src/main/resources/config/pigx-codegen-dev.yml
+++ b/pigx-config/src/main/resources/config/pigx-codegen-dev.yml
@@ -12,8 +12,8 @@ spring:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
username: root
- password: 123456
- url: jdbc:mysql://127.0.0.1:3306/pigxx?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
+ password: 123456
+ url: jdbc:mysql://mysql:3306/pigx?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
jackson:
time-zone: GMT+8
date-format: yyyy-MM-dd HH:mm:ss
diff --git a/pigx-config/src/main/resources/config/pigx-daemon-dev.yml b/pigx-config/src/main/resources/config/pigx-daemon-dev.yml
index 5fcfbb876..5bb30138b 100644
--- a/pigx-config/src/main/resources/config/pigx-daemon-dev.yml
+++ b/pigx-config/src/main/resources/config/pigx-daemon-dev.yml
@@ -13,12 +13,12 @@ spring:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
username: root
- password: 123456
- url: jdbc:mysql://127.0.0.1:3306/pigxx?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
+ password: 123456
+ url: jdbc:mysql://mysql:3306/pigx?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
elasticjob:
# 分布式任务协调依赖zookeeper
zookeeper:
- server-lists: 114.116.45.246:13181
+ server-lists: zookeeper:2181
namespace: pigx-daemon
# 普通任务
simples:
diff --git a/pigx-config/src/main/resources/config/pigx-gateway-dev.yml b/pigx-config/src/main/resources/config/pigx-gateway-dev.yml
index 9862e31ef..be92d7cb7 100644
--- a/pigx-config/src/main/resources/config/pigx-gateway-dev.yml
+++ b/pigx-config/src/main/resources/config/pigx-gateway-dev.yml
@@ -14,26 +14,18 @@ spring:
- ImageCodeGatewayFilter
# 前端密码解密
- PasswordDecoderFilter
- - StripPrefix=1
#UPMS 模块
- id: pigx-upms
uri: lb://pigx-upms
predicates:
- Path=/admin/**
filters:
- # Swagger请求头处理
- - SwaggerHeaderFilter
- # 请求头清理避免不合法请求头
- - name: RemoveRequestHeader
- args:
- name: from
# 限流配置
- name: RequestRateLimiter
args:
key-resolver: '#{@remoteAddrKeyResolver}'
redis-rate-limiter.replenishRate: 10
redis-rate-limiter.burstCapacity: 20
- - StripPrefix=1
# 降级配置
- name: Hystrix
args:
@@ -44,29 +36,21 @@ spring:
uri: lb://pigx-codegen
predicates:
- Path=/gen/**
- filters:
- - StripPrefix=1
# 定时任务模块
- id: pigx-daemon
uri: lb://pigx-daemon
predicates:
- Path=/daemon/**
- filters:
- - StripPrefix=1
# 分布式事务管理模块
- id: pigx-tx-manager
uri: lb://pigx-tx-manager
predicates:
- Path=/tx/**
- filters:
- - StripPrefix=1
# 工作流管理模块
- id: pigx-activiti
uri: lb://pigx-activiti
predicates:
- Path=/act/**
- filters:
- - StripPrefix=1
security:
encode:
# 前端密码密钥,必须16位
diff --git a/pigx-config/src/main/resources/config/pigx-monitor-dev.yml b/pigx-config/src/main/resources/config/pigx-monitor-dev.yml
new file mode 100644
index 000000000..39e609042
--- /dev/null
+++ b/pigx-config/src/main/resources/config/pigx-monitor-dev.yml
@@ -0,0 +1,6 @@
+spring:
+ # 安全配置
+ security:
+ user:
+ name: ENC(rZHA4LW5hHmhLAAzJoFNag==)
+ password: ENC(bjeyh+Aeii3kHXkoo00ZUw==)
diff --git a/pigx-config/src/main/resources/config/pigx-upms-dev.yml b/pigx-config/src/main/resources/config/pigx-upms-dev.yml
index a5252dd4b..146ad8087 100644
--- a/pigx-config/src/main/resources/config/pigx-upms-dev.yml
+++ b/pigx-config/src/main/resources/config/pigx-upms-dev.yml
@@ -12,8 +12,8 @@ spring:
type: com.zaxxer.hikari.HikariDataSource
driver-class-name: com.mysql.jdbc.Driver
username: root
- password: 123456
- url: jdbc:mysql://127.0.0.1:3306/pigxx?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowMultiQueries=true
+ password: 123456
+ url: jdbc:mysql://mysql:3306/pigx?characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=false
# swagger相关配置,覆盖全局配置
swagger:
diff --git a/pigx-gateway/src/main/java/com/pig4cloud/pigx/gateway/filter/PigxRequestGlobalFilter.java b/pigx-gateway/src/main/java/com/pig4cloud/pigx/gateway/filter/PigxRequestGlobalFilter.java
new file mode 100644
index 000000000..bb608d7f5
--- /dev/null
+++ b/pigx-gateway/src/main/java/com/pig4cloud/pigx/gateway/filter/PigxRequestGlobalFilter.java
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 2018-2025, lengleng All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice,
+ * this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * Neither the name of the pig4cloud.com developer nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ * Author: lengleng (wangiegie@gmail.com)
+ */
+
+package com.pig4cloud.pigx.gateway.filter;
+
+import com.pig4cloud.pigx.common.core.constant.SecurityConstants;
+import com.pig4cloud.pigx.gateway.config.SwaggerProvider;
+import org.springframework.cloud.gateway.filter.GatewayFilterChain;
+import org.springframework.cloud.gateway.filter.GlobalFilter;
+import org.springframework.core.Ordered;
+import org.springframework.http.server.reactive.ServerHttpRequest;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StringUtils;
+import org.springframework.web.server.ServerWebExchange;
+import reactor.core.publisher.Mono;
+
+import java.util.Arrays;
+import java.util.stream.Collectors;
+
+import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.GATEWAY_REQUEST_URL_ATTR;
+import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.addOriginalRequestUrl;
+
+/**
+ * @author lengleng
+ * @date 2018/10/8
+ *
+ * 全局拦截器,作用所有的微服务
+ *
+ * 1. 对请求头中参数进行处理 from 参数进行清洗
+ * 2. 重写StripPrefix = 1,支持全局
+ * 3. 支持swagger添加X-Forwarded-Prefix header
+ */
+@Component
+public class PigxRequestGlobalFilter implements GlobalFilter, Ordered {
+ private static final String HEADER_NAME = "X-Forwarded-Prefix";
+
+ /**
+ * Process the Web request and (optionally) delegate to the next
+ * {@code WebFilter} through the given {@link GatewayFilterChain}.
+ *
+ * @param exchange the current server exchange
+ * @param chain provides a way to delegate to the next filter
+ * @return {@code Mono
+ * 加解密单元测试
+ */
+public class PigxAdminApplicationTest {
+ @Test
+ public void testJasypt() {
+ // 对应application-dev.yml 中配置的根密码
+ System.setProperty("jasypt.encryptor.password", "pigx");
+ StringEncryptor stringEncryptor = new DefaultLazyEncryptor(new StandardEnvironment());
+
+ //加密方法
+ System.out.println(stringEncryptor.encrypt("pigx"));
+
+ //解密方法
+ System.out.println(stringEncryptor.decrypt("ltJPpR50wT0oIY9kfOe1Iw==="));
+ }
+}
diff --git a/pigx-visual/pigx-monitor/pom.xml b/pigx-visual/pigx-monitor/pom.xml
index b1359ca98..2eb40ceb9 100644
--- a/pigx-visual/pigx-monitor/pom.xml
+++ b/pigx-visual/pigx-monitor/pom.xml
@@ -61,6 +61,11 @@