CAS结合openldap


CAS与openldap的结合

openldap通常会在企业中用来进行用户验证,具体关于openldap的介绍,请看相应的openldap系列的文章,这篇文章只会介绍如何将cas-server4.0版本与openldap结合起来,即让openldap来充当登陆验证的工具。

0.修改配置

想要cas和openldap结合,只需要修改配置即可,当然前提是你已经有了相应的openldap服务器。

在网上对cas与openldap结合的文章很少,有的也是对cas-4.0以前的版本cas-3.x版本与openldap的结合。

所以对于cas-server-4.0与openldap的结合,虽然并不复杂,但是还是值得记下来的。

依旧是修改WEB-INF/deployerConfigContext.xml

  • 找到id为authenticationManager的bean,加入ldap验证入口,初始配置如下
  <bean id="authenticationManager" class="org.jasig.cas.authentication.PolicyBasedAuthenticationManager">
        <constructor-arg>
            <map>

                <entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" />

                                <entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" />


            </map>
        </constructor-arg>
     <property name="authenticationPolicy">
            <bean class="org.jasig.cas.authentication.AnyAuthenticationPolicy" />
        </property>
    </bean>

这里构造方法是由一个Map结构配置,就是配置登陆验证的形式,包括对于密码的配置等。

其中的primaryAuthenticationHandler这个key对应着就是我们之前讲过的cas-server-4.0之后,不再是用户名和密码相同即可登陆,而是设置了默认用户名密码,这个默认的用户名密码就是用primaryAuthenticationHandler配置的。

    <bean id="primaryAuthenticationHandler"
          class="org.jasig.cas.authentication.AcceptUsersAuthenticationHandler">
        <property name="users">
            <map>
                <entry key="casuser" value="Mellon"/>
            </map>
        </property>
    </bean>

所以,如果我们还是想用单纯的用户名密码验证,可以在这里添加值,但是这样无疑显得过于笨拙。

那么我们如果要想添加ldap的验证方式,那么毫无疑问我们要在authenticationManager中的构造方法中注册ldap验证形式。

 <bean id="authenticationManager" class="org.jasig.cas.authentication.PolicyBasedAuthenticationManager">
        <constructor-arg>
            <map>
                <!--
                   | IMPORTANT
                   | Every handler requires a unique name.
                   | If more than one instance of the same handler class is configured, you must explicitly
                   | set its name to something other than its default name (typically the simple class name).
                   -->
                <entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" />
                <!-- 注释掉默认用户名密码方式
                                <entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" />


                 -->
                <!--新增ldap认证的入口 -->
                <entry key-ref="ldapAuthenticationHandler" value-ref="proxyPrincipalResolver"/> 
            </map>
        </constructor-arg>
   <property name="authenticationPolicy">
            <bean class="org.jasig.cas.authentication.AnyAuthenticationPolicy" />
        </property>
    </bean>
  • 完善ldap验证入口的相关必要配置。

    <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="uid" value="uid" />  
                  <entry key="mail" value="mail" />  
              </map>  
          </property>  
      </bean>  
    
     <bean id="authenticator" class="org.ldaptive.auth.Authenticator"  
            c:resolver-ref="dnResolver"  
            c:handler-ref="authHandler" />  
    <!-- 配置baseDn  以及指定属性uid-->
      <bean id="dnResolver" class="org.ldaptive.auth.PooledSearchDnResolver"  
           p:baseDn="dc=ulic,dc=com,dc=cn"
            p:allowMultipleDns="false"  
            p:subtreeSearch="true"  
            p:connectionFactory-ref="searchPooledLdapConnectionFactory"  
          p:userFilter="uid={user}" />
    
      <bean id="searchPooledLdapConnectionFactory"  
            class="org.ldaptive.pool.PooledConnectionFactory"  
            p:connectionPool-ref="searchConnectionPool" />  
    
      <bean id="searchConnectionPool" parent="abstractConnectionPool"  
            p:connectionFactory-ref="searchConnectionFactory" />  
    
      <bean id="searchConnectionFactory"  
            class="org.ldaptive.DefaultConnectionFactory"  
            p:connectionConfig-ref="searchConnectionConfig" />  
    
      <bean id="searchConnectionConfig" parent="abstractConnectionConfig"  
            p:connectionInitializer-ref="bindConnectionInitializer" />  
    <!--配置userDn和密码 -->
      <bean id="bindConnectionInitializer"  
            class="org.ldaptive.BindConnectionInitializer"  
            p:bindDn="cn=Manager,dc=ulic,dc=com,dc=cn"> 
          <property name="bindCredential">  
              <bean class="org.ldaptive.Credential"  
                  c:password="redhat" />
          </property>  
      </bean>  
    
      <bean id="abstractConnectionPool" abstract="true"  
            class="org.ldaptive.pool.BlockingConnectionPool"  
            init-method="initialize"  
            p:poolConfig-ref="ldapPoolConfig"  
            p:blockWaitTime="3000"  
            p:validator-ref="searchValidator"  
            p:pruneStrategy-ref="pruneStrategy" />  
      <!--  不使用https p:useSSL="false"  使用https  p:sslConfig-ref="sslConfig" -->
    <!--配置连接地址等与链接相关的信息-->
      <bean id="abstractConnectionConfig" abstract="true"  
            class="org.ldaptive.ConnectionConfig"  
          p:ldapUrl="ldap://10.18.8.66:389"  
            p:useStartTLS="false" 
            p:useSSL="false" 
            />  
      <bean id="ldapPoolConfig" class="org.ldaptive.pool.PoolConfig"  
            p:minPoolSize="300"  
            p:maxPoolSize="600"  
            p:validateOnCheckOut="false"    
            p:validatePeriodically="true"    
            p:validatePeriod="300" />  
    <!--   支持http ssl时使用
      <bean id="sslConfig" class="org.ldaptive.ssl.SslConfig">  
          <property name="credentialConfig">  
              <bean class="org.ldaptive.ssl.X509CredentialConfig"  
              p:trustCertificates="file:/E:/sso/wzyb.crt" /> 
          </property>  
      </bean>  
    -->
      <bean id="pruneStrategy" class="org.ldaptive.pool.IdlePruneStrategy"  
            p:prunePeriod="300"  
            p:idleTime="600" />  
    
      <bean id="searchValidator" class="org.ldaptive.pool.SearchValidator" />  
    
      <bean id="authHandler" class="org.ldaptive.auth.PooledBindAuthenticationHandler"  
            p:connectionFactory-ref="bindPooledLdapConnectionFactory" />  
    
      <bean id="bindPooledLdapConnectionFactory"  
            class="org.ldaptive.pool.PooledConnectionFactory"  
            p:connectionPool-ref="bindConnectionPool" />  
    
      <bean id="bindConnectionPool" parent="abstractConnectionPool"  
            p:connectionFactory-ref="bindConnectionFactory" />  
    
      <bean id="bindConnectionFactory"  
            class="org.ldaptive.DefaultConnectionFactory"  
            p:connectionConfig-ref="bindConnectionConfig" />  
    
      <bean id="bindConnectionConfig" parent="abstractConnectionConfig" />  
    

我们这里没有配置https,用的是简单的http方式访问,所以相关的https的配置注释掉了。

这里还有一点需要注意,如果我们在abstractConnectionConfig这个bean的配置中配置了如下属性:

​ p:connectTimeout=”3000”

配置了超时时间的话,程序依旧可以稳定运行,但是到了设置时间后,后台日志就会疯狂报错,一直报错,

LDAP response read timed out, timeout used:3000ms

但是丝毫不影响程序的运行,登陆还是可以登陆的。为了解决这个问题,我也是试了好久,因为网上是真的没有相关资料呀。给我气的,后来发现,我只需要注释掉这个配置就不会报错了,而且程序还是会稳定运行,至少到现在为止还没发现有任何的异常。

对于具体的配置目前还没有研究,先用这把,后续如果要加新的功能,那么肯定是需要深入研究配置的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值