Helius
2022-05-27 3ef39829da75db361716954c5a0f72e05cc2b6a9
src/main/java/cc/mrbird/febs/common/interceptor/DappInterceptor.java
@@ -1,5 +1,6 @@
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.utils.RedisUtils;
import cc.mrbird.febs.common.utils.SpringContextUtil;
@@ -8,32 +9,58 @@
import cn.hutool.core.util.StrUtil;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
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 wzy
 * @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);
    @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");
        log.info("进入拦截:{}", headAddress);
        if (StrUtil.isBlank(headAddress)) {
        String key = request.getHeader("key");
        String path = request.getServletPath().replace("/dapi", "");
        log.info("进入拦截:{}, {}, {}", headAddress, path, key);
        String chain = request.getHeader("chain");
        if (StrUtil.isBlank(headAddress) || StrUtil.isBlank(key)) {
            responseUnAuth(response);
            return false;
        }
        DappMemberEntity memberEntity = dappMemberDao.selectByAddress(headAddress);
        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 = Hash.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;