,环境:Springboot2.4.12 + Spring Security 5.4.9,上一篇:《Spring Security权限控制系列(四)》,有如下的自定义配置。,同时系统中也没有提供任何的AuthenticationProvider类型的Bean和当前也没有任何 AuthenticationManager 实例,那么你进行登录的时候会出现死循环。原因如下:,SecurityConfig#authenticationManagerBean方法。,在前面几篇文章中我们都是通过在配置文件中配置或基于Java代码配置的内存用户进行用户的设置,这种方式在学习中使用了解还可以,但在实际的项目中肯定不会这么来玩,都会基于自己项目中的用户进行登录授权管理。本篇内容将会带详细了解如何基于数据库中的用户进行登录授权。,在《Spring Security权限控制系列(四)》文章中我们介绍了Spring Security的核心是通过过滤器来实现认证授权管理的,在这一些列的过滤器中有个非常重要的过滤器UsernamePasswordAuthenticationFilter 该过滤器就会拦截登录的URI,进行验证用户密码。,从上面的ProviderManager知道了它所需要的就是AuthenticationProvider。,接下来自定义AuthenticationProvider。,通常情况我们不会直接去实现AuthenticationProvider,可以通过继承AbstractUserDetailsAuthenticationProvider该类为我们实现了认证的通用模板,源码如下:,上面的retrieveUser方法是需要子类来实现,但如何实现呢?系统还提供了一个类DaoAuthenticationProvider类,该类是AbstractUserDetailsAuthenticationProvider的子类。,通过上面的分析发现DaoAuthenticationProvider类能够满足我们认证用户名及密码的功能,所以我们也就没有必要自己在一步一步的去实现用户名及密码的认证,直接继承DaoAuthenticationProvider类,为该类提供上面分析的两个重要的认证类:,其实我们也完全不用继承DaoAuthenticationProvider实现一个子类,完全没有必要直接创建该实例设置上面两个核心类即可。接下来我们就按照当前的分析来依次实现如下的类即可。,依赖:,配置:,我们的实体类需要实现UserDetails。,Repository:,实现该类主要用来通过用户名查询用户信息。,该类非常简单直接就是调用Repository查询用户,如果不存在系统会自动的抛出异常。,如果上一步能正确的获取UserDetails对象,那么接下来就是验证密码了。根据自身系统的密码处理方式实现PasswordEncoder。,上面实现的PasswordEncoder 没有对密码做任何处理(也就是明文),实际你可以根据自己的需要做相应的逻辑处理,Spring Security提供了如下实现:,
,上图中的实现大部分你可以直接拿来使用。,到此所有的配置及自定义都已经完成了。测试这里就不进行了。
© 版权声明
文章版权归作者所有,未经允许请勿转载。