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
但是丝毫不影响程序的运行,登陆还是可以登陆的。为了解决这个问题,我也是试了好久,因为网上是真的没有相关资料呀。给我气的,后来发现,我只需要注释掉这个配置就不会报错了,而且程序还是会稳定运行,至少到现在为止还没发现有任何的异常。
对于具体的配置目前还没有研究,先用这把,后续如果要加新的功能,那么肯定是需要深入研究配置的。