【发布时间】:2019-12-04 10:33:03
【问题描述】:
我想在 AEM 中使用在 OSGi 中解析的 maven 依赖项以编程方式连接到 LDAP
面临的方法和后续问题:-
1.无法使用
@Reference
private ExternalIdentityProviderManager externalIdentityProviderManager;
final String externalId = request.getParameter("externalId");
final String externalPassword = request.getParameter("externalPassword");
final ExternalIdentityProvider idap = externalIdentityProviderManager.getProvider("ldap");
final SimpleCredentials credentials = new SimpleCredentials(externalId, externalPassword.toCharArray());
final ExternalUser externalUser = idap.authenticate(credentials);
因为此身份提供程序配置仅存在于作者环境中,而不存在于发布服务器中(根据要求)。
2。尝试使用
<dependency>
<groupId>org.apache.directory.api</groupId>
<artifactId>api-ldap-client-api</artifactId>
<version>2.0.0.AM4</version>
</dependency>
解决依赖关系。它解决了我的编译时错误,但这不是一个“准备好 osgi”的库,因此 无法在 OSGi 中安装。如果手动这样做,它会有更多未解决的依赖项。
此方法的代码参考 - https://directory.apache.org/api/user-guide/2.1-connection-disconnection.html & https://directory.apache.org/api/user-guide/2.10-ldap-connection-template.html
3。我也试过用
String rootDN = "uid=admin,ou=system";
String rootPWD = "secret";
Hashtable < String, String > environment = new Hashtable < String, String > ();
environment.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
environment.put(Context.PROVIDER_URL, "ldap://localhost:10389");
environment.put(Context.SECURITY_AUTHENTICATION, "simple");
environment.put(Context.SECURITY_PRINCIPAL, rootDN);
environment.put(Context.SECURITY_CREDENTIALS, rootPWD);
DirContext dirContext = null;
NamingEnumeration < ? > results = null;
dirContext = new InitialDirContext(environment);
SearchControls controls = new SearchControls();
controls.setSearchScope(SearchControls.SUBTREE_SCOPE);
String userId = "abhishek";
String userPwd = "{SSHA}ip/DD+zUhv22NH3wE1dvJN7oauYE4TYQ3ziRtg=="; //"apple";
String filter = "(&(objectclass=person)(uid=" + userId + ")(userPassword=" + userPwd + "))";
results = dirContext.search("", filter, controls);
if(results.hasMore()) {
System.out.println("User found");
} else {
System.out.println("User not found");
}
它有 2 个问题 - a) 在类加载的主方法中作为普通 Java 类进行测试时,它可以正常工作,但是当尝试集成到 AEM/osgi 服务类中时,它会抛出 -
javax.naming.NotContextException: Not an instance of DirContext at javax.naming.directory.InitialDirContext.getURLOrDefaultInitDirCtx(InitialDirContext.java:111) at javax.naming.directory.InitialDirContext.search(InitialDirContext.java:267)
b) 即使在普通的 Java 类中,我也必须提供散列密码来验证,这很难集成。
String userPwd = "{SSHA}ip/DD+zUhv22NH3wE1dvJN7oauYE4TYQ3ziRtg==";//"apple";
有人可以为我提供任何可以与 osgi 集成并解决依赖关系的 maven 依赖项/库,而且我不需要提供散列密码来验证用户凭据吗?有什么方法可以解决这些问题?
【问题讨论】:
标签: java ldap osgi aem maven-dependency