authorizationexception需自定义,用于权限校验失败时明确抛出,语义清晰、便于统一处理(如@exceptionhandler返回403)、与认证异常分离;通常继承runtimeexception,可扩展错误码,适用于service层、aop或安全表达式中。

在 Java 中,AuthorizationException 并不是 JDK 或 Spring Security 等主流框架内置的标准异常类(比如 AuthenticationException 是 Spring Security 提供的,但 AuthorizationException 默认不存在),因此通常需要**自定义**。它的核心作用是:在权限校验失败(如用户无访问某接口、无操作某资源的权限)时,明确抛出该异常,便于统一拦截、记录和返回友好提示。
为什么要自定义 AuthorizationException
使用自定义异常能带来几个关键好处:
- 语义清晰:比直接抛
RuntimeException或AccessDeniedException更准确表达“授权失败”意图; - 便于统一处理:配合全局异常处理器(如
@ControllerAdvice),可集中返回标准错误码(如 HTTP 403)、错误消息或结构化 JSON; - 与认证异常分离:区分“未登录/认证失败”(
AuthenticationException)和“已登录但权限不足”(AuthorizationException),逻辑更严谨。
如何定义 AuthorizationException 类
推荐继承 RuntimeException(非检查异常),避免强制 try-catch,符合权限校验通常发生在业务流程中且应快速失败的特点:
public class AuthorizationException extends RuntimeException {
private static final long serialVersionUID = 1L;
public AuthorizationException() {
super("Access denied: insufficient permissions");
}
public AuthorizationException(String message) {
super(message);
}
public AuthorizationException(String message, Throwable cause) {
super(message, cause);
}
}
如果项目有统一错误码体系,还可扩展字段(如 errorCode):
Java JDK 25 来自 OpenJDK 官方归档,版本为 JDK 25,本条下载地址已指向官方 Windows x64 zip 安装包直链,适合调试旧项目或兼容旧版 Java 运行环境。
public class AuthorizationException extends RuntimeException {
private final int errorCode = 40301; // 自定义业务错误码
public AuthorizationException(String message) {
super(message);
}
public int getErrorCode() {
return errorCode;
}
}
在哪里抛出 AuthorizationException
常见场景包括:
- 在 Service 层做细粒度权限判断后(例如:检查当前用户是否为订单所属人);
- 在自定义
MethodSecurityExpressionOperations扩展中; - 在 AOP 切面中拦截方法调用并校验 RBAC/ABAC 规则;
- 替代 Spring Security 的默认
AccessDeniedHandler行为(需配合配置)。
示例(Service 层):
public void deleteOrder(Long orderId) {
Order order = orderMapper.selectById(orderId);
if (!Objects.equals(order.getUserId(), getCurrentUserId())) {
throw new AuthorizationException("You are not authorized to delete this order");
}
orderMapper.deleteById(orderId);
}
如何统一捕获和响应
使用 @ControllerAdvice 拦截该异常:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(AuthorizationException.class)
@ResponseBody
public ResponseEntity<apiresponse> handleAuthException(AuthorizationException e) {
return ResponseEntity.status(HttpStatus.FORBIDDEN)
.body(ApiResponse.error(403, e.getMessage()));
}
}</apiresponse>
这样前端收到的就是标准的 403 响应体,而非 500 或空白页。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










