我们还希望在认证失败或者是授权失败的情况下也能和我们的接口一样返回相同结构的json,这样可以让前端能对响应进行统一的处理。要实现这个功能我们需要知道SpringSecurity的异常处理机制。

在SpringSecurity中,如果我们在认证或者授权的过程中出现了异常会被ExceptionTranslationFilter捕获到。在ExceptionTranslationFilter中会去判断是认证失败还是授权失败出现的异常。

如果是认证过程中出现的异常会被封装成AuthenticationException然后调用AuthenticationEntryPoint对象的方法去进行异常处理。

如果是授权过程中出现的异常会被封装成AccessDeniedException然后调用AccessDeniedHandler对象的方法去进行异常处理。

所以如果我们需要自定义异常处理,我们只需要自定义AuthenticationEntryPoint和
AccessDeniedHandler然后配置给SpringSecurity即可。

一、自定义实现类

1.1 实现AccessDeniedHandler

Spring Security——08,自定义失败处理-LMLPHP

1.2 实现AuthenticationEntryPoint

Spring Security——08,自定义失败处理-LMLPHP

二、配置SpringSecurity

Spring Security——08,自定义失败处理-LMLPHP

三、测试

3.1 认证失败

使用postman,发送一个请求,当我们使用错误名称发送的时候,会返回认证失败请重新登录,没有问题

Spring Security——08,自定义失败处理-LMLPHP
流程是这样的:

当我们用户名或者密码错误,抛出异常的时候,会被AuthenticationEntryPointImpl给捕获到,就会封装信息返回了

Spring Security——08,自定义失败处理-LMLPHP

3.2 权限不足

把hello接口的权限改了,数据库用户没有这个权限

Spring Security——08,自定义失败处理-LMLPHP
没有问题,返回的是我们想要的格式

Spring Security——08,自定义失败处理-LMLPHP

一键三连有没有捏~~

04-08 09:02