From daa697719eb0ddfd170f1ab94c5422a4f5b93951 Mon Sep 17 00:00:00 2001 From: zhaoxiaohao <279049017@qq.com> Date: Fri, 18 Sep 2020 14:36:54 +0800 Subject: [PATCH] Merge branch 'dev' --- kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/filter/OrganizationFilter.java | 148 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 148 insertions(+), 0 deletions(-) diff --git a/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/filter/OrganizationFilter.java b/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/filter/OrganizationFilter.java new file mode 100644 index 0000000..3f62c83 --- /dev/null +++ b/kidgrow-springcloud/kidgrow-springcloud-zuul/src/main/java/com/kidgrow/zuul/filter/OrganizationFilter.java @@ -0,0 +1,148 @@ +package com.kidgrow.zuul.filter; + +import cn.hutool.core.collection.CollectionUtil; +import com.alibaba.fastjson.JSON; +import com.kidgrow.common.constant.CommonConstant; +import com.kidgrow.common.constant.SecurityConstants; +import com.kidgrow.common.model.ResultBody; +import com.kidgrow.common.model.SysOrganization; +import com.kidgrow.common.model.SysUser; +import com.kidgrow.common.model.SysUserOrg; +import com.kidgrow.common.utils.AddrUtil; +import com.kidgrow.redis.util.RedisConstant; +import com.kidgrow.redis.util.RedisUtils; +import com.kidgrow.zuul.feign.SysOrganizationService; +import com.kidgrow.zuul.feign.SysUserOrgService; +import com.netflix.zuul.ZuulFilter; +import com.netflix.zuul.context.RequestContext; +import eu.bitwalker.useragentutils.UserAgent; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.hibernate.validator.constraints.NotBlank; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.security.authentication.AnonymousAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.oauth2.provider.OAuth2Authentication; +import org.springframework.stereotype.Component; + +import javax.servlet.http.HttpServletRequest; +import java.util.*; +import java.util.stream.Collectors; + +import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_DECORATION_FILTER_ORDER; + +/** + * 石家庄喜高科技有限责任公司 版权所有 © Copyright 2020<br> + * + * @Description: 将认证用户的相关信息放入header中, 后端服务可以直接读取使用 包含了----组织的拦截---<br> + * @Project: <br> + * @CreateDate: Created in 2020/2/21 10:12 <br> + * @Author: <a href="4345453@kidgrow.com">liuke</a> + */ +@Slf4j +@Component +public class OrganizationFilter extends ZuulFilter { + @Override + public String filterType() { + return FilterConstants.PRE_TYPE; + } + + @Override + public int filterOrder() { + return PRE_DECORATION_FILTER_ORDER; + } + + @Override + public boolean shouldFilter() { + return true; + } + + @Autowired + RedisUtils redisUtils; + @Autowired + private SysUserOrgService sysUserOrgService; + @Autowired + private SysOrganizationService sysOrganizationService; + + private final String CLIENTID = "webApp";//运营端 + + @SneakyThrows + @Override + public Object run() { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + if (authentication != null && !(authentication instanceof AnonymousAuthenticationToken)) { + Object principal = authentication.getPrincipal(); + RequestContext ctx = RequestContext.getCurrentContext(); + if (principal instanceof SysUser) { + //运营端进行 + OAuth2Authentication oauth2Authentication = (OAuth2Authentication) authentication; + String clientId = oauth2Authentication.getOAuth2Request().getClientId(); + if (CLIENTID.equals(clientId)) { + SysUser user = (SysUser) authentication.getPrincipal(); + /** + * 将组织中为空的拦截 + */ + List<SysUserOrg> sysUserOrgs = getSysUserOrg(user.getId()); + if (sysUserOrgs == null || sysUserOrgs.isEmpty()) { + ctx.setSendZuulResponse(false); + ctx.setResponseBody(JSON.toJSONString(ResultBody.fail(1000, "您的组织已经被禁用,请联系管理员"))); + } +// else { +// List<Long> collect = sysUserOrgs.stream().map(e -> e.getOrgId()).collect(Collectors.toList()); +// List<SysOrganization> sysOrganizations = getSysOrganization(); +// List<Long> orgIds = sysOrganizations.stream().filter(e -> e.getEnabled() == true && collect.contains(e.getId())).map(e -> e.getId()).collect(Collectors.toList()); +// if (orgIds == null || orgIds.size() <= 0) { +// ctx.setSendZuulResponse(false); +// ctx.setResponseBody(JSON.toJSONString(ResultBody.fail(1000, "您的组织已经被禁用,请联系管理员"))); +// } +// } + } + } + } + return null; + } + + /** + * 通过userID 获取组织的关系 + * + * @param str + * @return + */ + public List<SysUserOrg> getSysUserOrg(Long str) { + //获取组织 Redis中获取 + List<SysUserOrg> sysUserOrgs = JSON.parseArray(JSON.toJSONString(redisUtils.hget(RedisConstant.USER_ORGANIZATION, str.toString())), SysUserOrg.class); + if (sysUserOrgs == null || sysUserOrgs.size() <= 0) { + //在数据库查询 + Map<String, Object> map = new HashMap<>(); + map.put("user_id", str); + sysUserOrgs = sysUserOrgService.getListByMap(map); + redisUtils.hset(RedisConstant.USER_ORGANIZATION, str.toString(), sysUserOrgs); + } + return sysUserOrgs; + } + + public List<SysOrganization> getSysOrganization() { + Map<Object, Object> hmget = redisUtils.hmget(RedisConstant.ORGANIZATION); + List<SysOrganization> sysOrganizations = new ArrayList<>(); + if (hmget == null || hmget.size() <= 0) { + Map<String, Object> map = new HashMap<>(); + map.put("is_del", 0); + sysOrganizations = JSON.parseArray(JSON.toJSONString(sysOrganizationService.getListByMap(map).getData()), SysOrganization.class); + sysOrganizations.forEach(e -> { + redisUtils.hset(RedisConstant.ORGANIZATION, e.getId().toString(), e); + }); + + } else { + Set<Object> objects = hmget.keySet(); + Iterator<Object> iterator = objects.iterator(); + while (iterator.hasNext()) { + sysOrganizations.add((SysOrganization) hmget.get(iterator.next())); + } + } + return sysOrganizations; + } +} + -- Gitblit v1.8.0