# 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)

学习愉快！