0

我正在使用 spring-security 进行简单的身份验证,并通过一个简单的 ldif 文件使用 apacheDS:

<!-- BEGIN LDIF CONFIGURATION -->

<security:ldap-server ldif="classpath:spring-security-on-LDIF.ldif" root="dc=foo,dc=com" />

<bean id="userDetailsContextMapper" class="com.foo.myapp.login.springsecurity.MyLdapUserDetailsMapper">
    <constructor-arg ref="MyUserDetailsService" /> 
</bean>

<security:authentication-manager alias="authenticationManager" >
    <security:ldap-authentication-provider user-search-base="ou=users" user-search-filter="uid={0}" user-context-mapper-ref="userDetailsContextMapper"/>
</security:authentication-manager>
<!--  END LDIF CONFIGURATION -->

这很好用。现在我想在我的 .ldif 文件中添加一个新用户。不幸的是,我需要重新启动 tomcat 才能重新读取 .ldif 文件。有没有办法强制 apacheDS 在某个时候重新读取/重新缓存 ldif 文件?

4

1 回答 1

0

嗯,我想我想通了。您从上下文中获取 ApacheDSContainer,并调用它的 destroy()(调用 stop 并销毁 workingDir)。然后调用 afterPropertiesSet()(它创建了 workingDir,然后还调用了 start())。它似乎工作得很好。每当我看到文件更改时,我都会这样做。我使用 org.apache.commons.io.monitor.FileAlterationListener 来观察 .ldif 文件,该文件会在适当的时间触发 onFileChange()。

import org.springframework.security.config.BeanIds;
import org.springframework.security.ldap.server.ApacheDSContainer;
...
public void onFileChange(File file) {
    ApplicationContext ctx = ContextLoader.getCurrentWebApplicationContext();  
    if (ctx == null)
        return; 
    ApacheDSContainer container = (ApacheDSContainer)ctx.getBean(BeanIds.EMBEDDED_APACHE_DS); 

    if (container != null) {
        try {
            container.destroy();
            container.afterPropertiesSet();
        }
        catch(Exception exec) {
            // handle error
        }
    }
}
于 2014-03-10T18:55:19.227 回答