,环境:Springboot2.4.12 + Spring Security 5.4.9,上一篇:《Spring Security权限控制系列(二)》,注意:记得不要忘记关闭CSRF功能,由于之前的案例演示开启了CSRF,忘记关闭,导致在本篇案例中在登录时总是403状态码,点登录后通过调试发现请求的url是总是/error(我自定义登录页面并没有添加_csrf隐藏域字段)。,基于前面两篇的内容我们发现只要没有无权限访问接口,就会报错误,错误信息如下:,
,登录成功后五权限访问接口时默认的返回错误信息,
,错误的用户名或密码时,接下来我们看看系统默认是如何提供该错误页面信息的。,当登录时填写的错误用户名或密码时,再次返回了登录页面,并且携带了错误信息。接下来通过源码查看这部分路径。,当前配置:,上面我们自定义了登录页面/custom/login,所以我们的过滤器链中有个核心的过滤器UsernamePasswordAuthenticationFilter 该过滤器专门用来处理POST提交的登录URI,我们这里自定义了所以该过滤器拦截的是/custom/login,该过滤器在判断当前请求的时候会先判断是不是POST方式提交的,然后判断URI,所以我们在浏览器直接访问该uri的时候是不会发生任何认证逻辑处理的。,登录认证的流程:,在第三步中首先判断的是用户名是否存在,如果不存在则会抛出BadCredentialsException 异常。,父ProviderManager处理异常。,子ProviderManager处理异常。,过滤器UsernamePasswordAuthenticationFilter接收到异常,该异常是有该过滤器的父类中进行处理。,以上就是Spring Security在处理登录失败的情景下如何进行处理的,同时我们也知道了为UsernamePasswordAuthenticationFilter(父类) 配置AuthenticationFailureHandler是一个自定义的扩展点,我们可以在自定义的SecurityConfig中配置该失败句柄。,在上面的自定义配置中我们配置了两个用户:,接下来通过guest用户登录后,访问/demos/home接口查看默认的错误显示。,
,该授权检查的流程:,在上面的流程中主要核心方法是attemptAuthorization尝试授权操作。,最终异常AccessDeniedException并没在FilterSecurityInterceptor中进行处理,那么该异常就会被过滤器链中的ExceptionTranslationFilter中得到处理。,到此你应该了解到了,当我们没有权限访问资源时默认是如何处理的,同时也了解到了如何进行自定义异常处理句柄。,上面介绍了错误产生的原理及了解到了自定义异常处理句柄的方法,接下来通过自定义的方式展示错误信息。,我们也可以将上面的AuthenticationFailureHandler 定义为一个Bean对象这样方便我们做其它的一些操作。,登录测试:,
,上面介绍了当没有权限访问指定的资源时错误产生的原理及了解到了自定义拒绝访问句柄的方法,接下来通过自定义的方式展示错误信息。,在如下位置新建denied.html页面。,
,简单的页面内容。,测试:,
,将上面的http.exceptionHandling().accessDeniedPage("/access/denied") 代码注释了。,然后在下面位置新建403.html页面。,
,简单的页面内容。,测试:,
,测试:,
,总结:
© 版权声明
文章版权归作者所有,未经允许请勿转载。