【问题标题】:How can configure CAS 4.0 with LDAP ApacheDS如何使用 LDAP ApacheDS 配置 CAS 4.0
【发布时间】:2014-12-17 16:32:19
【问题描述】:

我想用 ApacheDS LDAP 配置 CAS 服务器 4.0。我按照以下步骤操作:

1- 基于this Link 我修改了 deployerConfigContext.xml 文件。以下 bean 添加到此文件中:

<bean id="ldapAuthenticationHandler"
      class="org.jasig.cas.authentication.LdapAuthenticationHandler"
      p:principalIdAttribute="uid"
      c:authenticator-ref="authenticator">
    <property name="principalAttributeMap">
        <map>
            <!--
               | This map provides a simple attribute resolution mechanism.
               | Keys are LDAP attribute names, values are CAS attribute names.
               | Use this facility instead of a PrincipalResolver if LDAP is
               | the only attribute source.
               -->
            <entry key="member" value="member" />
            <entry key="mail" value="mail" />
            <entry key="displayName" value="displayName" />
        </map>
    </property>
</bean>

<bean id="authenticator" class="org.ldaptive.auth.Authenticator"
      c:resolver-ref="dnResolver"
      c:handler-ref="authHandler" />

<!--
   | The following DN format works for many directories, but may need to be
   | customized.
   -->
<bean id="dnResolver"
      class="org.ldaptive.auth.FormatDnResolver"
      c:format="uid=%s,${ldap.baseDn}" />

<bean id="authHandler" class="org.ldaptive.auth.PooledBindAuthenticationHandler"
      p:connectionFactory-ref="pooledLdapConnectionFactory" />

<bean id="pooledLdapConnectionFactory"
      class="org.ldaptive.pool.PooledConnectionFactory"
      p:connectionPool-ref="connectionPool" />

<bean id="connectionPool"
      class="org.ldaptive.pool.BlockingConnectionPool"
      init-method="initialize"
      p:poolConfig-ref="ldapPoolConfig"
      p:blockWaitTime="${ldap.pool.blockWaitTime}"
      p:validator-ref="searchValidator"
      p:pruneStrategy-ref="pruneStrategy"
      p:connectionFactory-ref="connectionFactory" />

<bean id="ldapPoolConfig" class="org.ldaptive.pool.PoolConfig"
      p:minPoolSize="${ldap.pool.minSize}"
      p:maxPoolSize="${ldap.pool.maxSize}"
      p:validateOnCheckOut="${ldap.pool.validateOnCheckout}"
      p:validatePeriodically="${ldap.pool.validatePeriodically}"
      p:validatePeriod="${ldap.pool.validatePeriod}" />

<bean id="connectionFactory" class="org.ldaptive.DefaultConnectionFactory"
      p:connectionConfig-ref="connectionConfig" />

<bean id="connectionConfig" class="org.ldaptive.ConnectionConfig"
      p:ldapUrl="${ldap.url}"
      p:connectTimeout="${ldap.connectTimeout}"
      p:useStartTLS="${ldap.useStartTLS}"
      p:sslConfig-ref="sslConfig" />

<bean id="sslConfig" class="org.ldaptive.ssl.SslConfig">
    <property name="credentialConfig">
        <bean class="org.ldaptive.ssl.X509CredentialConfig"
              p:trustCertificates="${ldap.trustedCert}" />
    </property>
</bean>

<bean id="pruneStrategy" class="org.ldaptive.pool.IdlePruneStrategy"
      p:prunePeriod="${ldap.pool.prunePeriod}"
      p:idleTime="${ldap.pool.idleTime}" />

<bean id="searchValidator" class="org.ldaptive.pool.SearchValidator" />

以下属性也添加到 cas.properties:

#========================================
# General properties
#========================================
ldap.url=ldaps://localhost:10636



# LDAP connection timeout in milliseconds
ldap.connectTimeout=30000

# Whether to use StartTLS (probably needed if not SSL connection)
ldap.useStartTLS=true

#========================================
# LDAP connection pool configuration
#========================================
ldap.pool.minSize=3
ldap.pool.maxSize=10
ldap.pool.validateOnCheckout=false
ldap.pool.validatePeriodically=true

# Amount of time in milliseconds to block on pool exhausted condition
# before giving up.
ldap.pool.blockWaitTime=3000

# Frequency of connection validation in seconds
# Only applies if validatePeriodically=true
ldap.pool.validatePeriod=3000

# Attempt to prune connections every N seconds
ldap.pool.prunePeriod=3000

# Maximum amount of time an idle connection is allowed to be in
# pool before it is liable to be removed/destroyed
ldap.pool.idleTime=6000

#========================================
# Authentication
#========================================

ldap.baseDn=dc=example,dc=com

# Base DN of users to be authenticated
ldap.authn.baseDn=dc=example,dc=com

# Manager DN for authenticated searches
ldap.authn.managerDN=uid=admin,ou=system

# Manager password for authenticated searches
ldap.authn.managerPassword=secret

# Search filter used for configurations that require searching for DNs
#ldap.authn.searchFilter=(&(uid={user})(accountState=active))
ldap.authn.searchFilter=(uid={0})

# Search filter used for configurations that require searching for DNs
#ldap.authn.format=uid=%s,ou=Users,dc=example,dc=org
ldap.authn.format=uid=%s,ou=system

ldap.trustedCert=file:/D:/ApacheDS.cer

我还使用InstallCert 将 localhost:8443 (tomcat) 和 localhost:10636 (ApacheDS) 的端口添加到 cacers 文件中。并使用Portecle 从cacers 的ApacheDs 认证中导出ApacheDS.cer。

我的tomcat的server.xml文件修改如下:

<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="50" SSLEnabled="true" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" 
               keystoreFile="C:/Program Files/Java/jdk1.7.0_60/jre/lib/security/cacerts" 
               keystorePass="changeit"
               />

还将以下罐子添加到 apache-tomcat-8.0.8\webapps\cas-server-webapp-4.0.0\WEB-INF\lib : cas-server-support-ldap-4.0.0.jar spring-ldap-core-2.0.2.RELEASE.jar spring-ldap-1.2.1.jar ldaptive-1.0.5.jar

终于!经过多次努力尝试后,我收到以下错误:

Caused by: java.lang.IllegalStateException: Could not initialize pool size
    at org.ldaptive.pool.AbstractConnectionPool.initialize(AbstractConnectionPool.java:258)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1638)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1579)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1509)
    ... 70 more
Caused by: [org.ldaptive.provider.ConnectionException@3778440::resultCode=null, matchedDn=null, responseControls=null, referralURLs=null, messageId=-1, providerException=javax.naming.ServiceUnavailableException: localhost:10636; socket closed]
    at org.ldaptive.provider.jndi.JndiStartTLSConnectionFactory.createInternal(JndiStartTLSConnectionFactory.java:95)
    at org.ldaptive.provider.jndi.JndiStartTLSConnectionFactory.createInternal(JndiStartTLSConnectionFactory.java:37)
    at org.ldaptive.provider.AbstractProviderConnectionFactory.create(AbstractProviderConnectionFactory.java:99)
    at org.ldaptive.DefaultConnectionFactory$DefaultConnection.open(DefaultConnectionFactory.java:295)
    at org.ldaptive.pool.AbstractConnectionPool.createConnection(AbstractConnectionPool.java:482)
    at org.ldaptive.pool.AbstractConnectionPool.createAvailableConnection(AbstractConnectionPool.java:523)
    at org.ldaptive.pool.AbstractConnectionPool.grow(AbstractConnectionPool.java:363)
    at org.ldaptive.pool.AbstractConnectionPool.initialize(AbstractConnectionPool.java:252)
    ... 77 more
Caused by: javax.naming.ServiceUnavailableException: localhost:10636; socket closed
    at com.sun.jndi.ldap.Connection.readReply(Connection.java:454)
    at com.sun.jndi.ldap.LdapClient.extendedOp(LdapClient.java:1202)
    at com.sun.jndi.ldap.LdapCtx.extendedOperation(LdapCtx.java:3206)
    at javax.naming.ldap.InitialLdapContext.extendedOperation(InitialLdapContext.java:183)
    at org.ldaptive.provider.jndi.JndiStartTLSConnectionFactory.startTLS(JndiStartTLSConnectionFactory.java:134)
    at org.ldaptive.provider.jndi.JndiStartTLSConnectionFactory.createInternal(JndiStartTLSConnectionFactory.java:92)
    ... 84 more

你能帮我解决这个问题吗!我真的不知道我的问题的主要原因?

【问题讨论】:

    标签: ssl ldap ssl-certificate cas apacheds


    【解决方案1】:

    我不知道现在回答是否晚了,但是今天我遇到了同样的问题,在阅读了 ldaptive 项目源后,我找到了答案:

    只需将 p:failFastInitialize="false" 参数添加到您的 connectionPool bean 中,就像

    <bean id="connectionPool"
          class="org.ldaptive.pool.BlockingConnectionPool"
          init-method="initialize"
          p:poolConfig-ref="ldapPoolConfig"
          p:blockWaitTime="${ldap.pool.blockWaitTime}"
          p:validator-ref="searchValidator"
          p:pruneStrategy-ref="pruneStrategy"
          p:connectionFactory-ref="connectionFactory" p:failFastInitialize="false" />
    

    【讨论】:

      【解决方案2】:

      终于找到解决办法了!下面列出了帮助您通过 CAS 服务器 4 连接到 AacheDS 的步骤。

      1. 下载 cas-server-4.0.0-release.zip
      2. 下载 Tomcat 8 并运行它
      3. 解压 cas-server-4.0.0-release.zip 并将 cas-server-webapp-4.0.0.war 复制到您的 tomcat 的 apache-tomcat-8.0.8\webapps 中。等到 Tomcat 解压 War 文件并制作 cas-server-webapp-4.0.0
      4. 停止 Tomcat 服务器
      5. 转到 Tomcat 的 conf 文件夹并编辑 server.xml 文件。您应该取消注释此文件的 HTTPS 部分。

        <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" 
               keystoreFile="C:/Program Files/Java/jdk1.7.0_60/jre/lib/security/cacerts" 
               keystorePass="changeit"             
               />
        
      6. 如您所见,应该将HTTPS Tomcat的认证添加到cacerts文件中。您可以查看以下链接来执行此操作: A Simple Step-By-Step Guide To Apache Tomcat SSL Configuration

      7. 转到 apache-tomcat-8.0.8\webapps\cas-server-webapp-4.0.0\WEB-INF 并将 deployerConfigContext.xml 内容替换为以下内容: Go to my Blog to copy the content of file

      1. 转到 apache-tomcat-8.0.8\webapps\cas-server-webapp-4.0.0\META-INF\maven\org.jasig.cas\cas-server-webapp 并将以下内容添加到 pom .xml:

      1. 将以下jar文件添加到apache-tomcat-8.0.8\webapps\cas-server-webapp-4.0.0\WEB-INF\lib

        • cas-server-support-ldap-4.0.0.jar
        • spring-ldap-core-2.0.2.RELEASE.jar
        • spring-ldap-1.2.1.jar
        • ldaptive-1.0.5.jar
      2. 运行 ApacheDS

      3. 使用 Apache Directory Studio 连接到您的 ApacheDS 并在 dc=example,dc=com 中创建一个用户

      4. 启动 Tomcat

      5. 转到http://localhost:8080/cas-server-webapp-4.0.0/login

      6. 键入您在 Apache Directory Studio 中创建的用户名和密码。您现在可以使用 ldap 用户登录 CAS!

      【讨论】:

      • 我觉得这个解决方案有些问题!我不能删除它!对不起!
      【解决方案3】:

      我在上面成功使用了 Moghadam 的解决方案,但是我不得不在 deployerConfigContext.xml 中进行一些小调整:

      <bean id="ldapAuthenticationHandler" class="org.jasig.cas.authentication.LdapAuthenticationHandler" >
          <constructor-arg ref="authenticator" />
          <property name="principalAttributeMap">
              <map>
                  <entry key="mail" value="mail" />
                  <entry key="cn" value="cn" />
              </map>
          </property>
      </bean>
      

      请注意我删除了 p:principalIdAttribute="uid" 属性。

      【讨论】:

        猜你喜欢
        • 2020-02-15
        • 1970-01-01
        • 2018-05-27
        • 2014-01-22
        • 2013-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多