From cedd7eb91a7b05a23f221779e68873e3d7a60663 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=86=B7=E5=86=B7?= Date: Wed, 25 Mar 2020 21:33:58 +0800 Subject: [PATCH] =?UTF-8?q?:sparkles:=20Introducing=20new=20features.=20?= =?UTF-8?q?=E7=99=BB=E5=BD=95=E6=97=A5=E5=BF=97=E4=BF=9D=E5=AD=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pigx-auth/pom.xml | 5 ++ .../config/AuthorizationServerConfig.java | 46 +++---------------- ...PigxAuthenticationFailureEventHandler.java | 35 ++++++++++++-- ...PigxAuthenticationSuccessEventHandler.java | 27 +++++++++-- .../service/PigxClientDetailsServiceImpl.java | 42 +++++++++++++++++ .../service/PigxUserDetailsServiceImpl.java | 6 ++- pigx-auth/src/main/resources/bootstrap.yml | 2 + .../pigx/common/core/util/WebUtils.java | 3 +- pigx-common/pigx-common-data/pom.xml | 5 ++ .../pigx/common/log/util/SysLogUtils.java | 13 ++++++ pigx-common/pigx-common-security/pom.xml | 6 +-- .../component/PermitAllUrlProperties.java | 6 +-- .../handler/AuthenticationFailureHandler.java | 25 ++++++++++ .../handler/AuthenticationSuccessHandler.java | 23 ++++++++++ .../AuthenticationFailureEventListener.java} | 31 ++++++------- .../AuthenticationSuccessEventListener.java} | 29 ++++++------ .../main/resources/META-INF/spring.factories | 3 +- .../filter/ValidateCodeGatewayFilter.java | 4 +- .../pigx/admin/api/entity/SysRouteConf.java | 5 +- .../admin/config/DynamicRouteInitRunner.java | 2 +- .../admin/controller/SysDictController.java | 2 +- .../service/impl/SysMenuServiceImpl.java | 2 +- .../src/main/resources/bootstrap.yml | 2 + .../pigx/admin/PigxAdminApplicationTest.java | 10 ++++ 24 files changed, 239 insertions(+), 95 deletions(-) create mode 100644 pigx-auth/src/main/java/com/pig4cloud/pigx/auth/service/PigxClientDetailsServiceImpl.java rename {pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security => pigx-auth/src/main/java/com/pig4cloud/pigx/auth}/service/PigxUserDetailsServiceImpl.java (94%) create mode 100644 pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/handler/AuthenticationFailureHandler.java create mode 100644 pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/handler/AuthenticationSuccessHandler.java rename pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/{handler/AbstractAuthenticationFailureEventHandler.java => listener/AuthenticationFailureEventListener.java} (71%) rename pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/{handler/AbstractAuthenticationSuccessEventHandler.java => listener/AuthenticationSuccessEventListener.java} (73%) diff --git a/pigx-auth/pom.xml b/pigx-auth/pom.xml index 1e4cbbae7..a22bc5a7a 100644 --- a/pigx-auth/pom.xml +++ b/pigx-auth/pom.xml @@ -48,6 +48,11 @@ com.pig4cloud pigx-upms-api + + + com.pig4cloud + pigx-common-log + com.pig4cloud diff --git a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/config/AuthorizationServerConfig.java b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/config/AuthorizationServerConfig.java index 53239099b..cf771def3 100644 --- a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/config/AuthorizationServerConfig.java +++ b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/config/AuthorizationServerConfig.java @@ -20,35 +20,29 @@ package com.pig4cloud.pigx.auth.config; import cn.hutool.core.util.StrUtil; -import com.pig4cloud.pigx.common.core.constant.CacheConstants; import com.pig4cloud.pigx.common.core.constant.SecurityConstants; import com.pig4cloud.pigx.common.data.tenant.TenantContextHolder; import com.pig4cloud.pigx.common.security.component.PigxWebResponseExceptionTranslator; -import com.pig4cloud.pigx.common.security.service.PigxUserDetailsService; import lombok.AllArgsConstructor; import lombok.SneakyThrows; -import org.springframework.cache.annotation.Cacheable; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.http.HttpMethod; import org.springframework.security.authentication.AuthenticationManager; -import org.springframework.security.oauth2.common.exceptions.InvalidClientException; +import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.oauth2.config.annotation.configurers.ClientDetailsServiceConfigurer; import org.springframework.security.oauth2.config.annotation.web.configuration.AuthorizationServerConfigurerAdapter; import org.springframework.security.oauth2.config.annotation.web.configuration.EnableAuthorizationServer; import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerEndpointsConfigurer; import org.springframework.security.oauth2.config.annotation.web.configurers.AuthorizationServerSecurityConfigurer; -import org.springframework.security.oauth2.provider.ClientDetails; +import org.springframework.security.oauth2.provider.ClientDetailsService; import org.springframework.security.oauth2.provider.OAuth2Authentication; -import org.springframework.security.oauth2.provider.client.JdbcClientDetailsService; import org.springframework.security.oauth2.provider.token.DefaultAuthenticationKeyGenerator; import org.springframework.security.oauth2.provider.token.TokenEnhancer; import org.springframework.security.oauth2.provider.token.TokenStore; import org.springframework.security.oauth2.provider.token.store.redis.RedisTokenStore; -import javax.sql.DataSource; - /** * @author lengleng * @date 2018/6/22 @@ -58,17 +52,16 @@ import javax.sql.DataSource; @AllArgsConstructor @EnableAuthorizationServer public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter { - private final DataSource dataSource; - private final TokenEnhancer pigxTokenEnhancer; - private final PigxUserDetailsService pigxUserDetailsService; + private final ClientDetailsService pigxClientDetailsServiceImpl; private final AuthenticationManager authenticationManagerBean; private final RedisConnectionFactory redisConnectionFactory; + private final UserDetailsService pigxUserDetailsService; + private final TokenEnhancer pigxTokenEnhancer; @Override @SneakyThrows public void configure(ClientDetailsServiceConfigurer clients) { - PigxClientDetailsService clientDetailsService = new PigxClientDetailsService(dataSource); - clients.withClientDetails(clientDetailsService); + clients.withClientDetails(pigxClientDetailsServiceImpl); } @Override @@ -106,30 +99,3 @@ public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdap } } -/** - * @author lengleng - * @date 2020/03/25 - *

- * 扩展 JdbcClientDetailsService 支持多租户 - */ -class PigxClientDetailsService extends JdbcClientDetailsService { - - public PigxClientDetailsService(DataSource dataSource) { - super(dataSource); - } - - /** - * 重写原生方法支持redis缓存 - * - * @param clientId - * @return ClientDetails - * @throws InvalidClientException - */ - @Override - @Cacheable(value = CacheConstants.CLIENT_DETAILS_KEY, key = "#clientId", unless = "#result == null") - public ClientDetails loadClientByClientId(String clientId) { - super.setSelectClientDetailsSql(String.format(SecurityConstants.DEFAULT_SELECT_STATEMENT - , TenantContextHolder.getTenantId())); - return super.loadClientByClientId(clientId); - } -} \ No newline at end of file diff --git a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/handler/PigxAuthenticationFailureEventHandler.java b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/handler/PigxAuthenticationFailureEventHandler.java index 99ebb2ac7..f897ccc57 100644 --- a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/handler/PigxAuthenticationFailureEventHandler.java +++ b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/handler/PigxAuthenticationFailureEventHandler.java @@ -17,10 +17,23 @@ package com.pig4cloud.pigx.auth.handler; -import com.pig4cloud.pigx.common.security.handler.AbstractAuthenticationFailureEventHandler; +import com.pig4cloud.pigx.admin.api.entity.SysLog; +import com.pig4cloud.pigx.admin.api.feign.RemoteLogService; +import com.pig4cloud.pigx.common.core.constant.CommonConstants; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.util.WebUtils; +import com.pig4cloud.pigx.common.log.util.SysLogUtils; +import com.pig4cloud.pigx.common.security.handler.AuthenticationFailureHandler; +import lombok.AllArgsConstructor; +import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpHeaders; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.scheduling.annotation.Async; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; +import org.springframework.security.oauth2.provider.OAuth2Authentication; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; @@ -32,10 +45,12 @@ import javax.servlet.http.HttpServletResponse; */ @Slf4j @Component -public class PigxAuthenticationFailureEventHandler extends AbstractAuthenticationFailureEventHandler { +@AllArgsConstructor +public class PigxAuthenticationFailureEventHandler implements AuthenticationFailureHandler { + private final RemoteLogService logService; /** - * 处理登录失败方法 + * 异步处理,登录失败方法 *

* * @param authenticationException 登录的authentication 对象 @@ -43,8 +58,20 @@ public class PigxAuthenticationFailureEventHandler extends AbstractAuthenticatio * @param request 请求 * @param response 响应 */ + @Async @Override + @SneakyThrows public void handle(AuthenticationException authenticationException, Authentication authentication, HttpServletRequest request, HttpServletResponse response) { - log.info("用户:{} 登录失败,异常:{}", authentication.getPrincipal(), authenticationException.getLocalizedMessage()); + String username = authentication.getName(); + SysLog sysLog = SysLogUtils.getSysLog(request, username); + sysLog.setTitle(username + "用户登录"); + sysLog.setType(CommonConstants.STATUS_LOCK); + sysLog.setParams(username); + String header = request.getHeader(HttpHeaders.AUTHORIZATION); + sysLog.setServiceId(WebUtils.getClientId(header)[0]); + sysLog.setException(authenticationException.getLocalizedMessage()); + logService.saveLog(sysLog, SecurityConstants.FROM_IN); + + log.info("用户:{} 登录失败,异常:{}", username, 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 index 0dd045565..6592d5e8f 100644 --- 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 @@ -17,13 +17,24 @@ package com.pig4cloud.pigx.auth.handler; -import com.pig4cloud.pigx.common.security.handler.AbstractAuthenticationSuccessEventHandler; +import com.pig4cloud.pigx.admin.api.entity.SysLog; +import com.pig4cloud.pigx.admin.api.feign.RemoteLogService; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.core.util.WebUtils; +import com.pig4cloud.pigx.common.log.util.SysLogUtils; +import com.pig4cloud.pigx.common.security.handler.AuthenticationSuccessHandler; +import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.http.HttpHeaders; +import org.springframework.http.server.reactive.ServerHttpRequest; +import org.springframework.scheduling.annotation.Async; import org.springframework.security.core.Authentication; +import org.springframework.security.oauth2.provider.OAuth2Authentication; import org.springframework.stereotype.Component; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import java.util.concurrent.TimeUnit; /** * @author lengleng @@ -31,7 +42,9 @@ import javax.servlet.http.HttpServletResponse; */ @Slf4j @Component -public class PigxAuthenticationSuccessEventHandler extends AbstractAuthenticationSuccessEventHandler { +@AllArgsConstructor +public class PigxAuthenticationSuccessEventHandler implements AuthenticationSuccessHandler { + private final RemoteLogService logService; /** * 处理登录成功方法 @@ -42,8 +55,16 @@ public class PigxAuthenticationSuccessEventHandler extends AbstractAuthenticatio * @param request 请求 * @param response 返回 */ + @Async @Override public void handle(Authentication authentication, HttpServletRequest request, HttpServletResponse response) { - log.info("用户:{} 登录成功", authentication.getPrincipal()); + String username = authentication.getName(); + SysLog sysLog = SysLogUtils.getSysLog(request, username); + sysLog.setTitle(username + "用户登录"); + sysLog.setParams(username); + String header = request.getHeader(HttpHeaders.AUTHORIZATION); + sysLog.setServiceId(WebUtils.getClientId(header)[0]); + logService.saveLog(sysLog, SecurityConstants.FROM_IN); + log.info("用户:{} 登录成功", username); } } diff --git a/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/service/PigxClientDetailsServiceImpl.java b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/service/PigxClientDetailsServiceImpl.java new file mode 100644 index 000000000..552f255e3 --- /dev/null +++ b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/service/PigxClientDetailsServiceImpl.java @@ -0,0 +1,42 @@ +package com.pig4cloud.pigx.auth.service; + +import com.pig4cloud.pigx.common.core.constant.CacheConstants; +import com.pig4cloud.pigx.common.core.constant.SecurityConstants; +import com.pig4cloud.pigx.common.data.tenant.TenantContextHolder; +import lombok.AllArgsConstructor; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.security.oauth2.common.exceptions.InvalidClientException; +import org.springframework.security.oauth2.provider.ClientDetails; +import org.springframework.security.oauth2.provider.client.JdbcClientDetailsService; +import org.springframework.stereotype.Service; + +import javax.sql.DataSource; + +/** + * @author lengleng + * @date 2020/03/25 + *

+ * 扩展 JdbcClientDetailsService 支持多租户 + */ +@Service +public class PigxClientDetailsServiceImpl extends JdbcClientDetailsService { + public PigxClientDetailsServiceImpl(DataSource dataSource) { + super(dataSource); + } + + + /** + * 重写原生方法支持redis缓存 + * + * @param clientId + * @return ClientDetails + * @throws InvalidClientException + */ + @Override + @Cacheable(value = CacheConstants.CLIENT_DETAILS_KEY, key = "#clientId", unless = "#result == null") + public ClientDetails loadClientByClientId(String clientId) { + super.setSelectClientDetailsSql(String.format(SecurityConstants.DEFAULT_SELECT_STATEMENT + , TenantContextHolder.getTenantId())); + return super.loadClientByClientId(clientId); + } +} diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxUserDetailsServiceImpl.java b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/service/PigxUserDetailsServiceImpl.java similarity index 94% rename from pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxUserDetailsServiceImpl.java rename to pigx-auth/src/main/java/com/pig4cloud/pigx/auth/service/PigxUserDetailsServiceImpl.java index 819269f59..f9d307532 100644 --- a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/service/PigxUserDetailsServiceImpl.java +++ b/pigx-auth/src/main/java/com/pig4cloud/pigx/auth/service/PigxUserDetailsServiceImpl.java @@ -15,7 +15,7 @@ * Author: lengleng (wangiegie@gmail.com) */ -package com.pig4cloud.pigx.common.security.service; +package com.pig4cloud.pigx.auth.service; import cn.hutool.core.util.ArrayUtil; import cn.hutool.core.util.StrUtil; @@ -26,6 +26,8 @@ import com.pig4cloud.pigx.common.core.constant.CacheConstants; import com.pig4cloud.pigx.common.core.constant.CommonConstants; import com.pig4cloud.pigx.common.core.constant.SecurityConstants; import com.pig4cloud.pigx.common.core.util.R; +import com.pig4cloud.pigx.common.security.service.PigxUser; +import com.pig4cloud.pigx.common.security.service.PigxUserDetailsService; import lombok.AllArgsConstructor; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; @@ -35,6 +37,7 @@ import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.AuthorityUtils; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; import java.util.Arrays; import java.util.Collection; @@ -47,6 +50,7 @@ import java.util.Set; * @author lengleng */ @Slf4j +@Service @AllArgsConstructor public class PigxUserDetailsServiceImpl implements PigxUserDetailsService { private final RemoteUserService remoteUserService; diff --git a/pigx-auth/src/main/resources/bootstrap.yml b/pigx-auth/src/main/resources/bootstrap.yml index 124c2091d..61c48d630 100644 --- a/pigx-auth/src/main/resources/bootstrap.yml +++ b/pigx-auth/src/main/resources/bootstrap.yml @@ -8,6 +8,8 @@ spring: nacos: discovery: server-addr: ${NACOS-HOST:pigx-register}:${NACOS-PORT:8848} + metadata: + VERSION: lengleng config: server-addr: ${spring.cloud.nacos.discovery.server-addr} file-extension: yml diff --git a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/WebUtils.java b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/WebUtils.java index 7b6817a83..5017515fc 100644 --- a/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/WebUtils.java +++ b/pigx-common/pigx-common-core/src/main/java/com/pig4cloud/pigx/common/core/util/WebUtils.java @@ -212,8 +212,7 @@ public class WebUtils extends org.springframework.web.util.WebUtils { * @return */ @SneakyThrows - public String[] getClientId(ServerHttpRequest request) { - String header = request.getHeaders().getFirst(HttpHeaders.AUTHORIZATION); + public String[] getClientId(String header) { if (header == null || !header.startsWith(BASIC_)) { throw new CheckedException("请求头中client信息为空"); diff --git a/pigx-common/pigx-common-data/pom.xml b/pigx-common/pigx-common-data/pom.xml index be77f75f4..fe15dec66 100644 --- a/pigx-common/pigx-common-data/pom.xml +++ b/pigx-common/pigx-common-data/pom.xml @@ -49,6 +49,11 @@ com.pig4cloud pigx-common-security + + + com.pig4cloud + pigx-upms-api + org.springframework.boot diff --git a/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/util/SysLogUtils.java b/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/util/SysLogUtils.java index f1d603642..d3d0ee4ad 100644 --- a/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/util/SysLogUtils.java +++ b/pigx-common/pigx-common-log/src/main/java/com/pig4cloud/pigx/common/log/util/SysLogUtils.java @@ -56,6 +56,19 @@ public class SysLogUtils { return sysLog; } + public SysLog getSysLog(HttpServletRequest request, String username) { + SysLog sysLog = new SysLog(); + sysLog.setCreateBy(username); + sysLog.setType(CommonConstants.STATUS_NORMAL); + sysLog.setRemoteAddr(ServletUtil.getClientIP(request)); + sysLog.setRequestUri(URLUtil.getPath(request.getRequestURI())); + sysLog.setMethod(request.getMethod()); + sysLog.setUserAgent(request.getHeader("user-agent")); + sysLog.setParams(HttpUtil.toParams(request.getParameterMap())); + sysLog.setServiceId(getClientId()); + return sysLog; + } + /** * 获取客户端 * diff --git a/pigx-common/pigx-common-security/pom.xml b/pigx-common/pigx-common-security/pom.xml index 84fc65907..124da511c 100644 --- a/pigx-common/pigx-common-security/pom.xml +++ b/pigx-common/pigx-common-security/pom.xml @@ -48,10 +48,10 @@ io.github.openfeign feign-core - + - com.pig4cloud - pigx-upms-api + org.aspectj + aspectjrt diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PermitAllUrlProperties.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PermitAllUrlProperties.java index fd9c2d89c..3fbc3a1ae 100644 --- a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PermitAllUrlProperties.java +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/component/PermitAllUrlProperties.java @@ -18,7 +18,7 @@ package com.pig4cloud.pigx.common.security.component; import cn.hutool.core.util.ReUtil; -import com.baomidou.mybatisplus.core.toolkit.StringPool; +import cn.hutool.core.util.StrUtil; import com.pig4cloud.pigx.common.security.annotation.Inner; import lombok.Getter; import lombok.Setter; @@ -71,13 +71,13 @@ public class PermitAllUrlProperties implements InitializingBean { Inner method = AnnotationUtils.findAnnotation(handlerMethod.getMethod(), Inner.class); Optional.ofNullable(method) .ifPresent(inner -> info.getPatternsCondition().getPatterns() - .forEach(url -> ignoreUrls.add(ReUtil.replaceAll(url, PATTERN, StringPool.ASTERISK)))); + .forEach(url -> ignoreUrls.add(ReUtil.replaceAll(url, PATTERN, "*")))); // 获取类上边的注解, 替代path variable 为 * Inner controller = AnnotationUtils.findAnnotation(handlerMethod.getBeanType(), Inner.class); Optional.ofNullable(controller) .ifPresent(inner -> info.getPatternsCondition().getPatterns() - .forEach(url -> ignoreUrls.add(ReUtil.replaceAll(url, PATTERN, StringPool.ASTERISK)))); + .forEach(url -> ignoreUrls.add(ReUtil.replaceAll(url, PATTERN, "*")))); }); } diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/handler/AuthenticationFailureHandler.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/handler/AuthenticationFailureHandler.java new file mode 100644 index 000000000..9b07e5f33 --- /dev/null +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/handler/AuthenticationFailureHandler.java @@ -0,0 +1,25 @@ +package com.pig4cloud.pigx.common.security.handler; + +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author lengleng + * @date 2020/03/25 + * token 发放失败处理 + */ +public interface AuthenticationFailureHandler { + + /** + * 业务处理 + * + * @param authenticationException 错误信息 + * @param authentication 认证信息 + * @param request 请求信息 + * @param response 响应信息 + */ + void handle(AuthenticationException authenticationException, Authentication authentication, HttpServletRequest request, HttpServletResponse response); +} diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/handler/AuthenticationSuccessHandler.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/handler/AuthenticationSuccessHandler.java new file mode 100644 index 000000000..594f96a6b --- /dev/null +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/handler/AuthenticationSuccessHandler.java @@ -0,0 +1,23 @@ +package com.pig4cloud.pigx.common.security.handler; + +import org.springframework.security.core.Authentication; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * @author lengleng + * @date 2020/03/25 + * token 发放成功处理 + */ +public interface AuthenticationSuccessHandler { + + /** + * 业务处理 + * + * @param authentication 认证信息 + * @param request 请求信息 + * @param response 响应信息 + */ + void handle(Authentication authentication, HttpServletRequest request, HttpServletResponse response); +} diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/handler/AbstractAuthenticationFailureEventHandler.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/listener/AuthenticationFailureEventListener.java similarity index 71% rename from pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/handler/AbstractAuthenticationFailureEventHandler.java rename to pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/listener/AuthenticationFailureEventListener.java index b8a5ccecf..1d1f5e4ef 100644 --- a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/handler/AbstractAuthenticationFailureEventHandler.java +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/listener/AuthenticationFailureEventListener.java @@ -15,12 +15,16 @@ * Author: lengleng (wangiegie@gmail.com) */ -package com.pig4cloud.pigx.common.security.handler; +package com.pig4cloud.pigx.common.security.listener; +import com.pig4cloud.pigx.common.security.handler.AuthenticationFailureHandler; +import lombok.AllArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationListener; import org.springframework.security.authentication.event.AbstractAuthenticationFailureEvent; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; +import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; @@ -29,10 +33,12 @@ import javax.servlet.http.HttpServletResponse; /** * @author lengleng - * @date 2018/10/8 - * 认证失败事件处理器 + * @date 2020/03/25 + * 认证失败事件监听器 */ -public abstract class AbstractAuthenticationFailureEventHandler implements ApplicationListener { +public class AuthenticationFailureEventListener implements ApplicationListener { + @Autowired(required = false) + private AuthenticationFailureHandler failureHandler; /** * Handle an application event. @@ -49,18 +55,9 @@ public abstract class AbstractAuthenticationFailureEventHandler implements Appli AuthenticationException authenticationException = event.getException(); Authentication authentication = (Authentication) event.getSource(); - handle(authenticationException, authentication, request, response); + // 调用自定义业务实现 + if (failureHandler != null) { + failureHandler.handle(authenticationException, authentication, request, response); + } } - - /** - * 处理登录失败方法 - *

- * - * @param authenticationException 登录的authentication 对象 - * @param authentication 登录的authenticationException 对象 - * @param request 请求 - * @param response 响应 - */ - public abstract void handle(AuthenticationException authenticationException, Authentication authentication - , HttpServletRequest request, HttpServletResponse response); } diff --git a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/handler/AbstractAuthenticationSuccessEventHandler.java b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/listener/AuthenticationSuccessEventListener.java similarity index 73% rename from pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/handler/AbstractAuthenticationSuccessEventHandler.java rename to pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/listener/AuthenticationSuccessEventListener.java index fb69571f2..2cf9985f8 100644 --- a/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/handler/AbstractAuthenticationSuccessEventHandler.java +++ b/pigx-common/pigx-common-security/src/main/java/com/pig4cloud/pigx/common/security/listener/AuthenticationSuccessEventListener.java @@ -15,12 +15,16 @@ * Author: lengleng (wangiegie@gmail.com) */ -package com.pig4cloud.pigx.common.security.handler; +package com.pig4cloud.pigx.common.security.listener; import cn.hutool.core.collection.CollUtil; +import com.pig4cloud.pigx.common.security.handler.AuthenticationSuccessHandler; +import lombok.AllArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationListener; import org.springframework.security.authentication.event.AuthenticationSuccessEvent; import org.springframework.security.core.Authentication; +import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; import org.springframework.web.context.request.ServletRequestAttributes; @@ -29,10 +33,13 @@ import javax.servlet.http.HttpServletResponse; /** * @author lengleng - * @date 2018/10/8 - * 认证成功事件处理器 + * @date 2020/03/25 + * 认证成功事件监听器 */ -public abstract class AbstractAuthenticationSuccessEventHandler implements ApplicationListener { +public class AuthenticationSuccessEventListener implements ApplicationListener { + @Autowired(required = false) + private AuthenticationSuccessHandler successHandler; + /** * Handle an application event. * @@ -46,19 +53,9 @@ public abstract class AbstractAuthenticationSuccessEventHandler implements Appli HttpServletResponse response = requestAttributes.getResponse(); Authentication authentication = (Authentication) event.getSource(); - if (CollUtil.isNotEmpty(authentication.getAuthorities())) { - handle(authentication, request, response); + if (CollUtil.isNotEmpty(authentication.getAuthorities()) && successHandler != null) { + successHandler.handle(authentication, request, response); } } - /** - * 处理登录成功方法 - *

- * 获取到登录的authentication 对象 - * - * @param authentication 登录对象 - * @param request 请求 - * @param response 响应 - */ - public abstract void handle(Authentication authentication, HttpServletRequest request, HttpServletResponse response); } diff --git a/pigx-common/pigx-common-security/src/main/resources/META-INF/spring.factories b/pigx-common/pigx-common-security/src/main/resources/META-INF/spring.factories index f2826c158..367df029e 100644 --- a/pigx-common/pigx-common-security/src/main/resources/META-INF/spring.factories +++ b/pigx-common/pigx-common-security/src/main/resources/META-INF/spring.factories @@ -2,5 +2,6 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.pig4cloud.pigx.common.security.component.GlobalExceptionHandlerResolver,\ com.pig4cloud.pigx.common.security.component.PigxTokenEnhancer,\ com.pig4cloud.pigx.common.security.component.PigxSecurityInnerAspect,\ - com.pig4cloud.pigx.common.security.service.PigxUserDetailsServiceImpl + com.pig4cloud.pigx.common.security.listener.AuthenticationFailureEventListener,\ + com.pig4cloud.pigx.common.security.listener.AuthenticationSuccessEventListener diff --git a/pigx-gateway/src/main/java/com/pig4cloud/pigx/gateway/filter/ValidateCodeGatewayFilter.java b/pigx-gateway/src/main/java/com/pig4cloud/pigx/gateway/filter/ValidateCodeGatewayFilter.java index bdbabf41f..89d8e1f0e 100644 --- a/pigx-gateway/src/main/java/com/pig4cloud/pigx/gateway/filter/ValidateCodeGatewayFilter.java +++ b/pigx-gateway/src/main/java/com/pig4cloud/pigx/gateway/filter/ValidateCodeGatewayFilter.java @@ -34,6 +34,7 @@ import org.springframework.cloud.gateway.filter.GatewayFilter; import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.StringRedisSerializer; +import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.server.reactive.ServerHttpRequest; @@ -74,7 +75,8 @@ public class ValidateCodeGatewayFilter extends AbstractGatewayFilterFactory { // 终端设置不校验, 直接向下执行 try { - String[] clientInfos = WebUtils.getClientId(request); + String header = request.getHeaders().getFirst(HttpHeaders.AUTHORIZATION); + String[] clientInfos = WebUtils.getClientId(header); if (filterIgnorePropertiesConfig.getClients().contains(clientInfos[0])) { return chain.filter(exchange); } diff --git a/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysRouteConf.java b/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysRouteConf.java index 0583648a5..9fb4e618c 100755 --- a/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysRouteConf.java +++ b/pigx-upms/pigx-upms-api/src/main/java/com/pig4cloud/pigx/admin/api/entity/SysRouteConf.java @@ -92,5 +92,8 @@ public class SysRouteConf extends Model { @TableLogic @ApiModelProperty(value = "删除标记,1:已删除,0:正常") private String delFlag; - + /** + * 租户ID + */ + private Integer tenantId; } diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/config/DynamicRouteInitRunner.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/config/DynamicRouteInitRunner.java index 9e71e54f5..b6e8417af 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/config/DynamicRouteInitRunner.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/config/DynamicRouteInitRunner.java @@ -73,7 +73,7 @@ public class DynamicRouteInitRunner { JSONArray predicateObj = JSONUtil.parseArray(route.getPredicates()); vo.setPredicates(predicateObj.toList(PredicateDefinition.class)); - log.info("加载路由ID:{},{}", route.getRouteId(), vo); + log.info("加载租户 {},路由ID:{},{}", route.getTenantId(), route.getRouteId(), vo); redisTemplate.setHashValueSerializer(new Jackson2JsonRedisSerializer<>(RouteDefinitionVo.class)); redisTemplate.opsForHash().put(CacheConstants.ROUTE_KEY, route.getRouteId(), vo); }); diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysDictController.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysDictController.java index eae9a7869..dcd6cfaf2 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysDictController.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/controller/SysDictController.java @@ -84,7 +84,7 @@ public class SysDictController { * @return 同类型字典 */ @GetMapping("/type/{type}") - @Cacheable(value = CacheConstants.DICT_DETAILS, key = "#type", unless = "#result.data.size == 0") + @Cacheable(value = CacheConstants.DICT_DETAILS, key = "#type", unless = "#result.data.size() == 0") public R getDictByType(@PathVariable String type) { return R.ok(sysDictItemService.list(Wrappers .query().lambda() diff --git a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysMenuServiceImpl.java b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysMenuServiceImpl.java index c54240582..910b15f9a 100644 --- a/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysMenuServiceImpl.java +++ b/pigx-upms/pigx-upms-biz/src/main/java/com/pig4cloud/pigx/admin/service/impl/SysMenuServiceImpl.java @@ -60,7 +60,7 @@ public class SysMenuServiceImpl extends ServiceImpl impl private final SysRoleMenuMapper sysRoleMenuMapper; @Override - @Cacheable(value = CacheConstants.MENU_DETAILS, key = "#roleId + '_menu'", unless = "#result.size() == 0") + @Cacheable(value = CacheConstants.MENU_DETAILS, key = "#roleId + '_menu'") public List findMenuByRoleId(Integer roleId) { return baseMapper.listMenusByRoleId(roleId); } diff --git a/pigx-upms/pigx-upms-biz/src/main/resources/bootstrap.yml b/pigx-upms/pigx-upms-biz/src/main/resources/bootstrap.yml index 68f748cae..fe7c1eb64 100644 --- a/pigx-upms/pigx-upms-biz/src/main/resources/bootstrap.yml +++ b/pigx-upms/pigx-upms-biz/src/main/resources/bootstrap.yml @@ -8,6 +8,8 @@ spring: nacos: discovery: server-addr: ${NACOS-HOST:pigx-register}:${NACOS-PORT:8848} + metadata: + VERSION: lengleng config: server-addr: ${spring.cloud.nacos.discovery.server-addr} file-extension: yml diff --git a/pigx-upms/pigx-upms-biz/src/test/java/com/pig4cloud/pigx/admin/PigxAdminApplicationTest.java b/pigx-upms/pigx-upms-biz/src/test/java/com/pig4cloud/pigx/admin/PigxAdminApplicationTest.java index 110017382..027c9a61d 100644 --- a/pigx-upms/pigx-upms-biz/src/test/java/com/pig4cloud/pigx/admin/PigxAdminApplicationTest.java +++ b/pigx-upms/pigx-upms-biz/src/test/java/com/pig4cloud/pigx/admin/PigxAdminApplicationTest.java @@ -17,6 +17,11 @@ package com.pig4cloud.pigx.admin; +import org.junit.Test; + +import java.util.ArrayList; +import java.util.List; + /** * @author lengleng * @date 2018/10/7 @@ -24,4 +29,9 @@ package com.pig4cloud.pigx.admin; */ public class PigxAdminApplicationTest { + @Test + public void test(){ + ArrayList stringList = new ArrayList<>(); + stringList.size(); + } }