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 响应的问题。
学习愉快!