fix: 全局异常处理导致Spring Security自定义未认证、未授权异常失效问题修复
This commit is contained in:
@@ -10,6 +10,8 @@ import org.springframework.context.support.DefaultMessageSourceResolvable;
|
|||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
import org.springframework.http.converter.HttpMessageNotReadableException;
|
import org.springframework.http.converter.HttpMessageNotReadableException;
|
||||||
import org.springframework.jdbc.BadSqlGrammarException;
|
import org.springframework.jdbc.BadSqlGrammarException;
|
||||||
|
import org.springframework.security.access.AccessDeniedException;
|
||||||
|
import org.springframework.security.core.AuthenticationException;
|
||||||
import org.springframework.validation.BindException;
|
import org.springframework.validation.BindException;
|
||||||
import org.springframework.web.bind.MethodArgumentNotValidException;
|
import org.springframework.web.bind.MethodArgumentNotValidException;
|
||||||
import org.springframework.web.bind.MissingServletRequestParameterException;
|
import org.springframework.web.bind.MissingServletRequestParameterException;
|
||||||
@@ -183,7 +185,12 @@ public class GlobalExceptionHandler {
|
|||||||
|
|
||||||
@ExceptionHandler(Exception.class)
|
@ExceptionHandler(Exception.class)
|
||||||
@ResponseStatus(HttpStatus.BAD_REQUEST)
|
@ResponseStatus(HttpStatus.BAD_REQUEST)
|
||||||
public <T> Result<T> handleException(Exception e) {
|
public <T> Result<T> handleException(Exception e) throws Exception{
|
||||||
|
// 将 Spring Security 异常继续抛出,以便交给自定义处理器处理
|
||||||
|
if (e instanceof AccessDeniedException
|
||||||
|
|| e instanceof AuthenticationException) {
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
log.error("unknown exception: {}", e.getMessage());
|
log.error("unknown exception: {}", e.getMessage());
|
||||||
return Result.failed(e.getLocalizedMessage());
|
return Result.failed(e.getLocalizedMessage());
|
||||||
}
|
}
|
||||||
@@ -203,7 +210,7 @@ public class GlobalExceptionHandler {
|
|||||||
if (matcher.find()) {
|
if (matcher.find()) {
|
||||||
String matchString = matcher.group();
|
String matchString = matcher.group();
|
||||||
matchString = matchString.replace("[", "").replace("]", "");
|
matchString = matchString.replace("[", "").replace("]", "");
|
||||||
matchString = "%s字段类型错误".formatted(matchString.replaceAll("\\\"", ""));
|
matchString = "%s字段类型错误".formatted(matchString.replaceAll("\"", ""));
|
||||||
group += matchString;
|
group += matchString;
|
||||||
}
|
}
|
||||||
return group;
|
return group;
|
||||||
|
|||||||
@@ -20,6 +20,6 @@ import java.io.IOException;
|
|||||||
public class MyAccessDeniedHandler implements AccessDeniedHandler {
|
public class MyAccessDeniedHandler implements AccessDeniedHandler {
|
||||||
@Override
|
@Override
|
||||||
public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException {
|
public void handle(HttpServletRequest request, HttpServletResponse response, AccessDeniedException accessDeniedException) throws IOException {
|
||||||
ResponseUtils.writeErrMsg(response, ResultCode.TOKEN_ACCESS_FORBIDDEN);
|
ResponseUtils.writeErrMsg(response, ResultCode.ACCESS_UNAUTHORIZED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -78,7 +78,8 @@ public class JwtTokenProvider {
|
|||||||
|
|
||||||
// claims 中添加角色信息
|
// claims 中添加角色信息
|
||||||
Set<String> roles = userDetails.getAuthorities().stream()
|
Set<String> roles = userDetails.getAuthorities().stream()
|
||||||
.map(GrantedAuthority::getAuthority).collect(Collectors.toSet());
|
.map(GrantedAuthority::getAuthority)
|
||||||
|
.collect(Collectors.toSet());
|
||||||
claims.put(JwtClaimConstants.AUTHORITIES, roles);
|
claims.put(JwtClaimConstants.AUTHORITIES, roles);
|
||||||
|
|
||||||
Date now = new Date();
|
Date now = new Date();
|
||||||
@@ -107,7 +108,7 @@ public class JwtTokenProvider {
|
|||||||
userDetails.setDataScope(Convert.toInt(claims.get(JwtClaimConstants.DATA_SCOPE))); // 数据权限范围
|
userDetails.setDataScope(Convert.toInt(claims.get(JwtClaimConstants.DATA_SCOPE))); // 数据权限范围
|
||||||
|
|
||||||
// 角色集合
|
// 角色集合
|
||||||
Set<SimpleGrantedAuthority> authorities = ((Set<String>) claims.get(JwtClaimConstants.AUTHORITIES))
|
Set<SimpleGrantedAuthority> authorities = ((ArrayList<String>) claims.get(JwtClaimConstants.AUTHORITIES))
|
||||||
.stream()
|
.stream()
|
||||||
.map(SimpleGrantedAuthority::new)
|
.map(SimpleGrantedAuthority::new)
|
||||||
.collect(Collectors.toSet());
|
.collect(Collectors.toSet());
|
||||||
|
|||||||
@@ -72,7 +72,7 @@ public class PermissionService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!hasPermission) {
|
if (!hasPermission) {
|
||||||
log.error("用户无访问权限");
|
log.error("用户无操作权限");
|
||||||
}
|
}
|
||||||
return hasPermission;
|
return hasPermission;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user