1. 前言
最近实在比较忙,很难抽出时间来继续更 Spring Security 实战干货系列 。今天正好项目中 Spring Security 需要对认证授权异常的处理,就分享出来吧 。
2. Spring Security 中的异常
Spring Security 中的异常主要分为两大类:一类是认证异常,另一类是授权相关的异常。
2.1 AuthenticationException
AuthenticationException
是在用户认证的时候出现错误时抛出的异常。主要的子类如图:
根据该图的信息,系统用户不存在,被锁定,凭证失效,密码错误等认证过程中出现的异常都由
AuthenticationException
处理。
2.2 AccessDeniedException
AccessDeniedException
主要是在用户在访问受保护资源时被拒绝而抛出的异常。同
AuthenticationException
一样它也提供了一些具体的子类。如下图:
AccessDeniedException
的子类比较少,主要是
CSRF
相关的异常和授权服务异常。
3. Http 状态对认证授权的规定
Http 协议对认证授权的响应结果也有规定。
3.1 401 未授权状态
HTTP 401 错误 - 未授权(Unauthorized)
一般来说该错误消息表明您首先需要登录(输入有效的用户名和密码)。 如果你刚刚输入这些信息,立刻就看到一个
401
错误,就意味着,无论出于何种原因您的用户名和密码其中之一或两者都无效(输入有误,用户名暂时停用,账户被锁定,凭证失效等) 。总之就是认证失败了。其实正好对应我们上面的
AuthenticationException
。
3.2 403 被拒绝状态
HTTP 403 错误 - 被禁止(Forbidden)
出现该错误表明您在访问受限资源时没有得到许可。服务器理解了本次请求但是拒绝执行该任务,该请求不该重发给服务器。并且服务器想让客户端知道为什么没有权限访问特定的资源,服务器应该在返回的信息中描述拒绝的理由。一般实践中我们会比较模糊的表明原因。 该错误对应了我们上面的
AccessDeniedException
。
4. Spring Security 中的异常处理
我们在
Spring Security
实战干货系列文章中的
自定义配置类入口 WebSecurityConfigurerAdapter
一文中提到
HttpSecurity
提供的
exceptionHandling()
方法用来提供异常处理。该方法构造出
ExceptionHandlingConfigurer
异常处理配置类。该配置类提供了两个实用接口: