技术分享 CAS单点登录 服务端配置 查看内容

cas 入门之十二:cas 认证处理器-LDAP

老高 | 发布于 2017-05-05 13:27| 浏览()| 评论() | 收藏() | 点赞() | 打印

关于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>


发表评论(对文章涉及的知识点还有疑问,可以在这里留言,老高看到后会及时回复的。)

表情