Java 将失败的自定义spring安全表达式上的http 403更改为401

Java 将失败的自定义spring安全表达式上的http 403更改为401,java,spring-boot,spring-mvc,spring-security,Java,Spring Boot,Spring Mvc,Spring Security,我已经为@PreAuthorize注释编写了自定义表达式根。 逻辑本身运行良好。然而,应用程序返回403,但我需要返回401 公共类JwtConfigurer扩展了SecurityConfigureAdapter{ @凌驾 public void configure(HttpSecurity http)引发异常{ http.addFilterBefore(new-OwnTokenFilter(),UsernamePasswordAuthenticationFilter.class) .例外处理(

我已经为@PreAuthorize注释编写了自定义表达式根。 逻辑本身运行良好。然而,应用程序返回403,但我需要返回401

公共类JwtConfigurer扩展了SecurityConfigureAdapter{
@凌驾
public void configure(HttpSecurity http)引发异常{
http.addFilterBefore(new-OwnTokenFilter(),UsernamePasswordAuthenticationFilter.class)
.例外处理()
.authenticationEntryPoint(新的HttpStatusEntryPoint(未经授权));
}
}
OwnTokenFilter提取jwt令牌并将其提供给SecurityContext。我的期望是,如果授权失败,将返回一个未经授权的文件,但它将被忽略。我使用的是SpringBoot2.1.x

我的表达式根看起来像

公共类ExpressionRoot扩展了SecurityExpressionRoot实现了MethodSecurityExpressionOperations{。。。
公共布尔hasRoleOneOf(最终字符串…expectedRoles){
...
返回角色匹配?真:假;
}
谢谢你找到了解决方案

import org.springframework.http.ResponseEntity;
导入org.springframework.security.access.AccessDeniedException;
导入org.springframework.web.bind.annotation.ControllerAdvice;
导入org.springframework.web.bind.annotation.ExceptionHandler;
导入org.springframework.web.bind.annotation.ResponseBody;
导入静态org.springframework.http.HttpStatus.UNAUTHORIZED;
@控制器建议
公共类例外建议{
@ExceptionHandler(AccessDeniedException.class)
@应答器
公共响应手动控制器例外(AccessDeniedException例外){
返回新的响应属性(例如getMessage(),未经授权);
}
}

不确定它是否是最好的:)

旁注:
401unauthorized
,尽管名称不同,但它是一个身份验证错误,因此REST服务应该在身份验证失败时返回401,在身份验证失败时抛出403。