AuthInterceptor.java 3.3 KB
package com.diligrp.rider.config;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.diligrp.rider.common.exception.BizException;
import com.diligrp.rider.common.result.Result;
import com.diligrp.rider.entity.Substation;
import com.diligrp.rider.mapper.SubstationMapper;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.HandlerInterceptor;

@Component
@RequiredArgsConstructor
public class AuthInterceptor implements HandlerInterceptor {

    private final JwtUtil jwtUtil;
    private final ObjectMapper objectMapper;
    private final SubstationMapper substationMapper;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String token = request.getHeader("Authorization");
        if (!StringUtils.hasText(token)) {
            token = request.getParameter("token");
        }
        if (!StringUtils.hasText(token)) {
            writeError(response, 700, "请先登录");
            return false;
        }
        if (token.startsWith("Bearer ")) {
            token = token.substring(7);
        }

        String path = request.getRequestURI();

        try {
            io.jsonwebtoken.Claims claims = jwtUtil.getAdminClaims(token);

            if (claims.get("adminId") != null) {
                // 管理员 token
                Long adminId = ((Number) claims.get("adminId")).longValue();
                String role = (String) claims.get("role");

                // /api/platform/** 仅超级管理员可访问
                if (path.startsWith("/api/platform/") && !"admin".equals(role)) {
                    writeError(response, 403, "权限不足,需要超级管理员权限");
                    return false;
                }

                request.setAttribute("adminId", adminId);
                request.setAttribute("role", role);

                // 分站管理员:注入 cityId 供 Service 层做城市隔离
                if ("substation".equals(role)) {
                    Substation sub = substationMapper.selectById(adminId);
                    if (sub != null) {
                        request.setAttribute("cityId", sub.getCityId());
                    }
                }

            } else if (claims.get("riderId") != null) {
                // 骑手 token
                request.setAttribute("riderId", ((Number) claims.get("riderId")).longValue());
                if (claims.get("cityId") != null) {
                    request.setAttribute("cityId", ((Number) claims.get("cityId")).longValue());
                }
            } else {
                writeError(response, 700, "登录状态失效,请重新登录");
                return false;
            }
        } catch (BizException e) {
            writeError(response, e.getCode(), e.getMessage());
            return false;
        }
        return true;
    }

    private void writeError(HttpServletResponse response, int code, String msg) throws Exception {
        response.setContentType("application/json;charset=UTF-8");
        response.getWriter().write(objectMapper.writeValueAsString(Result.error(code, msg)));
    }
}