您现在的位置是:主页 > 数据库技术 > 数据库技术

SpringCloud Alibaba中Oauth2认证服务器自定义异常怎么办

IDCBT2021-12-27服务器技术人已围观

简介这篇文章将为大家详细讲解有关SpringCloud Alibaba中Oauth2认证服务器自定义异常怎么办,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 前言 问

这篇文章将为大家详细讲解有关SpringCloud Alibaba中Oauth2认证服务器自定义异常怎么办,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

前言

问题:在使用 Spring Security OAuth3 时如何自定义认证服务器返回异常。

那么首先我们先以 Password模式为例看看在认证时会出现哪些异常情况。

授权模式错误

这里我们故意将授权模式 password 修改成 password1,认证服务器返回如下所示的异常

{   "error": "unsupported_grant_type",   "error_description": "Unsupported grant type: password1" }

密码错误

在认证时故意输错 username 或 password 会出现如下异常错误:

{   "error": "invalid_grant",   "error_description": "Bad credentials" }

客户端错误

在认证时故意输错 client_id 或 client

{   "error": "invalid_client",   "error_description": "Bad client credentials" } 上面的返回结

上面的返回结果很不友好,而且前端代码也很难判断是什么错误,所以我们需要对返回的错误进行统一的异常处理,让其返回统一的异常格式。

问题剖析

如果只关注解决方案,可以直接跳转到解决方案模块!

OAuth3Exception异常处理

在Oauth3认证服务器中认证逻辑最终调用的是 TokenEndpoint#postAccessToken()方法,而一旦认证出现  OAuth3Exception异常则会被 handleException()捕获到异常。如下图展示的是当出现用户密码异常时debug截图:

认证服务器在捕获到 OAuth3Exception后会调用  WebResponseExceptionTranslator#translate()方法对异常进行翻译处理。

默认的翻译处理实现类是 DefaultWebResponseExceptionTranslator,处理完成后会调用  handleOAuth3Exception()方法将处理后的异常返回给前端,这就是我们之前看到的异常效果。

处理方法熟悉Oauth3套路的同学应该知道了如何处理此类异常,就是「自定义一个异常翻译类让其返回我们需要的自定义格式,然后将其注入到认证服务器中。」

但是这种处理逻辑只能解决 OAuth3Exception异常,即前言部分中的「授权模式异常」和「账号密码类的异常」,并不能解决我们客户端的异常。

客户端异常处理

客户端认证的异常是发生在过滤器 ClientCredentialsTokenEndpointFilter上,其中有后置添加失败处理方法,最后把异常交给  OAuth3AuthenticationEntryPoint这个所谓认证入口处理。执行顺序如下所示:

然后跳转到父类的 AbstractOAuth3SecurityExceptionHandler#doHandle()进行处理:

标签:

很赞哦! ()

本栏推荐