Spring REST – 访问被拒绝请求的 JSON 响应

Spring REST – 访问被拒绝请求的 JSON 响应

原文: https://howtodoinjava.com/spring-restful/access-denied-json-response/

在应预先验证主体但已在AbstractPreAuthenticatedProcessingFilter中收到null的情况下,从 REST API 学习以 jSON 格式返回带有错误详细信息的拒绝访问的响应,并包含错误详细信息。

1. 添加自定义AuthenticationEntryPoint

ExceptionTranslationFilter使用此类来启动身份验证方案。 如果您正在使用AbstractPreAuthenticatedProcessingFilter处理预先认证的认证请求,如自定义令牌认证示例所示,则默认情况下,所有未认证的用户都将重定向到默认访问被拒绝的页面,即Http403ForbiddenEntryPoint

默认行为显示拒绝访问的 HTML 页面。

我们可以更改定义自己的自定义AuthenticationEntryPoint的行为。 此身份验证入口点已添加到exceptionHandling()配置中。

  • ExceptionTranslationFilter用于捕获任何 Spring Security 异常,以便可以返回 HTTP 错误响应或启动适当的AuthenticationEntryPoint
  • 如果用户请求安全的 HTTP 资源但未通过身份验证,则将调用AuthenticationEntryPoint。 这样做的工作是向用户呈现适当的响应,以便可以开始身份验证。

在给定的配置中,我们保护所有以"/api"开头的 URL。

Spring security 配置

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,因为它仅适用于不需要角色的经过身份验证的用户。

2. 演示

2.1. 没有身份验证令牌

API 请求

HTTP POST http://localhost:8080/SpringRestExample/api/rest/employee-management/employees/1

Headers:

Content-Type	application/json

API 响应

Response code - 403 Forbidden

{
	"message"	: "Access denied",
	"timestamp"	: "2019-05-03T23:59:52.103"
}

2.2. 使用不正确的身份验证令牌

API 请求

HTTP POST http://localhost:8080/SpringRestExample/api/rest/employee-management/employees/1

Headers:

Content-Type	application/json
AUTH_API_KEY	123456

API 响应

Response code - 403 Forbidden

{
	"message"	: "Access denied",
	"timestamp"	: "2019-05-04T00:04:15.457"
}

2.2. 使用正确的身份验证令牌

API 请求

HTTP POST http://localhost:8080/SpringRestExample/api/rest/employee-management/employees/1

Headers:

Content-Type	application/json
AUTH_API_KEY	abcd123456

API 响应

Response code - 200 OK

{
	//API response body
}

请问您有关使用自定义authenticationEntryPoint将拒绝访问的响应从 Spring REST API 转换为 JSON 响应的问题。

下载源码

学习愉快!