我正在开发一个需要访问LDAP服务器的JavaEE应用程序。对LDAP服务器的访问用于在登录页面和应用程序内的某些功能(自定义搜索和列表)中对用户进行身份验证。
对于身份验证部分,我使用的是JAAS,因此我可以使用基本的LDAP登录模块,具有自己的配置或自定义登录模块。但我不想两次配置LDAP参数,一个在loginalone模块的standalone.xml中,一个在应用程序内部(属性文件,或在数据库的表中),以便能够使用它实现所需的功能。理想情况是在standalone.xml文件中只配置一次,并将该配置用于登录模块和应用程序。
JBoss(EAP 6)是否拥有某种"自定义资源"可以在standalone.xml中配置并使用JNDI进行访问吗?是否有另一种解决方案允许我只配置一次LDAP连接参数,并从多个位置使用该配置?
感谢。
答案 0 :(得分:0)
我已经解决了。
我所做的是定义一个外部上下文类型的新绑定:在standalone.xml文件中,在" urn:jboss:domain:naming"子系统,我宣布了上下文:
<bindings>
<external-context name="java:global/..." module="org.jboss.as.naming" class="javax.naming.directory.InitialDirContext" cache="true">
<environment>
<property name="java.naming.factory.initial" value="com.sun.jndi.ldap.LdapCtxFactory"/>
<property name="java.naming.provider.url" value="ldap://...:389"/>
<property name="java.naming.security.authentication" value="simple"/>
<property name="java.naming.security.principal" value="cn=..."/>
<property name="java.naming.security.credentials" value="..."/>
</environment>
</external-context>
</bindings>
然后,我可以在任何需要的地方使用该背景:
try {
Context initContext = new InitialContext();
InitialDirContext ldapContext = (InitialDirContext)initContext.lookup("java:global/...");
// Connection OK!
}catch(Exception ex) {
// Connection failure!
}
这个解决方案的缺点是我不能使用JBoss附带的ldap登录模块,因为它不允许我使用上下文。所以,我将不得不开发一个自定义登录模块。