18 changed files with 637 additions and 22 deletions
			
			
		| @ -0,0 +1,139 @@ | |||
| /** | |||
|  * Copyright (c) 2018 人人开源 All rights reserved. | |||
|  * | |||
|  * https://www.renren.io
 | |||
|  * | |||
|  * 版权所有,侵权必究! | |||
|  */ | |||
| 
 | |||
| package com.elink.esua.epdc.filter; | |||
| 
 | |||
| import com.alibaba.fastjson.JSON; | |||
| import com.elink.esua.epdc.commons.tools.constant.Constant; | |||
| import com.elink.esua.epdc.commons.tools.exception.RenException; | |||
| import com.elink.esua.epdc.commons.tools.security.user.UserDetail; | |||
| import com.elink.esua.epdc.commons.tools.utils.Result; | |||
| import com.elink.esua.epdc.feign.ResourceFeignClient; | |||
| import com.elink.esua.epdc.utils.jwt.JwtTokenUtils; | |||
| import io.jsonwebtoken.Claims; | |||
| import org.apache.commons.lang3.StringUtils; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.boot.context.properties.ConfigurationProperties; | |||
| import org.springframework.cloud.gateway.filter.GatewayFilterChain; | |||
| import org.springframework.cloud.gateway.filter.GlobalFilter; | |||
| import org.springframework.context.annotation.Configuration; | |||
| import org.springframework.core.io.buffer.DataBuffer; | |||
| import org.springframework.http.HttpHeaders; | |||
| import org.springframework.http.HttpStatus; | |||
| import org.springframework.http.MediaType; | |||
| import org.springframework.http.server.reactive.ServerHttpRequest; | |||
| import org.springframework.util.AntPathMatcher; | |||
| import org.springframework.web.server.ServerWebExchange; | |||
| import reactor.core.publisher.Flux; | |||
| import reactor.core.publisher.Mono; | |||
| 
 | |||
| import java.nio.charset.StandardCharsets; | |||
| import java.util.List; | |||
| 
 | |||
| /** | |||
|  * 权限过滤器 | |||
|  * | |||
|  * @author Mark sunlightcs@gmail.com | |||
|  * @since 1.0.0 | |||
|  */ | |||
| @Configuration | |||
| @ConfigurationProperties(prefix = "worklog") | |||
| public class WorkLogAuthFilter implements GlobalFilter { | |||
| 
 | |||
|     private final AntPathMatcher antPathMatcher = new AntPathMatcher(); | |||
| 
 | |||
|     @Autowired | |||
|     private ResourceFeignClient resourceFeignClient; | |||
| 
 | |||
|     @Autowired | |||
|     private JwtTokenUtils jwtUtils; | |||
| 
 | |||
|     /** | |||
|      * 拦截的工作日志接口 | |||
|      */ | |||
|     private List<String> urls; | |||
| 
 | |||
|     @Override | |||
|     public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { | |||
|         ServerHttpRequest request = exchange.getRequest(); | |||
|         String requestUri = request.getPath().pathWithinApplication().value(); | |||
| 
 | |||
|         //请求放行,无需验证权限
 | |||
|         if(pathMatcher(requestUri)){ | |||
|             return chain.filter(exchange); | |||
|         } | |||
| 
 | |||
|         //获取AccessToken 并进行验证
 | |||
|         String accessToken = request.getHeaders().getFirst(Constant.ACCESS_TOKEN); | |||
|         if(StringUtils.isBlank(accessToken)){ | |||
|             // 表示请求信息中没有携带AccessToken,前端需要修改上送数据
 | |||
|             throw new RenException("AccessToken为空"); | |||
|         } | |||
| 
 | |||
|         Claims claims = jwtUtils.getClaimByToken(accessToken); | |||
| 
 | |||
|         if (claims == null) { | |||
|             throw new RenException("AccessToken验证不通过"); | |||
|         } | |||
|         //验证结束
 | |||
| 
 | |||
|         //获取用户token
 | |||
|         String token = request.getHeaders().getFirst(Constant.TOKEN_HEADER); | |||
|         if(StringUtils.isBlank(token)){ | |||
|             token = request.getHeaders().getFirst(Constant.AUTHORIZATION_HEADER); | |||
|             if (StringUtils.isBlank(token)) { | |||
|                 token = request.getQueryParams().getFirst(Constant.TOKEN_HEADER); | |||
|             } | |||
|         } | |||
| 
 | |||
|         //资源访问权限
 | |||
|         String language = request.getHeaders().getFirst(HttpHeaders.ACCEPT_LANGUAGE); | |||
|         Result<UserDetail> result = resourceFeignClient.resource(language, token, requestUri, request.getMethod().toString()); | |||
|         //没权限访问,直接返回
 | |||
|         if(!result.success()){ | |||
|             return response(exchange, result); | |||
|         } | |||
| 
 | |||
|         //获取用户信息
 | |||
|         UserDetail userDetail = result.getData(); | |||
|         if(userDetail != null){ | |||
|             //当前登录用户userId,添加到header中
 | |||
|             ServerHttpRequest build = exchange.getRequest().mutate().header(Constant.USER_KEY, userDetail.getId()+"").build(); | |||
|             return chain.filter(exchange.mutate().request(build).build()); | |||
|         } | |||
| 
 | |||
|         return chain.filter(exchange); | |||
|     } | |||
| 
 | |||
|     private Mono<Void> response(ServerWebExchange exchange, Object object) { | |||
|         String json = JSON.toJSONString(object); | |||
|         DataBuffer buffer = exchange.getResponse().bufferFactory().wrap(json.getBytes(StandardCharsets.UTF_8)); | |||
|         exchange.getResponse().getHeaders().setContentType(MediaType.APPLICATION_JSON_UTF8); | |||
|         exchange.getResponse().setStatusCode(HttpStatus.OK); | |||
|         return exchange.getResponse().writeWith(Flux.just(buffer)); | |||
|     } | |||
| 
 | |||
|     private boolean pathMatcher(String requestUri){ | |||
| 
 | |||
|         for (String url : urls) { | |||
|             if(antPathMatcher.match(url, requestUri)){ | |||
|                 return false; | |||
|             } | |||
|         } | |||
|         return true; | |||
|     } | |||
| 
 | |||
|     public List<String> getUrls() { | |||
|         return urls; | |||
|     } | |||
| 
 | |||
|     public void setUrls(List<String> urls) { | |||
|         this.urls = urls; | |||
|     } | |||
| 
 | |||
| } | |||
| @ -0,0 +1,33 @@ | |||
| /** | |||
|  * Copyright (c) 2018 人人开源 All rights reserved. | |||
|  * | |||
|  * https://www.renren.io
 | |||
|  * | |||
|  * 版权所有,侵权必究! | |||
|  */ | |||
| 
 | |||
| package com.elink.esua.epdc.utils.jwt; | |||
| 
 | |||
| import org.springframework.boot.context.properties.ConfigurationProperties; | |||
| import org.springframework.context.annotation.Configuration; | |||
| 
 | |||
| /** | |||
|  * Jwt | |||
|  * | |||
|  * @author Mark sunlightcs@gmail.com | |||
|  * @since 1.0.0 | |||
|  */ | |||
| @Configuration | |||
| @ConfigurationProperties(prefix = "jwt.token") | |||
| public class JwtTokenProperties { | |||
|     private String secret; | |||
| 
 | |||
|     public String getSecret() { | |||
|         return secret; | |||
|     } | |||
| 
 | |||
|     public void setSecret(String secret) { | |||
|         this.secret = secret; | |||
|     } | |||
| 
 | |||
| } | |||
| @ -0,0 +1,71 @@ | |||
| /** | |||
|  * Copyright (c) 2018 人人开源 All rights reserved. | |||
|  * <p> | |||
|  * https://www.renren.io
 | |||
|  * <p> | |||
|  * 版权所有,侵权必究! | |||
|  */ | |||
| 
 | |||
| package com.elink.esua.epdc.utils.jwt; | |||
| 
 | |||
| import io.jsonwebtoken.Claims; | |||
| import io.jsonwebtoken.Jwts; | |||
| import io.jsonwebtoken.SignatureAlgorithm; | |||
| import org.slf4j.Logger; | |||
| import org.slf4j.LoggerFactory; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.stereotype.Component; | |||
| 
 | |||
| import java.util.Date; | |||
| import java.util.Map; | |||
| 
 | |||
| /** | |||
|  * Jwt工具类 | |||
|  * | |||
|  * @author Mark sunlightcs@gmail.com | |||
|  * @since 1.0.0 | |||
|  */ | |||
| @Component | |||
| public class JwtTokenUtils { | |||
|     private static final Logger logger = LoggerFactory.getLogger(JwtTokenUtils.class); | |||
| 
 | |||
|     @Autowired | |||
|     private JwtTokenProperties jwtProperties; | |||
| 
 | |||
|     /** | |||
|      * 生成上报接口accessToken | |||
|      * | |||
|      * @param claims | |||
|      * @return java.lang.String | |||
|      * @author Liuchuang | |||
|      * @since 2020/9/7 14:11 | |||
|      */ | |||
|     public String getEpmetAccessToken(Map<String,Object> claims){ | |||
|         return Jwts.builder() | |||
|                 .setHeaderParam("typ", "JWT") | |||
|                 .setClaims(claims) | |||
|                 .signWith(SignatureAlgorithm.HS512, jwtProperties.getSecret()) | |||
|                 .compact(); | |||
|     } | |||
| 
 | |||
|     public Claims getClaimByToken(String token) { | |||
|         try { | |||
|             return Jwts.parser() | |||
|                     .setSigningKey(jwtProperties.getSecret()) | |||
|                     .parseClaimsJws(token) | |||
|                     .getBody(); | |||
|         } catch (Exception e) { | |||
|             logger.debug("validate is token error, token = " + token, e); | |||
|             return null; | |||
|         } | |||
|     } | |||
| 
 | |||
|     /** | |||
|      * token是否过期 | |||
|      * | |||
|      * @return true:过期 | |||
|      */ | |||
|     public boolean isTokenExpired(Date expiration) { | |||
|         return expiration.before(new Date()); | |||
|     } | |||
| } | |||
| @ -0,0 +1,36 @@ | |||
| package com.elink.esua.epdc.modules.worklog; | |||
| 
 | |||
| import com.elink.esua.epdc.commons.tools.utils.Result; | |||
| import org.springframework.beans.factory.annotation.Value; | |||
| import org.springframework.web.bind.annotation.GetMapping; | |||
| import org.springframework.web.bind.annotation.RequestMapping; | |||
| import org.springframework.web.bind.annotation.RestController; | |||
| 
 | |||
| /** | |||
|  * @Description 获取customID | |||
|  * @Author songyunpeng | |||
|  * @Date 2020/2/10 16:06 | |||
|  */ | |||
| @RestController | |||
| @RequestMapping("workLog") | |||
| public class WorkLogAnalysisController { | |||
| 
 | |||
|     @Value("${epmet.config.customerId}") | |||
|     private String customId; | |||
| 
 | |||
| 
 | |||
|     /** | |||
|      * @Description  获取customId | |||
|      * @Author songyunpeng | |||
|      * @Date  2021/1/27 | |||
|      * @Param [] | |||
|      * @return com.elink.esua.epdc.commons.tools.utils.Result | |||
|      **/ | |||
|     @GetMapping("getCustomId") | |||
|     public Result<String> getCustomId(){ | |||
|         return new Result<String>().ok(customId); | |||
|     } | |||
| 
 | |||
| 
 | |||
| 
 | |||
| } | |||
| @ -0,0 +1,96 @@ | |||
| /** | |||
|  * Copyright (c) 2018 人人开源 All rights reserved. | |||
|  * <p> | |||
|  * https://www.renren.io
 | |||
|  * <p> | |||
|  * 版权所有,侵权必究! | |||
|  */ | |||
| 
 | |||
| package com.elink.esua.epdc.dto.result; | |||
| 
 | |||
| import lombok.Data; | |||
| 
 | |||
| import java.io.Serializable; | |||
| 
 | |||
| /** | |||
|  * 工作日志 用户信息 | |||
|  * | |||
|  * @author Mark sunlightcs@gmail.com | |||
|  * @since 1.0.0 | |||
|  */ | |||
| @Data | |||
| public class EpdcWorkLogUserDetailDTO implements Serializable { | |||
| 
 | |||
|     private static final long serialVersionUID = 3908231797102233188L; | |||
| 
 | |||
|     /** | |||
|      * 用户ID | |||
|      */ | |||
|     private String userId; | |||
| 
 | |||
|     /** | |||
|      * 微信昵称 | |||
|      */ | |||
|     private String nickname; | |||
| 
 | |||
|     /** | |||
|      * 头像 | |||
|      */ | |||
|     private String profile; | |||
| 
 | |||
|     /** | |||
|      * 真实姓名 | |||
|      */ | |||
|     private String realName; | |||
| 
 | |||
|     /** | |||
|      * 客户Id | |||
|      */ | |||
|     private String customerId; | |||
| 
 | |||
|     /** | |||
|      * 客户名称 | |||
|      */ | |||
|     private String customerName; | |||
| 
 | |||
|     /** | |||
|      * 所属组织Id | |||
|      */ | |||
|     private String agencyId; | |||
| 
 | |||
|     /** | |||
|      * 所属组织Id路径 | |||
|      */ | |||
|     private String agencyIdPath; | |||
| 
 | |||
|     /** | |||
|      * 所属组织名称 | |||
|      */ | |||
|     private String agencyName; | |||
| 
 | |||
|     /** | |||
|      * 所属组织名称路径 | |||
|      */ | |||
|     private String agencyNamePath; | |||
| 
 | |||
|     /** | |||
|      * 所在网格Id(工作人员最一次访问的网格) | |||
|      */ | |||
|     private String gridId; | |||
| 
 | |||
|     /** | |||
|      * 所在网格名称 | |||
|      */ | |||
|     private String gridName; | |||
| 
 | |||
|     /** | |||
|      * 是否总管理员,1是0否 | |||
|      */ | |||
|     private String adminFlag; | |||
| 
 | |||
|     /** | |||
|      * 手机号 | |||
|      */ | |||
|     private String mobile; | |||
| 
 | |||
| } | |||
| @ -0,0 +1,59 @@ | |||
| package com.elink.esua.epdc.controller; | |||
| 
 | |||
| import com.elink.esua.epdc.commons.tools.utils.Result; | |||
| import com.elink.esua.epdc.dto.DeptOption; | |||
| import com.elink.esua.epdc.dto.result.EpdcWorkLogUserDetailDTO; | |||
| import com.elink.esua.epdc.service.AdminService; | |||
| import org.springframework.beans.factory.annotation.Autowired; | |||
| import org.springframework.web.bind.annotation.*; | |||
| 
 | |||
| /** | |||
|  * 工作日志相关 | |||
|  * | |||
|  * @author songyunpeng | |||
|  * @date 2021/1/27 10:30 | |||
|  */ | |||
| @RestController | |||
| @RequestMapping("plugins/workLog") | |||
| public class ApiWorkLogController { | |||
|     @Autowired | |||
|     private AdminService adminService; | |||
|     /** | |||
|      * @Description  获取用户信息 | |||
|      * @Author songyunpeng | |||
|      * @Date  2021/1/27 | |||
|      * @Param [] | |||
|      * @return com.elink.esua.epdc.commons.tools.utils.Result<com.elink.esua.epdc.dto.result.EpdcWorkLogUserDetailDTO> | |||
|      **/ | |||
|     @GetMapping("getUserInfo") | |||
|     public Result<EpdcWorkLogUserDetailDTO> getUserInfo(){ | |||
|         return adminService.getUserInfo(); | |||
|     } | |||
| 
 | |||
|      /** | |||
|      * @Description  获取用户部门权限 | |||
|      * @Author songyunpeng | |||
|      * @Date  2021/1/27 | |||
|      * @Param [] | |||
|      * @return com.elink.esua.epdc.commons.tools.utils.Result<com.elink.esua.epdc.dto.result.EpdcWorkLogUserDetailDTO> | |||
|      **/ | |||
|     @PostMapping("getUserDeptOptionByUserId") | |||
|     public Result<DeptOption> getUserDeptOptionByUserId(@RequestBody String userId){ | |||
|         return adminService.getUserDeptOptionByUserId(userId); | |||
|     } | |||
| 
 | |||
|     /** | |||
|      * @Description  获取customId | |||
|      * @Author songyunpeng | |||
|      * @Date  2021/1/27 | |||
|      * @Param [] | |||
|      * @return com.elink.esua.epdc.commons.tools.utils.Result | |||
|      **/ | |||
|     @GetMapping("getCustomId") | |||
|     public Result<String> getCustomId(){ | |||
|         return adminService.getCustomId(); | |||
|     } | |||
| 
 | |||
| 
 | |||
| 
 | |||
| } | |||
| @ -0,0 +1,30 @@ | |||
| package com.elink.esua.epdc.feign; | |||
| 
 | |||
| import com.elink.esua.epdc.commons.tools.constant.ServiceConstant; | |||
| import com.elink.esua.epdc.commons.tools.utils.Result; | |||
| import com.elink.esua.epdc.feign.fallback.AnalysisFeignClientFallback; | |||
| import org.springframework.cloud.openfeign.FeignClient; | |||
| import org.springframework.http.MediaType; | |||
| import org.springframework.web.bind.annotation.GetMapping; | |||
| 
 | |||
| /** | |||
|  * 数据分析模块调用 | |||
|  * | |||
|  * @Author:liuchuang | |||
|  * @Date:2020/9/9 15:41 | |||
|  */ | |||
| @FeignClient(name = ServiceConstant.EPDC_ANALYSIS_SERVER, fallback = AnalysisFeignClientFallback.class) | |||
| public interface AnalysisFeignClient { | |||
| 
 | |||
|     /** | |||
|      * @Description  组织机构编码获取 | |||
|      * @Author songyunpeng | |||
|      * @Date  2021/1/7 | |||
|      * @Param [] | |||
|      * @return com.elink.esua.epdc.commons.tools.utils.Result | |||
|      **/ | |||
|     @GetMapping(value = "analysis/workLog/getCustomId", consumes = MediaType.APPLICATION_JSON_VALUE) | |||
|     Result<String> getCustomId(); | |||
| 
 | |||
| 
 | |||
| } | |||
| @ -0,0 +1,20 @@ | |||
| package com.elink.esua.epdc.feign.fallback; | |||
| 
 | |||
| import com.elink.esua.epdc.commons.tools.constant.ServiceConstant; | |||
| import com.elink.esua.epdc.commons.tools.utils.ModuleUtils; | |||
| import com.elink.esua.epdc.commons.tools.utils.Result; | |||
| import com.elink.esua.epdc.feign.AnalysisFeignClient; | |||
| import org.springframework.stereotype.Component; | |||
| 
 | |||
| /** | |||
|  * @Author:songyunpeg | |||
|  * @Date:2020/9/9 15:42 | |||
|  */ | |||
| @Component | |||
| public class AnalysisFeignClientFallback implements AnalysisFeignClient { | |||
| 
 | |||
|     @Override | |||
|     public Result getCustomId() { | |||
|         return ModuleUtils.feignConError(ServiceConstant.EPDC_ANALYSIS_SERVER, "getCustomId"); | |||
|     } | |||
| } | |||
					Loading…
					
					
				
		Reference in new issue