我以为我会找到更多关于这个主题的信息,但我没有。
我必须编写一个 java 应用程序来检查特定用户属于哪个用户。
但是要通过服务器进行身份验证,我不能要求用户名和密码,也不能将其存储在源(或其他文件)中。
JNDI 和 Java 有没有办法对当前登录的用户进行身份验证?
我以为我会找到更多关于这个主题的信息,但我没有。
我必须编写一个 java 应用程序来检查特定用户属于哪个用户。
但是要通过服务器进行身份验证,我不能要求用户名和密码,也不能将其存储在源(或其他文件)中。
JNDI 和 Java 有没有办法对当前登录的用户进行身份验证?
您所能做的就是检查是否存在与当前登录 Java 应用程序的用户具有相同用户名的用户。没有密码,您将无法检查其他任何内容。为此,您需要一些有权列出其他用户的 ldap 用户的用户名和密码。然后您可以为您的用户查询 LDAP。
这是一个改编自我使用的示例的示例,它会检查活动目录,因此可能需要进行一些更改:
boolean userFound = user_exits("searchUser",
"searchPassword",
"(sAMAccountName={USERNAME})",
"ldap://ldap.mydomain.com",
"OU=MYOU,dc=mydomain,dc=com");
private boolean user_exits(String searchUser, String searchPassword,
String filter, String url, String baseDn) throws NamingException {
DirContext ctx = null;
Hashtable<String, String> env = new Hashtable<String, String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, url);
env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, searchUser);
env.put(Context.SECURITY_CREDENTIALS, searchPassword);
try {
ctx = new InitialDirContext(env);
String[] attributeFilter = {};
SearchControls sc = new SearchControls();
sc.setReturningAttributes(attributeFilter);
sc.setSearchScope(SearchControls.SUBTREE_SCOPE);
NamingEnumeration<SearchResult> results = ctx.search(baseDn, filter, sc);
return results.hasMore();
} catch (NamingException e) {
throw e;
} finally {
if (ctx != null) {
try {
ctx.close();
} catch (NamingException e) {}
}
}
}
如果 LDAP 客户端具有现有连接,请使用who am i?
扩展请求或authorization identity request control
确定现有连接的 authID - 符合 LDAP 的服务器和UnboundID LDAP SDK将支持任一方法。who am i?
扩展请求可以随时在连接上使用(假设身份验证身份有权使用扩展请求),但只能authorization identity request control
附加到绑定请求。
who am i?
扩展请求的使用authorization identity request control
在AuthDemo.java中进行了演示。
由于似乎没有真正的解决方案,我现在在脚本/工具的开头请求登录信息并在需要时使用它。