上一篇博客是基于内存存用户信息的,但是在我们实际的开发中是不可能通过这种方式的,在实际开发中对用户的账号和密码有各种各样的处理,同时还会对用户的权限也有各种各样的处理。
而本节会讲一下如何对用户密码进行加密以及如何获取权限等
在上一节中我们看到有一个这样的方法
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
DaoAuthenticationProvider au=new DaoAuthenticationProvider();
au.setUserDetailsService(userDetailsService);
au.setPasswordEncoder(pd);
au.setSaltSource(salt);
auth.authenticationProvider(au);
// auth.userDetailsService(userDetailsService);
}
本来直接使用的话很简单,直接auth.setUserDetailsService然后再加你的实现类即可,可是这样的话没有使用到加密,可能有的人会说,我可以在实现层自己做加密处理,虽然这种方法是可以的,但是我们security已经提供哦了我们这种加密的方式,为何我们还要自己去弄呢?不是多此一举吗?好了我们还是基于我们security来讲。
我们要新建一个PasswordConfig类然后去实现PasswordEncoder这个接口,然后去重新这两个方法
@Service
public class PasswordConfig implements PasswordEncoder{
@Override
public String encodePassword(String rawPass, Object salt) {
// TODO Auto-generated method stub
StringBuffer result = new StringBuffer();
Md5PasswordEncoder md5 = new Md5PasswordEncoder();
md5.setEncodeHashAsBase64(true);
result.append(md5.encodePassword(rawPass, salt));
return result.toString();
// return PasswordUtil.encodePassword("MD5", rawPass, salt);
}
@Override
public boolean isPasswordValid(String encPass, String rawPass, Object salt) {
// TODO Auto-generated method stub
StringBuffer result = new StringBuffer();
Md5PasswordEncoder md5 = new Md5PasswordEncoder();
md5.setEncodeHashAsBase64(true);
result.append(md5.encodePassword(rawPass, salt));
if(encPass.equals(result.toString()))
return true;
return false;
// return PasswordUtil.decodePassword(encPass, rawPass, salt);
}
同时我们还要新建一个PasswordUtil的工具类,这个工具类的目的就是用来加解密的
public class PasswordUtil {
public static void md5(StringBuffer result, String password, Object salt) {
// result.append(PasswordType.MD5);
Md5PasswordEncoder md5 = new Md5PasswordEncoder();
md5.setEncodeHashAsBase64(true);
result.append(md5.encodePassword(password, salt));
}
/**
* 加密
* @param type
* @param password
* @param salt
* @return
*/
public static String encodePassword(String type, String password, Object salt) {
StringBuffer result = new StringBuffer();
md5(result, password, salt);
return result.toString();
}
/**
* 解密
* @param secretkey
* @param password
* @param salt
* @return
*/
public static boolean decodePassword(String secretkey, String password, Object salt) {
StringBuffer result = new StringBuffer();
md5(result, password, salt);
// 验证通过
if(result.toString().equals(secretkey)){
return true;
}
return false;
}
因为我们这个是加盐值的,所以我们要建一个这个盐值的实现类,通常我们会将将盐值设置为账号,
@Configuration
public class SaltConfig implements SaltSource{
@Override
public Object getSalt(UserDetails user) {
// TODO Auto-generated method stub
return user.getUsername();
}
}
这样我们自定义加密就完成了,然后我们通过DaoAuthenticationProvider 这个方法将我们的加密的类和盐值的类给set进去
,然后在loadUserByUsername方法里面去数据库查找用户的信息,在放到user中即可