基於CAS實現單點登入(SSO):CAS+LDAP實現單點登入認證
[一]、概述
CAS是N個系統的中心認證入口,而貫穿多個系統的使用者資訊是共用的,應該被單獨維護,而這些資訊可能屬於不用的系統,不用的組織,不用的國家,從而形成了樹形結構,而使用關係型資料庫維護樹形結構資訊是它的弱點,這就是本文CAS和LDAP整合的初衷。本來主要詳細是介紹CAS和LDAP整合實現單點登入的步驟。
[二]、詳細步驟
1、LDAP安裝配置
詳見:
安裝配置,新增部分測試資料如下:
2、CAS的基礎安裝配置:
3、CAS整合LDAP的配置
如果是Mave構建專案的,新增LDAP的相關依賴:
<dependency> <groupId>org.jasig.cas</groupId> <artifactId>cas-server-support-ldap</artifactId> <version>${cas.version}</version> </dependency> <!--僅僅在使用到連線池時新增該依賴 <dependency> <groupId>commons-pool</groupId> <artifactId>commons-pool</artifactId> <version>${apache.commons.pool.version}</version> </dependency> -->
如果不是maven專案,需要cas-server-support-ldap-3.4.11.jar(官網下載的釋出包cas-server-3.5.2-release.zip的 modules下)和spring-ldap-core-1.3.1.RELEASE.jar
LDAP認證配置有兩種:
[第一種]、FastBindLdapAuthenticationHandler
這種認證處理器一般用於DN是由使用者名稱直接組成的,比如:uid=%u,ou=dev,dc=micmiu.com,dc=com ,其中 %u 就是CAS登入的使用者名稱。
修改web的配置檔案 WEB-INF\deployerConfigContext.xml
首先在<beans>跟節點下增加bean:ContextSource 的配置:
<bean id="contextSource" class="org.springframework.ldap.core.support.LdapContextSource"> <property name="pooled" value="false"/> <property name="url" value="ldap://127.0.0.1:389" /> <property name="userDn" value="cn=Manager"/> <property name="password" value="secret"/> <property name="baseEnvironmentProperties"> <map> <entry key="com.sun.jndi.ldap.connect.timeout" value="3000" /> <entry key="com.sun.jndi.ldap.read.timeout" value="3000" /> <entry key="java.naming.security.authentication" value="simple" /> </map> </property> </bean>
ContextSource 的配置說明:
- 如果有多個LDAP伺服器,可以通過引數urls 配置多個
- FastBindLdapAuthenticationHandler配置時,這裡的userDn 可以配置成 “cn=Manager,ou=dev,dc=micmiu,dc=com” 或 “cn=Manager,ou=dev” 或 “cn=Manager” 或 “Manager” 這四個都可以
- 如果LDAP伺服器有SSL,注意url配置的字首是ldaps:”ldaps://192.168.8.150:636″
在<bean id=”authenticationManager” />下找到SimpleTestUsernamePasswordAuthenticationHandler的配置,修改成如下:
<bean class="org.jasig.cas.adaptors.ldap.FastBindLdapAuthenticationHandler">
<property name="filter" value="uid=%u,ou=Developer,dc=micmiu,dc=com" />
<property name="contextSource" ref="contextSource" />
</bean>
配置好後分別啟動三個應用:tomcat-cas、tomcat-app1、tomcat-app2,進行認證測試:
- 輸入Michael/111111 可以成功登入,
- 輸入Miumiu/111111 則登入失敗。
[第二種]、BindLdapAuthenticationHandler
這種認證處理器一般用於需要驗證的使用者名稱是DN的其他的屬性比如email,而不是上面第一種處理器中的uid(當然uid屬性同樣適用,下面我們配置的示例是用mail)。
修改web的配置檔案 WEB-INF\deployerConfigContext.xml:
同樣在<beans>跟節點下增加bean:ContextSource 的配置:
<bean id="contextSource" class="org.springframework.ldap.core.support.LdapContextSource">
<property name="anonymousReadOnly" value="false" />
<property name="password" value="secret" />
<property name="pooled" value="true" />
<property name="urls">
<list>
<value>ldap://127.0.0.1:389</value>
</list>
</property>
<property name="userDn" value="cn=Manager,dc=micmiu,dc=com" />
<property name="baseEnvironmentProperties">
<map>
<!-- LDAP SSL訪問配置
<entry key="java.naming.security.protocol" value="ssl" />
-->
<entry key="java.naming.security.authentication" value="simple" />
</map>
</property>
</bean>
在<bean id=”authenticationManager” />修改認證bean的配置,修改成如下:
<bean class="org.jasig.cas.adaptors.ldap.BindLdapAuthenticationHandler">
<property name="filter" value="mail=%u" />
<property name="searchBase" value="dc=micmiu,dc=com" />
<property name="contextSource" ref="contextSource" />
<!-- 允許多個賬號-->
<property name="allowMultipleAccounts" value="true" />
</bean>
配置好後分別啟動三個應用:tomcat-cas、tomcat-app1、tomcat-app2,進行認證測試:
- 輸入Michael/111111 可以成功登入,
- 輸入Miumiu/111111也可以成功登入。
如果把引數:searchBase的值修改為:”ou=Developer,dc=micmiu,dc=com”,重新啟動測試認證的結果如下:
- 輸入Michael/111111 可以成功登入,
- 輸入Miumiu/111111 則登入失敗。
此時的認證效果和第一種的認證效果是一樣的。