在这里不过多介绍ldap,因为这样的文章特别多,这里就简单直接的记录这一个问题。
在springboot中通过引入spring-boot-starter-data-ldap,使用LdapTemplate真的挺方便,现在遇到一个问题,添加用户时,userPasswod在ldap中显示的是明文密码,我现在要对这个userPassword加密.
而我们不做任何设置查看源码发现默认使用的是simple
1 public class SimpleDirContextAuthenticationStrategy implementsDirContextAuthenticationStrategy {2 private static final String SIMPLE_AUTHENTICATION = "simple";3
4 publicSimpleDirContextAuthenticationStrategy() {5 }6
7 public void setupEnvironment(Hashtableenv, 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方式加密,但是找了半天不知道怎么配置才能调用,搜索也没发现他有引用这个类的地方。
查看springboot官网有没有相关配置,告诉可以配置spring.ldap.base-environment,所以就配置了
spring.ldap.base-environment.java.naming.security.authentication=DIGEST-MD5
最后跟代码发现还是会调用SimpleDirContextAuthenticationStrategy,而且配置的变量又会被重新定义成simple。
1 public class DigestMd5DirContextAuthenticationStrategy implementsDirContextAuthenticationStrategy {2 private static final String DIGEST_MD5_AUTHENTICATION = "DIGEST-MD5";3
4 publicDigestMd5DirContextAuthenticationStrategy() {5 }6
7 publicDirContext processContextAfterCreation(DirContext ctx, String userDn, String password) {8 returnctx;9 }10
11 public void setupEnvironment(Hashtableenv, 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就可以解密。
1 [root@alone ~]# slappasswd -h {md5} -s "x1"
2 {MD5}bb+awtoJ7h096/WlGHPsbQ==
ldap md5加密代码如下:
1 /**
2 * ldap md5加密3 *@paramstr4 *@return
5 *@throwsNoSuchAlgorithmException6 *@throwsUnsupportedEncodingException7 */
8 public static String LdapEncoderByMd5(String psw) throwsNoSuchAlgorithmException, UnsupportedEncodingException {9 MessageDigest md5=MessageDigest.getInstance("MD5");10 BASE64Encoder base64en = newBASE64Encoder();11 String md5psw=base64en.encode(md5.digest(psw.getBytes("utf-8")));12 return "{MD5}"+md5psw;13 }