package com.baiyue.common.security; import com.baiyue.common.core.api.ApiResponse; import com.baiyue.common.core.api.ResultCode; import com.baiyue.common.web.CorrelationContext; import com.fasterxml.jackson.databind.ObjectMapper; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.springframework.http.MediaType; import org.springframework.security.access.AccessDeniedException; import org.springframework.security.web.access.AccessDeniedHandler; import java.io.IOException; import java.nio.charset.StandardCharsets; /** * 访问拒绝处理器,以统一 JSON 结构返回 HTTP 403 错误。 */ public class JsonAccessDeniedHandler implements AccessDeniedHandler { private final ObjectMapper objectMapper; public JsonAccessDeniedHandler(ObjectMapper objectMapper) { this.objectMapper = objectMapper; } @Override public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException exception) throws IOException { ResultCode code = ResultCode.FORBIDDEN; response.setStatus(code.httpStatus().value()); response.setCharacterEncoding(StandardCharsets.UTF_8.name()); response.setContentType(MediaType.APPLICATION_JSON_VALUE); objectMapper.writeValue(response.getWriter(), ApiResponse.failure(code, code.message(), CorrelationContext.requestId(request), CorrelationContext.traceId(request))); } }