|  |  |  | 
|---|
|  |  |  | import org.springframework.beans.factory.annotation.Autowired; | 
|---|
|  |  |  | import org.springframework.beans.factory.annotation.Value; | 
|---|
|  |  |  | import org.springframework.core.annotation.Order; | 
|---|
|  |  |  | import org.springframework.http.HttpEntity; | 
|---|
|  |  |  | import org.springframework.http.HttpHeaders; | 
|---|
|  |  |  | import org.springframework.http.HttpMethod; | 
|---|
|  |  |  | import org.springframework.http.ResponseEntity; | 
|---|
|  |  |  | import org.springframework.http.*; | 
|---|
|  |  |  | import org.springframework.stereotype.Component; | 
|---|
|  |  |  | import org.springframework.web.client.RestTemplate; | 
|---|
|  |  |  | import org.springframework.web.util.UriComponentsBuilder; | 
|---|
|  |  |  | 
|---|
|  |  |  | public String isDevStage ;//是否为开发阶段 | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Value("${pipIrr.sso.checkUrl}") | 
|---|
|  |  |  | public String SsoCheckUrl ; | 
|---|
|  |  |  | public String ssoCheckUrl; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | private RestTemplate restTemplate; | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Pointcut("@annotation(com.dy.common.aop.SsoAop)") | 
|---|
|  |  |  | public void dyPointCut() { | 
|---|
|  |  |  | public void ssoPointCut() { | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | @Around("dyPointCut()") | 
|---|
|  |  |  | @Around("ssoPointCut()") | 
|---|
|  |  |  | public Object execute(ProceedingJoinPoint point) throws Throwable { | 
|---|
|  |  |  | if(isDevStage != null && !isDevStage.trim().equals("") && isDevStage.trim().equalsIgnoreCase("true")){ | 
|---|
|  |  |  | return point.proceed(); | 
|---|
|  |  |  | 
|---|
|  |  |  | Method method = signature.getMethod(); | 
|---|
|  |  |  | SsoAop aop = method.getAnnotation(SsoAop.class) ; | 
|---|
|  |  |  | if (Objects.nonNull(aop)){ | 
|---|
|  |  |  | String power = aop.value() ; | 
|---|
|  |  |  | if(power.trim().equals("")){ | 
|---|
|  |  |  | power = aop.power() ; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | if(power.trim().equals("-1")){ | 
|---|
|  |  |  | //不进行登录及权限验证 | 
|---|
|  |  |  | return point.proceed(); | 
|---|
|  |  |  | }else{ | 
|---|
|  |  |  | String[] allPower = aop.ifAllPower() ; | 
|---|
|  |  |  | String[] anyPower = aop.ifAnyPower() ; | 
|---|
|  |  |  | String token = UserTokenContext.get() ; | 
|---|
|  |  |  | Object rObj = this.check(token, power, allPower, anyPower); | 
|---|
|  |  |  | if(rObj != null){ | 
|---|
|  |  |  | if(rObj instanceof SsoVo ssoVo){ | 
|---|
|  |  |  | if(ssoVo.logined){ | 
|---|
|  |  |  | if(ssoVo.hasPower){ | 
|---|
|  |  |  | if(!StringUtils.isNullOrEmpty(ssoVo.dataSourceName)){ | 
|---|
|  |  |  | DataSourceContext.set(ssoVo.dataSourceName); | 
|---|
|  |  |  | return point.proceed(); | 
|---|
|  |  |  | }else{ | 
|---|
|  |  |  | //无数据源 | 
|---|
|  |  |  | return BaseResponseUtils.buildError("后端系统出错,未得到当前登录用户所属机构标签(数据源名)") ; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | String token = UserTokenContext.get() ; | 
|---|
|  |  |  | Object rObj = this.check(token); | 
|---|
|  |  |  | if(rObj != null){ | 
|---|
|  |  |  | if(rObj instanceof SsoVo ssoVo){ | 
|---|
|  |  |  | if(ssoVo.logined){ | 
|---|
|  |  |  | if(ssoVo.hasPower){ | 
|---|
|  |  |  | if(!StringUtils.isNullOrEmpty(ssoVo.dataSourceName)){ | 
|---|
|  |  |  | DataSourceContext.set(ssoVo.dataSourceName); | 
|---|
|  |  |  | Object obj = point.proceed(); | 
|---|
|  |  |  | DataSourceContext.remove(); | 
|---|
|  |  |  | return obj ; | 
|---|
|  |  |  | }else{ | 
|---|
|  |  |  | //无权限 | 
|---|
|  |  |  | return BaseResponseUtils.buildNoPower() ; | 
|---|
|  |  |  | //无数据源 | 
|---|
|  |  |  | return BaseResponseUtils.buildError("后端系统出错,未得到当前登录用户所属机构标签(数据源名)") ; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }else{ | 
|---|
|  |  |  | //未登录 | 
|---|
|  |  |  | return BaseResponseUtils.buildToLogin() ; | 
|---|
|  |  |  | //无权限 | 
|---|
|  |  |  | return BaseResponseUtils.buildNoPower() ; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }else{ | 
|---|
|  |  |  | return rObj ; | 
|---|
|  |  |  | //未登录 | 
|---|
|  |  |  | return BaseResponseUtils.buildToLogin() ; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }else{ | 
|---|
|  |  |  | return BaseResponseUtils.buildError("后端系统出错,check方法返回null") ; | 
|---|
|  |  |  | return rObj ; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }else{ | 
|---|
|  |  |  | return BaseResponseUtils.buildError("后端系统出错,check方法返回null") ; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | }else{ | 
|---|
|  |  |  | //已经进入注解处理了,还得不到注解,这种情况是不可能的。 | 
|---|
|  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 调用SSO系统进行验证 | 
|---|
|  |  |  | * @param token Header中的用户token | 
|---|
|  |  |  | * @param power 一个权限 | 
|---|
|  |  |  | * @param allPower 多个权限 | 
|---|
|  |  |  | * @param anyPower 多个权限 | 
|---|
|  |  |  | * @return 返回对象 | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | private Object check(String token, String power, String[] allPower, String[] anyPower){ | 
|---|
|  |  |  | if(!StringUtils.isNullOrEmpty(SsoCheckUrl)){ | 
|---|
|  |  |  | String url = UriComponentsBuilder.fromUriString(SsoCheckUrl) | 
|---|
|  |  |  | private Object check(String token){ | 
|---|
|  |  |  | if(!StringUtils.isNullOrEmpty(ssoCheckUrl)){ | 
|---|
|  |  |  | String url = UriComponentsBuilder.fromUriString(ssoCheckUrl) | 
|---|
|  |  |  | .queryParam("token", token) | 
|---|
|  |  |  | .queryParam("power", power) | 
|---|
|  |  |  | .queryParam("allPower", (Object) allPower) | 
|---|
|  |  |  | .queryParam("anyPower", (Object) anyPower) | 
|---|
|  |  |  | .build() | 
|---|
|  |  |  | .toUriString(); | 
|---|
|  |  |  | // 由于获取student接口咱们设置了basicauth,所以需要在请求时配置 | 
|---|
|  |  |  | HttpHeaders headers = new HttpHeaders(); | 
|---|
|  |  |  | headers.setContentType(MediaType.parseMediaType("application/json;charset=UTF-8")); | 
|---|
|  |  |  |  | 
|---|
|  |  |  | HttpEntity<?> httpEntity = new HttpEntity<>(headers); | 
|---|
|  |  |  | ResponseEntity<SsoVo> response = null; | 
|---|
|  |  |  | try { | 
|---|