在这里不过多介绍ldap,由于这样的文章特别多,这里就简单直接的记录这一个问题。java
在springboot中经过引入spring-boot-starter-data-ldap,使用LdapTemplate真的挺方便,如今遇到一个问题,添加用户时,userPasswod在ldap中显示的是明文密码,我如今要对这个userPassword加密.spring
而咱们不作任何设置查看源码发现默认使用的是simplespringboot
1 public class SimpleDirContextAuthenticationStrategy implements DirContextAuthenticationStrategy { 2 private static final String SIMPLE_AUTHENTICATION = "simple"; 3 4 public SimpleDirContextAuthenticationStrategy() { 5 } 6 7 public void setupEnvironment(Hashtable<String, Object> env, String userDn, String password) { 8 env.put("java.naming.security.authentication", "simple"); 9 env.put("java.naming.security.principal", userDn); 10 env.put("java.naming.security.credentials", password); 11 }
再看源码中也有DIGEST-MD5方式加密,可是找了半天不知道怎么配置才能调用,搜索也没发现他有引用这个类的地方。app
查看springboot官网有没有相关配置,告诉能够配置spring.ldap.base-environment,因此就配置了spring-boot
spring.ldap.base-environment.java.naming.security.authentication=DIGEST-MD5加密
最后跟代码发现仍是会调用SimpleDirContextAuthenticationStrategy,并且配置的变量又会被从新定义成simple。spa
1 public class DigestMd5DirContextAuthenticationStrategy implements DirContextAuthenticationStrategy { 2 private static final String DIGEST_MD5_AUTHENTICATION = "DIGEST-MD5"; 3 4 public DigestMd5DirContextAuthenticationStrategy() { 5 } 6 7 public DirContext processContextAfterCreation(DirContext ctx, String userDn, String password) { 8 return ctx; 9 } 10 11 public void setupEnvironment(Hashtable<String, Object> env, String userDn, String password) { 12 env.put("java.naming.security.authentication", "DIGEST-MD5"); 13 env.put("java.naming.security.principal", userDn); 14 env.put("java.naming.security.credentials", password); 15 } 16 }
通过各类查官网,看源码,都不行,而后就研究ldap,看ldap怎么加密码的,发现ldap有一条命令能够返回md5加密码,而后拿这个加密密码存入userPasswod,再登陆是能够的,因此只要我知道它是怎么加密的,我也按这种方式加密,ldap就能够解密。code
1 [root@alone ~]# slappasswd -h {md5} -s "x1" 2 {MD5}bb+awtoJ7h096/WlGHPsbQ==
ldap md5加密代码以下:blog
1 /** 2 * ldap md5加密 3 * @param str 4 * @return 5 * @throws NoSuchAlgorithmException 6 * @throws UnsupportedEncodingException 7 */ 8 public static String LdapEncoderByMd5(String psw) throws NoSuchAlgorithmException, UnsupportedEncodingException { 9 MessageDigest md5=MessageDigest.getInstance("MD5"); 10 BASE64Encoder base64en = new BASE64Encoder(); 11 String md5psw=base64en.encode(md5.digest(psw.getBytes("utf-8"))); 12 return "{MD5}"+ md5psw; 13 }