用户认证需要验证用户的密码是否正确,但是为了保护用户隐私,防止用户账号密码泄露,用户在注册的时候,都需要将密码进行加密。那么在用户认证的时候,就需要将原始密码和加密密码进行验证。这样就需要注册加密和验证加密的方式保存一致。
我们就补充下加密的概念,前面咱们已经在数据库密码加密时,学习了对称加密和非对称加密的概念,知道了私钥和公钥的作用。不管是对称还是非对称加密,都是可以将密码还原成真实信息。用户的密码肯定不希望被别人知道,所以咱们需要一种单向加密的算法,只能加密,无法还原加密前的信息。
一般咱们使用的MD5加密算法,这种方式如果大家都知道加密算法,也是有可能被暴力破解的。所以人们又想到在加密的时候,添加一个自定义的特殊“盐”,这样暴力破解就很难了。
所以我们用户密码加密,需要一个单向的加密算法。
在springsecurity中,提供了新老两种加密方式,但是接口名称都叫PasswordEncoder。这就让人很头大了,security又为了兼容,所以导致本来简单的添加加密实现,变得复杂了。我们就来看看这两个加密接口的区别。
老接口:
org.springframework.security.authentication.encoding.PasswordEncoder
@Deprecated
public interface PasswordEncoder {
String encodePassword(String arg0, Object arg1);
boolean isPasswordValid(String arg0, String arg1, Object arg2);
}
新接口:
org.springframework.security.crypto.password.PasswordEncoder
public interface PasswordEncoder {
String encode(CharSequence arg0);
boolean matches(CharSequence arg0, String arg1);
}
我们可以看到两个接口,就两个方法,一个方法用来加密,一个方法用来验证密码。除了方法名称变了,新接口别老接口少了一个Object 参数,这个参数就是“盐”。
具体的理论我们就不深究了,大概的意思就是,新接口已经采用了随机“盐”概念,不需要再自己指定一个盐了。
所以咱们这里就使用新接口的实现类BCryptPasswordEncoder就可以了。
接下来,咱们就开始security的加密整合吧。
用户认证流程,咱们前面并没有研究,只是知道自己实现一个UserDetailsService接口,并将对象托管给spring。剩下的就交给security自己去识别使用了。
现在需要增加认证的加密机制,本来很简单,只需要在配置类WebSecurityConfigurerAdapter中重写认证配置方法,把加密工具对象给builder就可以了。
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
supe