很多人吐槽 Spring Security 比 Shiro 重量级,这个重量级不是凭空来的,重量有重量的好处,就是它提供了更为强大的防护功能。
比如最近看到的一段代码:
这段代码位于 DaoAuthenticationProvider 类中,为了方便大家理解,我来简单说下这段代码的上下文环境。
当用户提交用户名密码登录之后,Spring Security 需要根据用户提交的用户名去数据库中查询用户。
查到用户对象之后,再去比对从数据库中查到的用户密码和用户提交的密码之间的差异。
而上面这段代码就是 Spring Security 根据用户登录时传入的用户名去数据库中查询用户,并将查到的用户返回。方法中还有一个 authentication 参数,这个参数里边保存了用户登录时传入的用户名/密码信息。
那么这段代码有什么神奇之处呢?
我们来一行一行分析。
源码梳理
1
首先方法一进来调用了 prepareTimingAttackProtection 方法,从方法名字上可以看出,这个是为计时攻击的防御做准备,那么什么又是计时攻击呢?别急,一会来解释。我们先来吧流程走完。prepareTimingAttackProtection 方法的执行很简单,如下:
该方法就是将常量 USER_NOT_FOUND_PASSWORD 使用 passwordEncoder 编码之后(如果不了解 passwordEncoder,将编码结果赋值给 userNotFoundEncodedPassword 变量。