ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
# Spring REST – 访问被拒绝请求的 JSON 响应 > 原文: [https://howtodoinjava.com/spring-restful/access-denied-json-response/](https://howtodoinjava.com/spring-restful/access-denied-json-response/) 在应预先验证主体但已在`AbstractPreAuthenticatedProcessingFilter`中收到`null`的情况下,从 REST API 学习以 jSON 格式返回带有错误详细信息的拒绝访问的响应,并包含错误详细信息。 ## 1\. 添加自定义`AuthenticationEntryPoint` `ExceptionTranslationFilter`使用此类来启动身份验证方案。 如果您正在使用`AbstractPreAuthenticatedProcessingFilter`处理预先认证的认证请求,如[自定义令牌认证示例](https://howtodoinjava.com/spring-restful/custom-token-auth-example/)所示,则默认情况下,所有未认证的用户都将重定向到默认访问被拒绝的页面,即`Http403ForbiddenEntryPoint`。 默认行为显示拒绝访问的 HTML 页面。 我们可以更改定义自己的自定义`AuthenticationEntryPoint`的行为。 此身份验证入口点已添加到`exceptionHandling()`配置中。 * `ExceptionTranslationFilter`用于捕获任何 Spring Security 异常,以便可以返回 HTTP 错误响应或启动适当的`AuthenticationEntryPoint`。 * 如果用户请求安全的 HTTP 资源但未通过身份验证,则将调用`AuthenticationEntryPoint`。 这样做的工作是向用户呈现适当的响应,以便可以开始身份验证。 在给定的配置中,我们保护所有以`"/api"`开头的 URL。 `Spring security 配置` ```java httpSecurity. antMatcher("/api/**") .csrf() .disable() .sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.STATELESS) .and() .addFilter(filter) /*.addFilterBefore(new ExceptionTranslationFilter( new Http403ForbiddenEntryPoint()), filter.getClass() )*/ .authorizeRequests() .anyRequest() .authenticated(); //Exception handling configuration httpSecurity .exceptionHandling() .authenticationEntryPoint((request, response, e) -> { response.setContentType("application/json;charset=UTF-8"); response.setStatus(HttpServletResponse.SC_FORBIDDEN); response.getWriter().write(new JSONObject() .put("timestamp", LocalDateTime.now()) .put("message", "Access denied") .toString()); }); ``` > 请不要使用[`AccessDeniedHandler`](https://docs.spring.io/spring-security/site/docs/5.1.4.RELEASE/api/index.html?org/springframework/security/web/access/AccessDeniedHandler.html),因为它仅适用于不需要角色的经过身份验证的用户。 ## 2\. 演示 #### 2.1. 没有身份验证令牌 `API 请求` ```java HTTP POST http://localhost:8080/SpringRestExample/api/rest/employee-management/employees/1 Headers: Content-Type application/json ``` `API 响应` ```java Response code - 403 Forbidden { "message" : "Access denied", "timestamp" : "2019-05-03T23:59:52.103" } ``` #### 2.2. 使用不正确的身份验证令牌 `API 请求` ```java HTTP POST http://localhost:8080/SpringRestExample/api/rest/employee-management/employees/1 Headers: Content-Type application/json AUTH_API_KEY 123456 ``` `API 响应` ```java Response code - 403 Forbidden { "message" : "Access denied", "timestamp" : "2019-05-04T00:04:15.457" } ``` #### 2.2. 使用正确的身份验证令牌 `API 请求` ```java HTTP POST http://localhost:8080/SpringRestExample/api/rest/employee-management/employees/1 Headers: Content-Type application/json AUTH_API_KEY abcd123456 ``` `API 响应` ```java Response code - 200 OK { //API response body } ``` 请问您有关使用自定义`authenticationEntryPoint`将拒绝访问的响应从 Spring REST API 转换为 JSON 响应的问题。 [下载源码](https://howtodoinjava.com/wp-content/downloads/SpringRestExample.zip) 学习愉快!