|
|
@ -1,24 +1,19 @@ |
|
|
|
package com.fr.plugin.decision.passport.ldaps; |
|
|
|
package com.fr.plugin.decision.passport.ldaps; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import com.fanruan.api.conf.HolderKit; |
|
|
|
|
|
|
|
import com.fanruan.api.decision.UserKit; |
|
|
|
|
|
|
|
import com.fanruan.api.decision.auth.BasePassport; |
|
|
|
|
|
|
|
import com.fanruan.api.decision.middle.ReadOnlyUser; |
|
|
|
|
|
|
|
import com.fanruan.api.log.LogKit; |
|
|
|
|
|
|
|
import com.fanruan.api.runtime.ResourceKit; |
|
|
|
|
|
|
|
import com.fanruan.api.security.SecurityKit; |
|
|
|
|
|
|
|
import com.fanruan.api.util.AssistKit; |
|
|
|
|
|
|
|
import com.fanruan.api.util.StringKit; |
|
|
|
import com.fr.config.Identifier; |
|
|
|
import com.fr.config.Identifier; |
|
|
|
import com.fr.config.holder.Conf; |
|
|
|
import com.fr.config.holder.Conf; |
|
|
|
import com.fr.config.holder.factory.Holders; |
|
|
|
|
|
|
|
import com.fr.decision.authority.data.User; |
|
|
|
|
|
|
|
import com.fr.decision.authorize.Passport; |
|
|
|
|
|
|
|
import com.fr.decision.authorize.impl.AbstractPassport; |
|
|
|
|
|
|
|
import com.fr.decision.authorize.impl.DefaultPassport; |
|
|
|
|
|
|
|
import com.fr.decision.privilege.encrpt.PasswordValidator; |
|
|
|
import com.fr.decision.privilege.encrpt.PasswordValidator; |
|
|
|
import com.fr.decision.webservice.utils.UserSourceFactory; |
|
|
|
import org.jetbrains.annotations.Nullable; |
|
|
|
import com.fr.decision.webservice.v10.user.UserService; |
|
|
|
|
|
|
|
import com.fr.general.ComparatorUtils; |
|
|
|
|
|
|
|
import com.fr.io.utils.ResourceIOUtils; |
|
|
|
|
|
|
|
import com.fr.log.FineLoggerFactory; |
|
|
|
|
|
|
|
import com.fr.security.SecurityToolbox; |
|
|
|
|
|
|
|
import com.fr.stable.AssistUtils; |
|
|
|
|
|
|
|
import com.fr.stable.StringUtils; |
|
|
|
|
|
|
|
import com.fr.third.javax.annotation.Nullable; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import javax.naming.AuthenticationException; |
|
|
|
|
|
|
|
import javax.naming.Context; |
|
|
|
import javax.naming.Context; |
|
|
|
import javax.naming.NamingEnumeration; |
|
|
|
import javax.naming.NamingEnumeration; |
|
|
|
import javax.naming.NamingException; |
|
|
|
import javax.naming.NamingException; |
|
|
@ -40,7 +35,7 @@ import java.util.concurrent.ExecutionException; |
|
|
|
import java.util.concurrent.FutureTask; |
|
|
|
import java.util.concurrent.FutureTask; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public class LdapsPassport extends AbstractPassport { |
|
|
|
public class LdapsPassport extends BasePassport { |
|
|
|
private static final long serialVersionUID = -1848712022102261769L; |
|
|
|
private static final long serialVersionUID = -1848712022102261769L; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -57,39 +52,39 @@ public class LdapsPassport extends AbstractPassport { |
|
|
|
/** |
|
|
|
/** |
|
|
|
* 缓存上次匹配的结果字段 |
|
|
|
* 缓存上次匹配的结果字段 |
|
|
|
*/ |
|
|
|
*/ |
|
|
|
private String lastTimeMatchWord = StringUtils.EMPTY; |
|
|
|
private String lastTimeMatchWord = StringKit.EMPTY; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@Identifier("ldapsUrl") |
|
|
|
@Identifier("ldapsUrl") |
|
|
|
private Conf<String> ldapUrl = Holders.simple(StringUtils.EMPTY); |
|
|
|
private Conf<String> ldapUrl = HolderKit.simple(StringKit.EMPTY); |
|
|
|
|
|
|
|
|
|
|
|
@Identifier("ldapsSearchBase") |
|
|
|
@Identifier("ldapsSearchBase") |
|
|
|
private Conf<String> ldapSearchBase = Holders.simple(StringUtils.EMPTY); |
|
|
|
private Conf<String> ldapSearchBase = HolderKit.simple(StringKit.EMPTY); |
|
|
|
|
|
|
|
|
|
|
|
//是否使用检索位置作为baseDN,是的话就加到url中,否则加到search的参数中
|
|
|
|
//是否使用检索位置作为baseDN,是的话就加到url中,否则加到search的参数中
|
|
|
|
@Identifier("ldapsRetrieveLocAsBaseDN") |
|
|
|
@Identifier("ldapsRetrieveLocAsBaseDN") |
|
|
|
private Conf<Boolean> retrieveLocAsBaseDN = Holders.simple(true); |
|
|
|
private Conf<Boolean> retrieveLocAsBaseDN = HolderKit.simple(true); |
|
|
|
//认证方式
|
|
|
|
//认证方式
|
|
|
|
@Identifier("ldapsAuthentication") |
|
|
|
@Identifier("ldapsAuthentication") |
|
|
|
private Conf<String> authentication = Holders.simple(AUTH_SIMPLE);// none,simple,strong
|
|
|
|
private Conf<String> authentication = HolderKit.simple(AUTH_SIMPLE);// none,simple,strong
|
|
|
|
//context初始化的Factory,一般用这个默认值
|
|
|
|
//context初始化的Factory,一般用这个默认值
|
|
|
|
@Identifier("ldapsContextFactory") |
|
|
|
@Identifier("ldapsContextFactory") |
|
|
|
private Conf<String> contextFactory = Holders.simple(SUN_DEFAULT_CONTEXT_FACTORY); |
|
|
|
private Conf<String> contextFactory = HolderKit.simple(SUN_DEFAULT_CONTEXT_FACTORY); |
|
|
|
//指定将如何处理服务提供者遇到的引用的环境属性名称
|
|
|
|
//指定将如何处理服务提供者遇到的引用的环境属性名称
|
|
|
|
@Identifier("ldapsReferral") |
|
|
|
@Identifier("ldapsReferral") |
|
|
|
private Conf<String> referral = Holders.simple(REFERRAL_FOLLOW);// follow, ignore, throw
|
|
|
|
private Conf<String> referral = HolderKit.simple(REFERRAL_FOLLOW);// follow, ignore, throw
|
|
|
|
//ldap用户后缀,如@finereport.com
|
|
|
|
//ldap用户后缀,如@finereport.com
|
|
|
|
@Identifier("ldapsPprincipalSuffix") |
|
|
|
@Identifier("ldapsPprincipalSuffix") |
|
|
|
private Conf<String> principalSuffix = Holders.simple(StringUtils.EMPTY); |
|
|
|
private Conf<String> principalSuffix = HolderKit.simple(StringKit.EMPTY); |
|
|
|
//ldap系统的管理员姓名
|
|
|
|
//ldap系统的管理员姓名
|
|
|
|
@Identifier("ldapsSystemName") |
|
|
|
@Identifier("ldapsSystemName") |
|
|
|
private Conf<String> ldapSystemName = Holders.simple(StringUtils.EMPTY); |
|
|
|
private Conf<String> ldapSystemName = HolderKit.simple(StringKit.EMPTY); |
|
|
|
//ldap系统的管理员密码
|
|
|
|
//ldap系统的管理员密码
|
|
|
|
@Identifier("ldapsSystemPassword") |
|
|
|
@Identifier("ldapsSystemPassword") |
|
|
|
private Conf<String> ldapSystemPassword = Holders.simple(StringUtils.EMPTY); |
|
|
|
private Conf<String> ldapSystemPassword = HolderKit.simple(StringKit.EMPTY); |
|
|
|
//ldaps证书路径
|
|
|
|
//ldaps证书路径
|
|
|
|
@Identifier("ldapsCertPath") |
|
|
|
@Identifier("ldapsCertPath") |
|
|
|
private Conf<String> certPath = Holders.simple(StringUtils.EMPTY); |
|
|
|
private Conf<String> certPath = HolderKit.simple(StringKit.EMPTY); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public LdapsPassport() { |
|
|
|
public LdapsPassport() { |
|
|
@ -153,11 +148,11 @@ public class LdapsPassport extends AbstractPassport { |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public String getLdapSystemPassword() { |
|
|
|
public String getLdapSystemPassword() { |
|
|
|
return StringUtils.isEmpty(ldapSystemPassword.get()) ? null : SecurityToolbox.decrypt(ldapSystemPassword.get()); |
|
|
|
return StringKit.isEmpty(ldapSystemPassword.get()) ? null : SecurityKit.decrypt(ldapSystemPassword.get()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public void setLdapSystemPassword(String ldapSystemPassword) { |
|
|
|
public void setLdapSystemPassword(String ldapSystemPassword) { |
|
|
|
this.ldapSystemPassword.set(SecurityToolbox.encrypt(ldapSystemPassword)); |
|
|
|
this.ldapSystemPassword.set(SecurityKit.encrypt(ldapSystemPassword)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public boolean isRetrieveLocAsBaseDN() { |
|
|
|
public boolean isRetrieveLocAsBaseDN() { |
|
|
@ -189,7 +184,7 @@ public class LdapsPassport extends AbstractPassport { |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public int hashCode() { |
|
|
|
public int hashCode() { |
|
|
|
return AssistUtils.hashCode(ldapUrl.get(), ldapSearchBase.get(), ldapSystemName.get(), ldapSystemPassword.get(), |
|
|
|
return AssistKit.hashCode(ldapUrl.get(), ldapSearchBase.get(), ldapSystemName.get(), ldapSystemPassword.get(), |
|
|
|
referral.get(), retrieveLocAsBaseDN.get(), authentication.get(), contextFactory.get(), certPath.get()); |
|
|
|
referral.get(), retrieveLocAsBaseDN.get(), authentication.get(), contextFactory.get(), certPath.get()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -199,19 +194,20 @@ public class LdapsPassport extends AbstractPassport { |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
LdapsPassport target = (LdapsPassport) obj; |
|
|
|
LdapsPassport target = (LdapsPassport) obj; |
|
|
|
return ComparatorUtils.equals(target.getPrincipalSuffix(), this.getPrincipalSuffix()) |
|
|
|
return AssistKit.equals(target.getPrincipalSuffix(), this.getPrincipalSuffix()) |
|
|
|
&& ComparatorUtils.equals(target.getReferral(), this.getReferral()) |
|
|
|
&& AssistKit.equals(target.getReferral(), this.getReferral()) |
|
|
|
&& ComparatorUtils.equals(target.getLdapUrl(), this.getLdapUrl()) |
|
|
|
&& AssistKit.equals(target.getLdapUrl(), this.getLdapUrl()) |
|
|
|
&& ComparatorUtils.equals(target.getContextFactory(), this.getContextFactory()) |
|
|
|
&& AssistKit.equals(target.getContextFactory(), this.getContextFactory()) |
|
|
|
&& ComparatorUtils.equals(target.getAuthentication(), this.getAuthentication()) |
|
|
|
&& AssistKit.equals(target.getAuthentication(), this.getAuthentication()) |
|
|
|
&& ComparatorUtils.equals(target.getLdapSystemName(), this.getLdapSystemName()) |
|
|
|
&& AssistKit.equals(target.getLdapSystemName(), this.getLdapSystemName()) |
|
|
|
&& ComparatorUtils.equals(target.getLdapSearchBase(), this.getLdapSearchBase()) |
|
|
|
&& AssistKit.equals(target.getLdapSearchBase(), this.getLdapSearchBase()) |
|
|
|
&& ComparatorUtils.equals(target.getLdapSystemPassword(), this.getLdapSystemPassword()) |
|
|
|
&& AssistKit.equals(target.getLdapSystemPassword(), this.getLdapSystemPassword()) |
|
|
|
&& ComparatorUtils.equals(target.getCertPath(), this.getCertPath()); |
|
|
|
&& AssistKit.equals(target.getCertPath(), this.getCertPath()); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
@Override |
|
|
|
@Override |
|
|
|
public boolean checkTicket(String username, String inputPassword, String savedPassword, String hashPassword) { |
|
|
|
public boolean checkTicket(String username, String inputPassword, String savedPassword, String hashPassword) { |
|
|
|
if (StringUtils.isNotEmpty(principalSuffix.get())) { |
|
|
|
if (StringKit.isNotEmpty(principalSuffix.get())) { |
|
|
|
username += principalSuffix.get(); |
|
|
|
username += principalSuffix.get(); |
|
|
|
} |
|
|
|
} |
|
|
|
return connect(username, inputPassword); |
|
|
|
return connect(username, inputPassword); |
|
|
@ -255,7 +251,7 @@ public class LdapsPassport extends AbstractPassport { |
|
|
|
Properties props = new Properties(); |
|
|
|
Properties props = new Properties(); |
|
|
|
props.put(Context.INITIAL_CONTEXT_FACTORY, getContextFactory()); |
|
|
|
props.put(Context.INITIAL_CONTEXT_FACTORY, getContextFactory()); |
|
|
|
String url = getLdapUrl(); |
|
|
|
String url = getLdapUrl(); |
|
|
|
if (StringUtils.isNotBlank(url)) { |
|
|
|
if (StringKit.isNotBlank(url)) { |
|
|
|
if (!url.endsWith("/")) { |
|
|
|
if (!url.endsWith("/")) { |
|
|
|
url += "/"; |
|
|
|
url += "/"; |
|
|
|
} |
|
|
|
} |
|
|
@ -276,32 +272,32 @@ public class LdapsPassport extends AbstractPassport { |
|
|
|
ks.load(null, null); |
|
|
|
ks.load(null, null); |
|
|
|
ks.setCertificateEntry("LDAP_ALIAS", certificate); |
|
|
|
ks.setCertificateEntry("LDAP_ALIAS", certificate); |
|
|
|
|
|
|
|
|
|
|
|
if (!ResourceIOUtils.exist("/plugins/ldaps.keystore")) { |
|
|
|
if (!ResourceKit.exist("/plugins/ldaps.keystore")) { |
|
|
|
ResourceIOUtils.createFile("/plugins/ldaps.keystore"); |
|
|
|
ResourceKit.createFile("/plugins/ldaps.keystore"); |
|
|
|
File keyStoreFile = new File(ResourceIOUtils.getRealPath("/plugins/ldaps.keystore")); |
|
|
|
File keyStoreFile = new File(ResourceKit.getRealPath("/plugins/ldaps.keystore")); |
|
|
|
FileOutputStream fos = new FileOutputStream(keyStoreFile); |
|
|
|
FileOutputStream fos = new FileOutputStream(keyStoreFile); |
|
|
|
ks.store(fos, "LdapsKeyStorePwd".toCharArray()); |
|
|
|
ks.store(fos, "LdapsKeyStorePwd".toCharArray()); |
|
|
|
} |
|
|
|
} |
|
|
|
} catch (Exception e) { |
|
|
|
} catch (Exception e) { |
|
|
|
FineLoggerFactory.getLogger().error("LDAPS: Exception during reading key file and writing keyStore" + e.toString()); |
|
|
|
LogKit.error("LDAPS: Exception during reading key file and writing keyStore" + e.toString()); |
|
|
|
} |
|
|
|
} |
|
|
|
System.setProperty("javax.net.ssl.trustStore", ResourceIOUtils.getRealPath("/plugins/ldaps.keystore")); |
|
|
|
System.setProperty("javax.net.ssl.trustStore", ResourceKit.getRealPath("/plugins/ldaps.keystore")); |
|
|
|
System.setProperty("javax.net.ssl.keyStorePassword", "LdapsKeyStorePwd"); |
|
|
|
System.setProperty("javax.net.ssl.keyStorePassword", "LdapsKeyStorePwd"); |
|
|
|
//java 1.8_181的安全性改动,开启了对于LDAP的端点标识,导致证书里的CN和ldaps服务器域名对不上就抛错
|
|
|
|
//java 1.8_181的安全性改动,开启了对于LDAP的端点标识,导致证书里的CN和ldaps服务器域名对不上就抛错
|
|
|
|
System.setProperty("com.sun.jndi.ldap.object.disableEndpointIdentification", "true"); |
|
|
|
System.setProperty("com.sun.jndi.ldap.object.disableEndpointIdentification", "true"); |
|
|
|
//-----------------LDAPS--------------------
|
|
|
|
//-----------------LDAPS--------------------
|
|
|
|
//有管理员账号时,是显示连接
|
|
|
|
//有管理员账号时,是显示连接
|
|
|
|
if (StringUtils.isNotBlank(getLdapSystemName()) |
|
|
|
if (StringKit.isNotBlank(getLdapSystemName()) |
|
|
|
&& StringUtils.isNotBlank(getLdapSystemPassword())) { |
|
|
|
&& StringKit.isNotBlank(getLdapSystemPassword())) { |
|
|
|
props.put(Context.SECURITY_PRINCIPAL, getLdapSystemName()); |
|
|
|
props.put(Context.SECURITY_PRINCIPAL, getLdapSystemName()); |
|
|
|
props.put(Context.SECURITY_CREDENTIALS, getLdapSystemPassword()); |
|
|
|
props.put(Context.SECURITY_CREDENTIALS, getLdapSystemPassword()); |
|
|
|
} |
|
|
|
} |
|
|
|
try { |
|
|
|
try { |
|
|
|
return new InitialLdapContext(props, connCtls); |
|
|
|
return new InitialLdapContext(props, connCtls); |
|
|
|
} catch (javax.naming.AuthenticationException e) { |
|
|
|
} catch (javax.naming.AuthenticationException e) { |
|
|
|
FineLoggerFactory.getLogger().error("LDAPS: AuthenticationException,Authentication failed: " + e.toString()); |
|
|
|
LogKit.error("LDAPS: AuthenticationException,Authentication failed: " + e.toString()); |
|
|
|
} catch (Exception e) { |
|
|
|
} catch (Exception e) { |
|
|
|
FineLoggerFactory.getLogger().error("LDAPS: Exception,Something wrong while authenticating: " + e.toString()); |
|
|
|
LogKit.error("LDAPS: Exception,Something wrong while authenticating: " + e.toString()); |
|
|
|
} |
|
|
|
} |
|
|
|
return null; |
|
|
|
return null; |
|
|
|
} |
|
|
|
} |
|
|
@ -309,20 +305,16 @@ public class LdapsPassport extends AbstractPassport { |
|
|
|
private boolean authenticate(LdapContext ctx, String username, String password) { |
|
|
|
private boolean authenticate(LdapContext ctx, String username, String password) { |
|
|
|
boolean isValid = true; |
|
|
|
boolean isValid = true; |
|
|
|
String userDN = recurseGetUserDN(ctx, username); |
|
|
|
String userDN = recurseGetUserDN(ctx, username); |
|
|
|
if (StringUtils.isEmpty(userDN)) { |
|
|
|
if (StringKit.isEmpty(userDN)) { |
|
|
|
//未正确获取到DN,代表域上没有这个用户而平台有,客户需求:转而用平台登录
|
|
|
|
//未正确获取到DN,代表域上没有这个用户而平台有,客户需求:转而用平台登录
|
|
|
|
FineLoggerFactory.getLogger().debug("LDAPS: No such user on ldap server, authenticating with platform passport"); |
|
|
|
LogKit.debug("LDAPS: No such user on ldap server, authenticating with platform passport"); |
|
|
|
try { |
|
|
|
try { |
|
|
|
User user = UserService.getInstance().getUserByUserName(username); |
|
|
|
ReadOnlyUser user = UserKit.getReadOnlyUser(username); |
|
|
|
if (user == null) { |
|
|
|
PasswordValidator passwordValidator = UserKit.fetchUserSource(username).getPasswordValidator(); |
|
|
|
return false; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
PasswordValidator passwordValidator = UserSourceFactory.getInstance().getUserSource(user).getPasswordValidator(); |
|
|
|
|
|
|
|
String hashPassword = passwordValidator.encode(user.getUserName(), password); |
|
|
|
String hashPassword = passwordValidator.encode(user.getUserName(), password); |
|
|
|
Passport passport = new DefaultPassport(); |
|
|
|
return AssistKit.equals(user.getPassword(), hashPassword); |
|
|
|
return passport.checkTicket(user.getUserName(), password, user.getPassword(), hashPassword); |
|
|
|
|
|
|
|
} catch (Exception e) { |
|
|
|
} catch (Exception e) { |
|
|
|
FineLoggerFactory.getLogger().error("LDAPS: Exception during logging with platform default passport"); |
|
|
|
LogKit.error("LDAPS: Exception during logging with platform default passport"); |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -330,11 +322,8 @@ public class LdapsPassport extends AbstractPassport { |
|
|
|
ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, userDN); |
|
|
|
ctx.addToEnvironment(Context.SECURITY_PRINCIPAL, userDN); |
|
|
|
ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, password); |
|
|
|
ctx.addToEnvironment(Context.SECURITY_CREDENTIALS, password); |
|
|
|
ctx.reconnect(connCtls); |
|
|
|
ctx.reconnect(connCtls); |
|
|
|
} catch (AuthenticationException e) { |
|
|
|
|
|
|
|
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
|
|
|
|
|
|
|
isValid = false; |
|
|
|
|
|
|
|
} catch (NamingException e) { |
|
|
|
} catch (NamingException e) { |
|
|
|
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
|
|
|
LogKit.error(e.getMessage(), e); |
|
|
|
isValid = false; |
|
|
|
isValid = false; |
|
|
|
} |
|
|
|
} |
|
|
|
return isValid; |
|
|
|
return isValid; |
|
|
@ -343,36 +332,36 @@ public class LdapsPassport extends AbstractPassport { |
|
|
|
private String recurseGetUserDN(LdapContext ctx, String name) { |
|
|
|
private String recurseGetUserDN(LdapContext ctx, String name) { |
|
|
|
String lastTimeMatchWordShadow = threadLocal.get(); |
|
|
|
String lastTimeMatchWordShadow = threadLocal.get(); |
|
|
|
// 前一次匹配成功的字段作为优先匹配的字段
|
|
|
|
// 前一次匹配成功的字段作为优先匹配的字段
|
|
|
|
if (StringUtils.isNotEmpty(lastTimeMatchWordShadow)) { |
|
|
|
if (StringKit.isNotEmpty(lastTimeMatchWordShadow)) { |
|
|
|
FineLoggerFactory.getLogger().debug("LDAPS: Using cached word " + lastTimeMatchWordShadow); |
|
|
|
LogKit.debug("LDAPS: Using cached word " + lastTimeMatchWordShadow); |
|
|
|
String userDN = getUserDN(ctx, name, lastTimeMatchWordShadow); |
|
|
|
String userDN = getUserDN(ctx, name, lastTimeMatchWordShadow); |
|
|
|
if (StringUtils.isNotBlank(userDN)) { |
|
|
|
if (StringKit.isNotBlank(userDN)) { |
|
|
|
return userDN; |
|
|
|
return userDN; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
String[] fWords = {"sAMAccountName", "cn", "userPrincipalName", "uid", "displayName", "name", "sn",}; |
|
|
|
String[] fWords = {"sAMAccountName", "cn", "userPrincipalName", "uid", "displayName", "name", "sn",}; |
|
|
|
for (String fWord : fWords) { |
|
|
|
for (String fWord : fWords) { |
|
|
|
if (StringUtils.isNotEmpty(lastTimeMatchWordShadow) && ComparatorUtils.equals(lastTimeMatchWordShadow, fWord)) { |
|
|
|
if (StringKit.isNotEmpty(lastTimeMatchWordShadow) && AssistKit.equals(lastTimeMatchWordShadow, fWord)) { |
|
|
|
continue; |
|
|
|
continue; |
|
|
|
} |
|
|
|
} |
|
|
|
String userDN = getUserDN(ctx, name, fWord); |
|
|
|
String userDN = getUserDN(ctx, name, fWord); |
|
|
|
if (StringUtils.isNotBlank(userDN)) { |
|
|
|
if (StringKit.isNotBlank(userDN)) { |
|
|
|
// 缓存匹配字段
|
|
|
|
// 缓存匹配字段
|
|
|
|
FineLoggerFactory.getLogger().debug("LDAPS: Cached word updated to " + fWord); |
|
|
|
LogKit.debug("LDAPS: Cached word updated to " + fWord); |
|
|
|
lastTimeMatchWord = fWord; |
|
|
|
lastTimeMatchWord = fWord; |
|
|
|
return userDN; |
|
|
|
return userDN; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
return StringUtils.EMPTY; |
|
|
|
return StringKit.EMPTY; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
private String getUserDN(LdapContext ctx, String name, String word) { |
|
|
|
private String getUserDN(LdapContext ctx, String name, String word) { |
|
|
|
String userDN = StringUtils.EMPTY; |
|
|
|
String userDN = StringKit.EMPTY; |
|
|
|
try { |
|
|
|
try { |
|
|
|
SearchControls constraints = new SearchControls(); |
|
|
|
SearchControls constraints = new SearchControls(); |
|
|
|
constraints.setSearchScope(SearchControls.SUBTREE_SCOPE); |
|
|
|
constraints.setSearchScope(SearchControls.SUBTREE_SCOPE); |
|
|
|
String filter = "(&(" + word + "=" + name + "))"; |
|
|
|
String filter = "(&(" + word + "=" + name + "))"; |
|
|
|
String baseDN = StringUtils.EMPTY; |
|
|
|
String baseDN = StringKit.EMPTY; |
|
|
|
if (!isRetrieveLocAsBaseDN()) { |
|
|
|
if (!isRetrieveLocAsBaseDN()) { |
|
|
|
//检索位置不作为BaseDN,那url中不加上检索位置,search中则用检索位置作为BaseDN
|
|
|
|
//检索位置不作为BaseDN,那url中不加上检索位置,search中则用检索位置作为BaseDN
|
|
|
|
baseDN = getLdapSearchBase(); |
|
|
|
baseDN = getLdapSearchBase(); |
|
|
@ -382,15 +371,15 @@ public class LdapsPassport extends AbstractPassport { |
|
|
|
if (en.hasMoreElements()) { |
|
|
|
if (en.hasMoreElements()) { |
|
|
|
SearchResult sr = (SearchResult) en.nextElement(); |
|
|
|
SearchResult sr = (SearchResult) en.nextElement(); |
|
|
|
userDN = sr.getNameInNamespace(); |
|
|
|
userDN = sr.getNameInNamespace(); |
|
|
|
if (StringUtils.isNotBlank(userDN) && userDN.contains(name)) { |
|
|
|
if (StringKit.isNotBlank(userDN) && userDN.contains(name)) { |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} catch (Exception e) { |
|
|
|
} catch (Exception e) { |
|
|
|
FineLoggerFactory.getLogger().error("LDAPS: error during getUserDN ", e); |
|
|
|
LogKit.error("LDAPS: error during getUserDN ", e); |
|
|
|
} |
|
|
|
} |
|
|
|
FineLoggerFactory.getLogger().debug("LDAPS: Using word " + word + " name "+ name +" and found userDN " + userDN); |
|
|
|
LogKit.debug("LDAPS: Using word " + word + " name " + name + " and found userDN " + userDN); |
|
|
|
return userDN; |
|
|
|
return userDN; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -400,7 +389,7 @@ public class LdapsPassport extends AbstractPassport { |
|
|
|
ctx.close(); |
|
|
|
ctx.close(); |
|
|
|
} |
|
|
|
} |
|
|
|
} catch (NamingException e) { |
|
|
|
} catch (NamingException e) { |
|
|
|
FineLoggerFactory.getLogger().error(e.getMessage(), e); |
|
|
|
LogKit.error(e.getMessage(), e); |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|