我已经解决了我的问题,虽然解决方案让我走的路线不同于我最初尝试实施的路线。我的最终目标是不对Active Directory服务器进行硬编码 我的spring-security-context.xml文件中的域和URL,但是要读入并注入来自我的Tomcat服务器上的外部源的值。我希望能够创建一个war文件 对于我的Spring应用程序并将其从一个Tomcat服务器移动到另一个服务器并使其连接到相应的Active Directory环境而无需任何手动干预。
我最初尝试通过在Tomcat的context.xml文件中将Active Directory设置添加为“资源”,然后使用我的代码中的JNDI读取它来实现此目标。我拿了 这种方法,因为它是我之前成功完成的数据库连接和其他每个Tomcat服务器独有的设置。我试过几个不同的 spring-security-context.xml,servlet-context.xml和context.xml文件中的设置组合,但从未能使其工作。
我读到了在Spring项目的目录结构中创建包含我的变量的属性文件,然后在代码中使用属性占位符。这个想法就是这样 一旦在Tomcat服务器上构建,部署和爆炸war文件,我就可以替换属性文件的内容。我的项目中属性文件的位置 需要包含在项目的类路径中。可以使用的一些文件夹是WEB-INF / classes或WEB-INF / lib。虽然这个想法对我有用,但我发现它有点像 在部署/爆炸war文件并用适当的设置替换属性文件的内容之后,必须记住要记住登录每个单独的Tomcat服务器。
我最后做的是在Tomcat的目录结构中创建一个新文件夹,将其包含在Tomcat的类路径中,然后将我的属性文件放在那里。我能够成功使用 我的spring-security-context.xml文件中的属性占位符从我的属性文件中更新。完成这项工作需要花费一些时间,因为我必须修改它 catalina.properties文件并找出需要去的地方。
在我的Spring Tools Suite IDE中,catalina.properties文件的位置是:
C:\eclipse\springsource\vfabric-tc-server-developer-2.9.3.RELEASE\base-instance\conf\catalina.properties
在此文件中,我更改了以下行:
shared.loader=
对此:
shared.loader=\ ${catalina.home}/shared/lib
我将更改保存到catalina.properties文件,然后在以下文件夹中创建了'\ shared \ lib'文件夹(试图保持常规):
C:\eclipse\springsource\vfabric-tc-server-developer-2.9.3.RELEASE\tomcat-7.0.42.A.RELEASE
然后我将我的属性文件ExternaActiveDirectory.properties放在此文件夹中。所以我的属性文件的完整路径是:
C:\eclipse\springsource\vfabric-tc-server-developer-2.9.3.RELEASE\tomcat-7.0.42.A.RELEASE\shared\lib\ExternalActiveDirectory.properties
我的ExternalActiveDirectory.properties文件的内容是:
ldap.domain=mydomain.mycompany.com ldap.url=ldap://adserver.mydomain.mycompany.com:389/
我将spring-security-context.xml文件的ldapActiveDirectoryAuthProvider bean更改为如下所示:
<beans:bean id="ldapActiveDirectoryAuthProvider" class="com.graybar.pima.security.ActiveDirectoryLdapAuthenticationProvider"> <beans:constructor-arg value="${ldap.domain}" /> <beans:constructor-arg value="${ldap.url}" /> <beans:property name="authoritiesMapper" ref="grantedAuthoritiesMapper" /> <beans:property name="useAuthenticationRequestCredentials" value="true" /> <beans:property name="convertSubErrorCodesToExceptions" value="true" /> </beans:bean>
我还在spring-security-context.xml文件中包含了这个额外的配置:
<beans:bean id="activeDirectoryProperties" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <beans:property name="location" value="classpath:ExternalActiveDirectory.properties" /> </beans:bean>
我停下来重新启动了我的localhost Tomcat服务器,它运行了!我将ExternalActiveDirectory.properties文件的内容切换到另一个AD服务器,停止/重新启动tomcat,然后再次尝试,以确保它确实正常工作,并继续工作。
当我在Linux服务器上实现我的更改时,我对catalina.properties文件中的shared.loader行进行了相同的更改,但它与我的Tomcat的localhost副本上的行号不同。此外,由于linux服务器上的$ CATALINA_HOME位置是/ opt / tomcat,因此我的属性文件具有以下路径:
/opt/tomcat/shared/lib/ExternalActiveDirectory.properties
我跟随的一些链接帮助了我:
http://www.mulesoft.com/tcat/tomcat-classpath 在基于servlet的应用程序中放置位置以及如何读取配置资源文件? Tomcat 6 vs 7 - lib vs shared / lib - jars only?
我希望这可以帮助其他人!
-StephenS
它只是一个正常的可注射资源,所以注入就像你想要的任何东西,一种方式:
Resource(name="ldapActiveDirectoryAuthProvider") ActiveDirectoryLdapAuthenticationProvider myProvider;
或者你可以自动装配。无论哪种方式,您都可以正常访问其属性和字段。