Spring Security如何进行自定义密码校验

众所周知,Spring Security框架中,关于登陆认证这一块,官方似乎过于封闭,仅仅提供了几个模式,比如密码模式,客户端模式,等等等,但是我们要想自己实现一个模式的话,就比较麻烦了。


我在项目中,其实由于产品的原因,是要求数据库存储的密码,要求非明文,并且是可逆的, 而spring security原生的密码校验,似乎和我们往常登陆中的校验有些不一样。




那我就来跟一下源码看看吧。



1,首先前面的咱们就不说了,无非是进入登陆的主入口,TokenEndpoint类中的/oath/token映射的方法中。

这个类在spring-security-oauth jar包中的,/org/springframeword/security/oauth2/provider包中。



这个做为入口类,执行认证方法,但是,在方法中并没有找到密码认证的过程。



正纳闷呢,偶然间发现在TokenEndpoint同包下,有一个过滤器 TokenEndpointAuthenticationFilter




打开里面的doFilter方法,查看过滤逻辑后发现。


这里通过AuthenticationManager来执行了认证的过程,这个AuthenTionManager类我有点印象,之前看另外一篇文章的时候,好像说这个类是Spring Security来进行当前认证对象的认证操作的。那么就点进去看一看。


是个接口,里面只有一个authenticate方法,相信这个就是用来认证的方法了,有很多实现类。



挨个点进去看看,没有什么特别的发现。

在最后一个类ProviderManager的时候,发现有循环执行了一些类中的同一个方法。



因吹思挺

这个AuthenticationProvider也是一个接口,里面有n多实现类,这里循环这个接口的所有子类,然后同样执行authenticate这个方法。



其他的就不多说,我都点进去看了实现,无非都是通过各种方法对当前认证对象进行信息组装啊,客户端校验啊,手机验证码模式校验啊等。

最后看到了AbstractUserDetailsAuthenticationProvider这个抽象类,他的实现方法



引起了我的注意。

这两个都是抽象方法,我进去看看有没有哪里实现了这两个抽象方法。



这个DaoAuthenticationProvider实现了这个方法(WomAuthenticationProvider是我自己的实现,后面会说。)



进去这个DaoAuthenticationProvider 发现执行的这个方法



找到了,密码校验的地方了。

那么,自定义实现类,继承,重写,注入四连发。


没毛病。



ps:找到了一个更简单的方法,自定义passwordEncoder类(最后一张图),重写matchers方法,就可以对密码校验过程进行自定义了。


记得最后在WebSecurityConfigurer配置类中,注入重写的实现类,让他生效。


暂无评论