Fixiaobai
2023-09-07 e29f147aab5b0b0b794d611b522b67b94423e3cf
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
96
97
98
99
100
101
102
103
104
105
106
107
108
package com.yuanchu.limslaboratory.aop;
 
import com.yuanchu.limslaboratory.annotation.AuthHandler;
import com.yuanchu.limslaboratory.exception.AuthException;
import com.yuanchu.limslaboratory.pojo.User;
import com.yuanchu.limslaboratory.service.RoleManagerService;
import com.yuanchu.limslaboratory.service.UserService;
import com.yuanchu.limslaboratory.utils.ServletUtils;
import io.swagger.annotations.ApiOperation;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.*;
 
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Method;
import java.util.Map;
import java.util.Objects;
 
/**
 * @Author 张宾
 * @Date 2023/8/25
 */
@Component
@Slf4j
@Aspect
public class AuthRequestAspect {
 
    @Pointcut("@annotation(com.yuanchu.limslaboratory.annotation.AuthHandler)")
    public void pointCut() {
    }
 
    private final static String ADMIN = "c3284d0f94606de1fd2af172aba15bf3";
 
 
    @Resource
    private UserService userService;
 
 
    @Resource
    private RoleManagerService roleService;
 
    @SneakyThrows
    @Before("pointCut()")
    public void before(JoinPoint joinPoint) {
        HttpServletRequest request = ServletUtils.getRequest();
        Map<String, Object> userInfo = userService.getUserInfo(request.getHeader("X-Token"));
        if (Objects.nonNull(userInfo)) {
            if (Objects.equals(userInfo.get("sessionLayerId"), ADMIN)) {
                log.info("超级管理员,无需拦截!");
                return;
            }
            Class<?> clazz = joinPoint.getTarget().getClass();
            String clazzName = joinPoint.getTarget().getClass().getName();
            // 获取访问的方法名
            String methodName = joinPoint.getSignature().getName();
            // 获取方法所有参数及其类型
            Class[] argClz = ((MethodSignature) joinPoint.getSignature()).getParameterTypes();
            // 获取访问的方法对象
            Method method = clazz.getDeclaredMethod(methodName, argClz);
            //获取类上请求地址
            RequestMapping annotation = clazz.getAnnotation(RequestMapping.class);
            StringBuilder builder = new StringBuilder();
            String apiInfo = null;
            builder.append(annotation.value()[0]);
            //获取方法上注解
            if (method.isAnnotationPresent(PostMapping.class)) {
                PostMapping post = method.getAnnotation(PostMapping.class);
                builder.append(post.value()[0]);
            }
            if (method.isAnnotationPresent(GetMapping.class)) {
                GetMapping get = method.getAnnotation(GetMapping.class);
                builder.append(get.value()[0]);
            }
            if (method.isAnnotationPresent(DeleteMapping.class)) {
                DeleteMapping delete = method.getAnnotation(DeleteMapping.class);
                builder.append(delete.value()[0]);
            }
            if (method.isAnnotationPresent(PutMapping.class)) {
                PutMapping put = method.getAnnotation(PutMapping.class);
                builder.append(put.value()[0]);
            }
            if (method.isAnnotationPresent(ApiOperation.class)) {
                ApiOperation api = method.getAnnotation(ApiOperation.class);
                apiInfo = api.value();
            }
            String roleId = String.valueOf(userInfo.get("roleId"));
            Map<String, Object> urlType = roleService.getUrlType(builder.toString());
            log.info("拦截请求----------------》" + builder);
            boolean b = roleService.hasUrl(String.valueOf(urlType.get("type")), String.valueOf(urlType.get("menuId")), roleId);
            if (!b) {
                log.warn("用户/id:" + userInfo.get("name") + "/" + userInfo.get("id") + "---------权限不足,已拦截!");
                throw new AuthException("400","无权限");
            }
        } else {
            throw new AuthException("401", "登陆过期!");
        }
    }
 
 
}