1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package com.dy.common.aop;
 
import com.dy.common.contant.Constant;
import com.dy.common.multiDataSource.DataSourceContext;
import com.dy.common.webFilter.UserTokenContext;
import com.dy.common.webUtil.BaseResponseUtils;
import com.mysql.cj.util.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
 
import java.lang.reflect.Method;
import java.util.Objects;
 
@Slf4j
@Aspect
@Order(Constant.AspectOrderSsoAutho)
@Component
public class SsoPowerAspect {
 
    @Value("${pipIrr.global.dev}")
    public String isDevStage ;//是否为开发阶段
 
    @Autowired
    private SsoCheck ssoCheck ;
 
    @Pointcut("@annotation(com.dy.common.aop.SsoPowerAop)")
    public void ssoPowerPointCut() {
    }
 
    @Around("ssoPowerPointCut()")
    public Object execute(ProceedingJoinPoint point) throws Throwable {
        if(isDevStage != null && !isDevStage.trim().equals("") && isDevStage.trim().equalsIgnoreCase("true")){
            return point.proceed();
        }else{
            MethodSignature signature = (MethodSignature) point.getSignature();
            Method method = signature.getMethod();
            SsoPowerAop aop = method.getAnnotation(SsoPowerAop.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.ssoCheck.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);
                                        Object obj = point.proceed();
                                        DataSourceContext.remove();
                                        return obj ;
                                    }else{
                                        //无数据源
                                        return BaseResponseUtils.buildError("后端系统出错,未得到当前登录用户所属机构标签(数据源名)") ;
                                    }
                                }else{
                                    //无权限
                                    return BaseResponseUtils.buildNoPower() ;
                                }
                            }else{
                                //未登录
                                return BaseResponseUtils.buildToLogin() ;
                            }
                        }else{
                            return rObj ;
                        }
                    }else{
                        return BaseResponseUtils.buildError("后端系统出错,check方法返回null") ;
                    }
                }
            }else{
                //已经进入注解处理了,还得不到注解,这种情况是不可能的。
                return BaseResponseUtils.buildError("后端系统出错,DyAop注解为null") ;
            }
        }
    }
 
 
}