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

学会返回与JSON格式错误的详细信息的访问被拒绝响应,从一个REST API,在校长应预先验证,但收到的案件nullAbstractPreAuthenticatedProcessingFilter

1.添加自定义AuthenticationEntryPoint

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

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

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

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

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

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。没有身份验证令牌

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

Headers:

Content-Type	application/json
Response code - 403 Forbidden

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

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

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

Headers:

Content-Type	application/json
AUTH_API_KEY	123456
Response code - 403 Forbidden

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

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

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

Headers:

Content-Type	application/json
AUTH_API_KEY	abcd123456
Response code - 200 OK

{
	//API response body
}

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

saigon has written 1445 articles

Leave a Reply