From 5fbd284994e8ea8b7ef398ce136a7ff46d0e4133 Mon Sep 17 00:00:00 2001 From: xiaohanzi Date: Mon, 29 Jun 2020 22:21:43 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=94=B9=E9=9B=86=E5=9B=A2=E7=89=88?= =?UTF-8?q?=E6=9C=ACbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/iformall/annotation/TenantIgnore.java | 16 +++++++ .../interceptor/CurrentTenantInterceptor.java | 48 +++++++++++++++++++ .../java/com/iformall/shiro/MyShiroRealm.java | 1 + .../com/iformall/tenant/TenantInfoImpl.java | 9 ++-- .../com/iformall/annotation/TenantIgnore.java | 16 +++++++ .../interceptor/AuthorizationInterceptor.java | 21 +++++++- .../com/iformall/tenant/TenantInfoImpl.java | 11 +++-- .../com/iformall/annotation/TenantIgnore.java | 16 +++++++ .../interceptor/AuthorizationInterceptor.java | 17 +++++++ .../com/iformall/tenant/TenantInfoImpl.java | 11 +++-- .../iformall/common/TenantThreadLocal.java | 26 ++++++++++ 11 files changed, 180 insertions(+), 12 deletions(-) create mode 100644 mallinkAdmin/src/main/java/com/iformall/annotation/TenantIgnore.java create mode 100644 mallinkAdmin/src/main/java/com/iformall/interceptor/CurrentTenantInterceptor.java create mode 100644 mallinkBApi/src/main/java/com/iformall/annotation/TenantIgnore.java create mode 100644 mallinkCApi/src/main/java/com/iformall/annotation/TenantIgnore.java create mode 100644 mallinkService/src/main/java/com/iformall/common/TenantThreadLocal.java diff --git a/mallinkAdmin/src/main/java/com/iformall/annotation/TenantIgnore.java b/mallinkAdmin/src/main/java/com/iformall/annotation/TenantIgnore.java new file mode 100644 index 000000000..2623b71e2 --- /dev/null +++ b/mallinkAdmin/src/main/java/com/iformall/annotation/TenantIgnore.java @@ -0,0 +1,16 @@ +package com.iformall.annotation; + +import java.lang.annotation.*; + +/** + * api接口,忽略Token验证 + * @author stormeye.wu + * @email wuguoqiang@iformall.com + * @date 2017-03-23 15:44 + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface TenantIgnore { + +} diff --git a/mallinkAdmin/src/main/java/com/iformall/interceptor/CurrentTenantInterceptor.java b/mallinkAdmin/src/main/java/com/iformall/interceptor/CurrentTenantInterceptor.java new file mode 100644 index 000000000..78a59bfd4 --- /dev/null +++ b/mallinkAdmin/src/main/java/com/iformall/interceptor/CurrentTenantInterceptor.java @@ -0,0 +1,48 @@ +package com.iformall.interceptor; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.session.Session; +import org.apache.shiro.subject.Subject; +import org.springframework.stereotype.Component; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; +import com.iformall.annotation.TenantIgnore; +import com.iformall.common.TenantThreadLocal; +import com.iformall.shiro.UserSession; + +/** + * 权限(Token)验证 + * @author stormeye.wu + * @email wuguoqiang@iformall.com + * @date 2017-03-23 15:38 + */ +@Component +public class CurrentTenantInterceptor extends HandlerInterceptorAdapter { + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + + Subject s = SecurityUtils.getSubject(); + if (null != s ) { + Session session = s.getSession(); + if (null != session ) { + TenantThreadLocal.setCurrentThreadTenant((String)session.getAttribute(UserSession.tenantId), + (String)session.getAttribute(UserSession.parentTenantId)); + } + } + + TenantIgnore annotation = null; + if(handler instanceof HandlerMethod) { + annotation = ((HandlerMethod) handler).getMethodAnnotation(TenantIgnore.class); + } + + //如果有@TenantIgnore注解,则把tenant信息全部清掉 + if(annotation != null){ + TenantThreadLocal.remove(); + } + + return true; + } +} diff --git a/mallinkAdmin/src/main/java/com/iformall/shiro/MyShiroRealm.java b/mallinkAdmin/src/main/java/com/iformall/shiro/MyShiroRealm.java index d75179957..abddf23a6 100644 --- a/mallinkAdmin/src/main/java/com/iformall/shiro/MyShiroRealm.java +++ b/mallinkAdmin/src/main/java/com/iformall/shiro/MyShiroRealm.java @@ -69,6 +69,7 @@ public class MyShiroRealm extends AuthorizingRealm { if (StringUtils.isNotBlank(user.getParentTenantId())) { session.setAttribute(UserSession.parentTenantId, user.getParentTenantId()); } + return authenticationInfo; } diff --git a/mallinkAdmin/src/main/java/com/iformall/tenant/TenantInfoImpl.java b/mallinkAdmin/src/main/java/com/iformall/tenant/TenantInfoImpl.java index 9533c8cb5..f26d3e90a 100644 --- a/mallinkAdmin/src/main/java/com/iformall/tenant/TenantInfoImpl.java +++ b/mallinkAdmin/src/main/java/com/iformall/tenant/TenantInfoImpl.java @@ -1,5 +1,6 @@ package com.iformall.tenant; +import com.iformall.common.TenantThreadLocal; import com.iformall.plugin.TenantInfo; import com.iformall.shiro.UserSession; import org.apache.ibatis.mapping.MappedStatement; @@ -10,12 +11,13 @@ import org.slf4j.LoggerFactory; public class TenantInfoImpl implements TenantInfo { private final Logger logger = LoggerFactory.getLogger(this.getClass()); - + @Override public String getTenantId() { String tenantId = null; try { - tenantId = (String) SecurityUtils.getSubject().getSession().getAttribute(UserSession.tenantId); + //tenantId = (String) SecurityUtils.getSubject().getSession().getAttribute(UserSession.tenantId); + tenantId = TenantThreadLocal.getTenantId(); } catch (InvalidSessionException e) { logger.error("InvalidSession: " + e.getMessage()); } @@ -26,7 +28,8 @@ public class TenantInfoImpl implements TenantInfo { public String getParentTenantId() { String parentTenantId = null; try { - parentTenantId = (String) SecurityUtils.getSubject().getSession().getAttribute(UserSession.parentTenantId); + //parentTenantId = (String) SecurityUtils.getSubject().getSession().getAttribute(UserSession.parentTenantId); + parentTenantId = TenantThreadLocal.getTenantId(); } catch (InvalidSessionException e) { logger.error("InvalidSession: " + e.getMessage()); } diff --git a/mallinkBApi/src/main/java/com/iformall/annotation/TenantIgnore.java b/mallinkBApi/src/main/java/com/iformall/annotation/TenantIgnore.java new file mode 100644 index 000000000..2623b71e2 --- /dev/null +++ b/mallinkBApi/src/main/java/com/iformall/annotation/TenantIgnore.java @@ -0,0 +1,16 @@ +package com.iformall.annotation; + +import java.lang.annotation.*; + +/** + * api接口,忽略Token验证 + * @author stormeye.wu + * @email wuguoqiang@iformall.com + * @date 2017-03-23 15:44 + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface TenantIgnore { + +} diff --git a/mallinkBApi/src/main/java/com/iformall/interceptor/AuthorizationInterceptor.java b/mallinkBApi/src/main/java/com/iformall/interceptor/AuthorizationInterceptor.java index 21eb0e188..11119d6e1 100644 --- a/mallinkBApi/src/main/java/com/iformall/interceptor/AuthorizationInterceptor.java +++ b/mallinkBApi/src/main/java/com/iformall/interceptor/AuthorizationInterceptor.java @@ -2,7 +2,9 @@ package com.iformall.interceptor; import com.iformall.annotation.AuthIgnore; +import com.iformall.annotation.TenantIgnore; import com.iformall.common.ErrorCode; +import com.iformall.common.TenantThreadLocal; import com.iformall.domain.po.WxBuser; import com.iformall.exception.MallinkException; import com.iformall.service.WxBuserTokenService; @@ -61,11 +63,28 @@ public class AuthorizationInterceptor extends HandlerInterceptorAdapter { if (wxBuser == null || wxBuser.getExpireTime().getTime() < System.currentTimeMillis()) { throw new MallinkException(ErrorCode.NET_TOKEN_INVALID.getCode(), "URL:" + request.getRequestURL() + " token失效,请重新登录"); } - + //设置userId到request里,后续根据userId,获取用户信息 request.setAttribute(Constant.LOGIN_USER_KEY, wxBuser.getId()); request.setAttribute(Constant.TENANT_ID, wxBuser.getTenantId()); + + //如果是要不需要自动设置tenantI信息 + TenantIgnore tenantIgnoreAnnotation = null; + if(handler instanceof HandlerMethod) { + tenantIgnoreAnnotation = ((HandlerMethod) handler).getMethodAnnotation(TenantIgnore.class); + } + + //如果有@TenantIgnore注解,则把tenant信息全部清掉 + if(tenantIgnoreAnnotation != null){ + TenantThreadLocal.remove(); + }else { + TenantThreadLocal.setCurrentThreadTenant(wxBuser.getTenantId(), wxBuser.getParentTenantId()); + } + + + + return true; } } diff --git a/mallinkBApi/src/main/java/com/iformall/tenant/TenantInfoImpl.java b/mallinkBApi/src/main/java/com/iformall/tenant/TenantInfoImpl.java index 37c1b215f..6ac0df996 100644 --- a/mallinkBApi/src/main/java/com/iformall/tenant/TenantInfoImpl.java +++ b/mallinkBApi/src/main/java/com/iformall/tenant/TenantInfoImpl.java @@ -1,5 +1,6 @@ package com.iformall.tenant; +import com.iformall.common.TenantThreadLocal; import com.iformall.plugin.TenantInfo; import com.iformall.utils.Constant; import org.apache.ibatis.mapping.MappedStatement; @@ -17,8 +18,9 @@ public class TenantInfoImpl implements TenantInfo { public String getTenantId() { String tenantId = null; try { - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); - tenantId = (String) request.getAttribute(Constant.TENANT_ID); + //HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + //tenantId = (String) request.getAttribute(Constant.TENANT_ID); + tenantId = TenantThreadLocal.getTenantId(); return tenantId; } catch (Exception e) { logger.error("getTenantId: " + e.getMessage()); @@ -30,8 +32,9 @@ public class TenantInfoImpl implements TenantInfo { public String getParentTenantId() { String parentTenantId = null; try { - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); - parentTenantId = (String) request.getAttribute(Constant.PARENT_TENANT_ID); + //HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + //parentTenantId = (String) request.getAttribute(Constant.PARENT_TENANT_ID); + parentTenantId = TenantThreadLocal.getParentTenantId(); return parentTenantId; } catch (Exception e) { logger.error(e.getMessage()); diff --git a/mallinkCApi/src/main/java/com/iformall/annotation/TenantIgnore.java b/mallinkCApi/src/main/java/com/iformall/annotation/TenantIgnore.java new file mode 100644 index 000000000..2623b71e2 --- /dev/null +++ b/mallinkCApi/src/main/java/com/iformall/annotation/TenantIgnore.java @@ -0,0 +1,16 @@ +package com.iformall.annotation; + +import java.lang.annotation.*; + +/** + * api接口,忽略Token验证 + * @author stormeye.wu + * @email wuguoqiang@iformall.com + * @date 2017-03-23 15:44 + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface TenantIgnore { + +} diff --git a/mallinkCApi/src/main/java/com/iformall/interceptor/AuthorizationInterceptor.java b/mallinkCApi/src/main/java/com/iformall/interceptor/AuthorizationInterceptor.java index ce05884fb..dcaeeefb1 100644 --- a/mallinkCApi/src/main/java/com/iformall/interceptor/AuthorizationInterceptor.java +++ b/mallinkCApi/src/main/java/com/iformall/interceptor/AuthorizationInterceptor.java @@ -2,7 +2,9 @@ package com.iformall.interceptor; import com.iformall.annotation.AuthIgnore; +import com.iformall.annotation.TenantIgnore; import com.iformall.common.ErrorCode; +import com.iformall.common.TenantThreadLocal; import com.iformall.domain.po.WxCUser; import com.iformall.exception.MallinkException; import com.iformall.service.WxCUserTokenService; @@ -68,6 +70,21 @@ public class AuthorizationInterceptor extends HandlerInterceptorAdapter { if (StringUtils.isNotBlank(wxCUser.getParentTenantId())) { request.setAttribute(Constant.PARENT_TENANT_ID, wxCUser.getParentTenantId()); } + + + //如果是要不需要自动设置tenantI信息 + TenantIgnore tenantIgnoreAnnotation = null; + if(handler instanceof HandlerMethod) { + tenantIgnoreAnnotation = ((HandlerMethod) handler).getMethodAnnotation(TenantIgnore.class); + } + + //如果有@TenantIgnore注解,则把tenant信息全部清掉 + if(tenantIgnoreAnnotation != null){ + TenantThreadLocal.remove(); + }else { + TenantThreadLocal.setCurrentThreadTenant(wxCUser.getTenantId(), wxCUser.getParentTenantId()); + } + return true; } diff --git a/mallinkCApi/src/main/java/com/iformall/tenant/TenantInfoImpl.java b/mallinkCApi/src/main/java/com/iformall/tenant/TenantInfoImpl.java index 1fec66f71..7fdaa836a 100644 --- a/mallinkCApi/src/main/java/com/iformall/tenant/TenantInfoImpl.java +++ b/mallinkCApi/src/main/java/com/iformall/tenant/TenantInfoImpl.java @@ -1,5 +1,6 @@ package com.iformall.tenant; +import com.iformall.common.TenantThreadLocal; import com.iformall.plugin.TenantInfo; import com.iformall.utils.Constant; import org.apache.ibatis.mapping.MappedStatement; @@ -17,8 +18,9 @@ public class TenantInfoImpl implements TenantInfo { public String getTenantId() { String tenantId = null; try { - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); - tenantId = (String) request.getAttribute(Constant.TENANT_ID); + //HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + //tenantId = (String) request.getAttribute(Constant.TENANT_ID); + tenantId = TenantThreadLocal.getTenantId(); return tenantId; } catch (Exception e) { logger.error(e.getMessage()); @@ -30,8 +32,9 @@ public class TenantInfoImpl implements TenantInfo { public String getParentTenantId() { String parentTenantId = null; try { - HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); - parentTenantId = (String) request.getAttribute(Constant.PARENT_TENANT_ID); + //HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); + //parentTenantId = (String) request.getAttribute(Constant.PARENT_TENANT_ID); + parentTenantId = TenantThreadLocal.getParentTenantId(); return parentTenantId; } catch (Exception e) { logger.error(e.getMessage()); diff --git a/mallinkService/src/main/java/com/iformall/common/TenantThreadLocal.java b/mallinkService/src/main/java/com/iformall/common/TenantThreadLocal.java new file mode 100644 index 000000000..6ec1462dd --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/common/TenantThreadLocal.java @@ -0,0 +1,26 @@ +package com.iformall.common; + +public class TenantThreadLocal { + + private static ThreadLocal local = new ThreadLocal(); + private static ThreadLocal parentLocal = new ThreadLocal(); + + public static void setCurrentThreadTenant(String tenantId,String parentId) { + local.set(tenantId); + parentLocal.set(parentId); + } + + public static String getTenantId() { + return local.get(); + } + + public static String getParentTenantId() { + return parentLocal.get(); + } + + public static void remove() { + local.remove(); + parentLocal.remove(); + } + +}