关于cas的ldap认证,可以参看
http://blog.163.com/magicc_love/blog/static/18585366220132294648822/
这篇文章对于如何配置ldap已介绍的算是比较全面了.
后面我主要描述一下这两个的认证逻辑.
org.jasig.cas.adaptors.ldap.FastBindLdapAuthenticationHandler 认证逻辑是根据前台用户输入的
用户名与密码直接去查询是否有相应的用户存在,因为用户名/密码就是进入ldap服务器的通行证。所以在配置
ContextSource时可以不需要ldap服务器的管理员账号,但是它是每次认证都需要与ldap建立连接查询。
org.jasig.cas.adaptors.ldap.BindLdapAuthenticationHandler 它的认证逻辑是根据前台用户输入的用户名(不包含密码)为条件,在ldap服务器
查询这个用户名的相关信息,返回一个集合,然后解析这个集合,逐个比对相应的密码如何匹配则认证成功,否则认证失败。在这个过程中,对于ContextSource的配置是需要ldap服务器的管理员账号,以满足初始查询。它的连接方式类似于数据库连接池。FastBindLdapAuthenticationHandler与BindLdapAuthenticationHandler
相比在性能方面,后者更占优势。但是当你应用第三方公司搭建的ldap服务器,而你又无法获取ldap服务器管理员的密码时,则FastBindLdapAuthenticationHandler就该上场了。
为了更好的提高性能,我们也可以将contextSource进行池化,当然这个也只能在BindLdapAuthenticationHandler应用,配置如下:
<bean id="pooledContextSource" class="org.springframework.ldap.pool.factory.PoolingContextSource" p:minIdle="${ldap.pool.minIdle}" p:maxIdle="${ldap.pool.maxIdle}" p:maxActive="${ldap.pool.maxSize}" p:maxWait="${ldap.pool.maxWait}" p:timeBetweenEvictionRunsMillis="${ldap.pool.evictionPeriod}" p:minEvictableIdleTimeMillis="${ldap.pool.idleTime}" p:testOnBorrow="${ldap.pool.testOnBorrow}" p:testWhileIdle="${ldap.pool.testWhileIdle}" p:dirContextValidator-ref="dirContextValidator" p:contextSource-ref="contextSource" /> <bean id="dirContextValidator" class="org.springframework.ldap.pool.validation.DefaultDirContextValidator" p:base="" p:filter="objectclass=*"> <property name="searchControls"> <bean class="javax.naming.directory.SearchControls" p:timeLimit="1000" p:countLimit="1" p:searchScope="0" p:returningAttributes="" /> </property> </bean>
相应的参数内容:
ldap.pool.minIdle=3 ldap.pool.maxIdle=5 ldap.pool.maxSize=10 # Maximum time in ms to wait for connection to become available # under pool exhausted condition. ldap.pool.maxWait=10000 # == Evictor configuration == # Period in ms at which evictor process runs. ldap.pool.evictionPeriod=600000 # Maximum time in ms at which connections can remain idle before # they become liable to eviction. ldap.pool.idleTime=1200000 # == Connection testing settings == # Set to true to enable connection liveliness testing on evictor # process runs. Probably results in best performance. ldap.pool.testWhileIdle=true # Set to true to enable connection liveliness testing before every # request to borrow an object from the pool. ldap.pool.testOnBorrow=false
这两个认证都有一个共同之处即是当认证失败时,则直接抛出异常,而不会去认证下一个认证处理器,这样在应用时多加注意.
另外我在实际的应用中,出现了一点小状况,后来通过阅读相关的cas源码找到了答案。在搭建ldap服务器时如果只存储了用户的email信息,而没有用户信息,比如只能通过 zhangsan@163.com作为用户名进行认证而不能用zhangsan作为用户名进行认证。则前台用户需要输入zhangsan@163.com,密码,进行认证。但是为了提高用户体验,cas 在认证处理器中提供了进行用户名处理的属性
principalNameTransformer(默认是不进行处理,这个属性类似于密码加密passwordEncoder属性.),以及进行用户名的前缀,后缀处理类
org.jasig.cas.authentication.handler.PrefixSuffixPrincipalNameTransformer,它有两个属性prefix,suffix.比如上例我们就可以进行如下配置
<bean class="org.jasig.cas.adaptors.ldap.FastBindLdapAuthenticationHandler"> <property name="filter" value="%u"/> <property name="contextSource" ref="ldapContextSource"/> <property name="principalNameTransformer" ref="principalNameTransformer" /> </bean> <bean id="principalNameTransformer" class="org.jasig.cas.authentication.handler.PrefixSuffixPrincipalNameTransformer"> <property name="suffix" value="@163.com" /> </bean>
发表评论(对文章涉及的知识点还有疑问,可以在这里留言,老高看到后会及时回复的。)