我在Spring Security的Md4PasswordEncoder中注意到以下代码:
/**
* Takes a previously encoded password and compares it with a raw password after mixing in the salt and
* encoding that value.
*
* @param encPass previously encoded password
* @param rawPass plain text password
* @param salt salt to mix into password
* @return true or false
*/
public boolean isPasswordValid(String encPass, String rawPass, Object salt) {
String pass1 = "" + encPass;
String pass2 = encodePassword(rawPass, salt);
return PasswordEncoderUtils.equals(pass1,pass2);
}
我正在开发自定义PasswordEncoder。可以请任何人解释为什么Spring开发人员通过向传入的对象添加一个空字符串来处理null?
提前致谢
答案 0 :(得分:1)
我认为这不是出于特定原因。我认为这更多是因为开发人员并不关心在以后的版本中进行更改。
在版本3.0.3之前,这就是代码的外观(Source):
78 public boolean isPasswordValid(String encPass, String rawPass, Object salt) {
79 String pass1 = "" + encPass;
80 String pass2 = encodePassword(rawPass, salt);
81 return pass1.equals(pass2);
82 }
在此版本中,如果encPass
为空且第79行上的语句为String pass1 = encPass;
而不是它,则第81行会抛出NPE
。
但是,在更高版本(您正在查看的版本)中,使用了来自PasswordEncoderUtils的等于已经处理encPass
可能为空的情况。
因此,我认为"" +
在当前版本中是多余的,并且没有特殊原因留在那里。 (也许是因为它没有破坏任何东西,也不是导致重大性能损失的原因)