KKSU
2024-07-07 c881dcbb782d209f43b9a2878de613e0124e0421
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
package cc.mrbird.febs.common.interceptor;
 
import cc.mrbird.febs.common.contants.AppContants;
import cc.mrbird.febs.common.entity.FebsResponse;
import cc.mrbird.febs.common.properties.SystemProperties;
import cc.mrbird.febs.common.utils.LoginUserUtil;
import cc.mrbird.febs.common.utils.RedisUtils;
import cc.mrbird.febs.common.utils.SpringContextUtil;
import cc.mrbird.febs.dapp.entity.DappMemberEntity;
import cc.mrbird.febs.dapp.mapper.DappMemberDao;
import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpStatus;
import org.springframework.web.servlet.HandlerInterceptor;
import org.web3j.crypto.Hash;
 
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;
 
/**
 * @author 
 * @date 2022-03-17
 **/
@Slf4j
public class DappInterceptor implements HandlerInterceptor {
 
    private final DappMemberDao dappMemberDao = SpringContextUtil.getBean(DappMemberDao.class);
    private final RedisUtils redisUtils = SpringContextUtil.getBean(RedisUtils.class);
 
    private SystemProperties systemProperties = SpringContextUtil.getBean(SystemProperties.class);
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if ("OPTIONS".equals(request.getMethod().toUpperCase())) {
            return true;
        }
        String headAddress = request.getHeader("address");
        String key = request.getHeader("key");
        String path = request.getServletPath().replace("/dapi", "");
 
        String chain = request.getHeader("chain");
        if (StrUtil.isBlank(headAddress) || StrUtil.isBlank(key)) {
            responseUnAuth(response);
            return false;
        }
 
        if (!systemProperties.isDebug()) {
            Map<Object, Object> signKey = redisUtils.hmget(AppContants.REDIS_KEY_SIGN);
            Object signObj = signKey.get(headAddress);
 
            if (signObj == null) {
                responseUnAuth(response);
                return false;
            }
            String sign = (String) signObj;
 
            String calKey = LoginUserUtil.sha3(sign + path + headAddress).replace("0x", "");
            if (!calKey.equals(key)) {
                responseUnAuth(response);
                return false;
            }
        }
 
        DappMemberEntity memberEntity = dappMemberDao.selectByAddress(headAddress, null);
        if (memberEntity == null) {
            responseUnAuth(response);
            return false;
        }
 
        request.getSession().setAttribute("member", memberEntity);
        return true;
    }
 
    private void responseUnAuth(HttpServletResponse response) throws IOException {
        response.setCharacterEncoding("UTF-8");
        response.setContentType("application/json; charset=utf-8");
 
        FebsResponse code = new FebsResponse().code(HttpStatus.UNAUTHORIZED);
        String encryptBase64 = SecureUtil.rsa(AppContants.RESP_PRIVATE_KEY, AppContants.RESP_PUBLIC_KEY).encryptBase64(JSONObject.toJSONString(code).getBytes(), KeyType.PublicKey);
        response.getWriter().write(new ObjectMapper().writeValueAsString(encryptBase64));
    }
 
    public static void main(String[] args) {
        String headAddress = "0x971c09aa9735eb98459b17ec8b48932d24cbb931";
        String path = "/member/walletInfo";
        String sign = "0x1fd3f82895ca4615daa10ec245d628ca230358e08423df71c8f6c8d3d4163520";
//        System.out.println(Hash.sha3(sign + path + headAddress));
    }
}