在Spring Security中配置从Wildlfy standalone.xml提取的LDAP访问信息

时间:2019-01-12 00:52:55

标签: java spring-mvc ldap wildfly

我正在使用Spring MVC,Maven和Wildfly开发一个Webapp。我没有使用web.xml来配置数据源。我的配置是通过Java类应用的。

我需要从Java Spring Security配置类访问LDAP服务器信息(URL,基本dn,用户名,密码),该信息位于服务器的Wildfly配置文件夹中的standalone.xml中。出于安全问题,我不允许在application.properties文件中编码LDAP信息。不使用web.xml,我不知道该怎么做。有什么建议吗?

这是我到目前为止所拥有的...

-standalone.xml(LDAP配置)

<security-domain name="MYDOMAIN">
  <authentication>
    <login-module code="LdapExtended" flag="required">
      <module-option name="java.naming.factory.initial" value="com.sun.jndi.ldap.LdapCtxFactory"/>
      <module-option name="java.naming.provider.url" value="ldap://myurl:000/"/>
      <module-option name="java.naming.security.authentication" value="simple"/>
      <module-option name="bindDN" value="mybinddn"/>
      <module-option name="bindCredential" value="00000000000"/>
      <module-option name="baseCtxDN" value="DC=bla,DC=bla,DC=bla"/>
      <module-option name="baseFilter" value="(sAMAccountName={0})"/>
      <module-option name="rolesCtxDN" value="OU=Ludopatia,DC=iplyc,DC=gov,DC=ar"/>
      <module-option name="roleFilter" value="(member={1})"/>
      <module-option name="roleAttributeID" value="cn"/>
      <module-option name="searchScope" value="ONELEVEL_SCOPE"/>
      <module-option name="allowEmptyPasswords" value="false"/>
    </login-module>
  </authentication>
</security-domain>

-SecurityConfiguration.java

公共类SecurityConfiguration扩展了WebSecurityConfigurerAdapter {

@Value("${ldap.urls}")
private String ldapUrls;

@Value("${ldap.base.dn}")
private String ldapBaseDn;

@Value("${ldap.username}")
private String ldapUsername;

@Value("${ldap.password}")
private String ldapPassword;

@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception{
    auth.ldapAuthentication()
    .userSearchFilter("sAMAccountName={0}")
    .groupSearchBase("ou=Ludopatia")
    .groupSearchFilter("member={0}")
    .contextSource()
       .url(ldapUrls+ldapBaseDn)
       .managerDn(ldapUsername)
       .managerPassword(ldapPassword);
}

}

-pom.xml(其中设置了wildfly-maven-plugin的部分)

<plugin>  
    <groupId>org.wildfly.plugins</groupId>  
    <artifactId>wildfly-maven-plugin</artifactId>  
    <version>1.0.1.Final</version>  
    <configuration>
             <jboss-home>${wildfly.home}</jboss-home>
             <modules-path>${wildfly.home}/modules</modules-path>
         <server-config>standalone.xml</server-config>
         <filename>${project.build.finalName}.war</filename>
    </configuration>  
</plugin>

-application.properties

ldap.urls=ldap://myurl:000/
ldap.base.dn=dc=bla,dc=bla,dc=bla
ldap.username=mybinddn
ldap.password=000000000000

像这样配置,可以完美运行。但是我需要从application.properties中删除LDAP信息,并直接从standalone.xml中获取它,而无需使用web.xml。

预先感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您可以直接从WILDFLY控制台中将这些值设置为系统属性,并将它们自动填充到standalone.xml文件中。

为此,请执行以下步骤:

  1. 通过添加管理员用户(对于Windows为add-user.bat /对于Linux为add-user.sh)来启用管理控制台。
  2. 添加用户后,访问管理控制台(http://127.0.0.1:9990/management)。
  3. 它将提示输入用户名和密码。输入用户名和密码。
  4. 导航到配置->系统属性,并添加所需数量的属性。它们将显示在配置文件中。

    <system-properties>
      <property name="ldap.urls" value="ldap://myurl:000/"/>
      <property name="ldap.base.dn" value="dc=bla,dc=bla,dc=bla"/>
      <property name="ldap.username" value="mybinddn"/>
      <property name="ldap.password" value="000000000000"/>
    </system-properties>
    

要在代码中访问这些属性,您需要将其作为系统属性来访问,例如

String ldapUsername= System.getProperty("ldap.username");
String ldapPassword= System.getProperty("ldap.password");

此方法的唯一缺点是这些属性的值始终可见,这就是我建议使用vault项目的原因。

另一个建议是为ldap配置提供加密的值,并在读取后解密它们。