Spring - Oauth:如何用 JSON-Response 替换 HTML 身份验证失败页面
Posted
技术标签:
【中文标题】Spring - Oauth:如何用 JSON-Response 替换 HTML 身份验证失败页面【英文标题】:Spring - Auth: How to replace HTML authentification failure page with JSON-Response 【发布时间】:2020-11-08 16:39:24 【问题描述】:我有两个 Spring Boot 服务。
-
第一个是 AuthServer (@EnableAuthorizationServer)
第二个是 ResourceServer (@EnableResourceServer)
当我调用 ResourceServer 的 REST 接口的方法时,在没有发送有效令牌的情况下,我在 Postman 中收到以下错误:
<!doctype html>
<html lang="en">
<head>
<title>HTTP Status 500 – Internal Server Error</title>
<style type="text/css">
body
font-family: Tahoma, Arial, sans-serif;
h1,
h2,
h3,
b
color: white;
background-color: #525D76;
h1
font-size: 22px;
h2
font-size: 16px;
h3
font-size: 14px;
p
font-size: 12px;
a
color: black;
.line
height: 1px;
background-color: #525D76;
border: none;
</style>
</head>
<body>
<h1>HTTP Status 500 – Internal Server Error</h1>
</body>
</html>
一个错误HTML页面...但我更喜欢这样的东西:
"timestamp": "2020-07-19T08:59:06.002+00:00",
"status": 401,
"error": "Invalid Token",
"message": "Plz use a valid token",
"path": "/rest/portfolio/2"
如何设置我的自定义身份验证失败响应?我必须在 AuthServer-Service 或 ResourceServer 中执行此操作吗?
如果我根本没有发送 Authoriation-Header,我会得到
<UnauthorizedException>
<error>unauthorized</error>
<error_description>Vollständige Authentifikation wird benötigt um auf diese Resource zuzugreifen</error_description>
</UnauthorizedException>
我也希望将其替换为自定义消息。
非常感谢
【问题讨论】:
【参考方案1】:你需要有自己的Authentication Entry Point
,并在ResourceServerConfigurerAdapter -> (HttpSecurity http)
中配置就好
...
.and()
.exceptionHandling()
.authenticationEntryPoint(customAuthenticationEntryPoint)
...
示例身份验证入口点:
/**
* Returns a 401 error code (Unauthorized) to the client.
*/
@Component
public class CustomAuthenticationEntryPoint implements AuthenticationEntryPoint
@Autowired
com.fasterxml.jackson.databind.ObjectMapper mapper;
public void commence(HttpServletRequest request,
HttpServletResponse response,
AuthenticationException ae) throws IOException, ServletException
Map<String, Object> jsonResponse = new HashMap<>();
jsonReponse.put("status", false);
/*Put everything else into this map or better you can have a class to hold your response and initialise that here */
response.setStatus(HttpStatus.UNAUTHORIZED.value());
response.setContentType(MediaType.APPLICATION_JSON_VALUE);
objectMapper.writeValue(response.getWriter(), responseJson);
【讨论】:
以上是关于Spring - Oauth:如何用 JSON-Response 替换 HTML 身份验证失败页面的主要内容,如果未能解决你的问题,请参考以下文章
Rest,Spring 拥有 OAuth2 服务器 + OAuth2 提供商,如 Facebook、Google、Yahoo
如何为 spring webflux 应用程序配置 oauth2 资源服务器?
Spring Security - OAuth2 和 CustomAuthenticationProvider。如何为每个配置不同的 URL 模式?