基於CAS實現單點登錄(SSO):CAS+LDAP實現單點登錄認證


[一]、概述

CAS是N個系統的中心認證入口,而貫穿多個系統的用戶信息是共用的,應該被單獨維護,而這些信息可能屬於不用的系統,不用的組織,不用的國家,從而形成了樹形結構,而使用關係型數據庫維護樹形結構信息是它的弱點,這就是本文CAS和LDAP整合的初衷。

本來主要詳細是介紹CAS和LDAP整合實現單點登錄的步驟。

[二]、詳細步驟

1、LDAP安裝配置 

詳見:

介紹openLDAP在windows上的安裝配置

安裝配置,添加部分測試數據如下:


 

 2CAS的基礎安裝配置:

       見SSOCAS單點登錄實例演示

 

 3CAS整合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>跟節點下增加beanContextSource 的配置:

<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>跟節點下增加beanContextSource 的配置:

<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  則登錄失敗

此時的認證效果和第一種的認證效果是一樣的。

有關連接池的配置可以參見官網介紹:https://wiki.jasig.org/display/CASUM/LDAP

小結

CAS和LDAP,主要應用在系統整合情景中,CAS做多個系統的統一認證入口,只需要登錄一次便訪問多個系統。
而LDAP用來存儲多個系統通用的信息,比如用戶信息、用戶權限信息,這些信息具有通用和簡單(字符串爲主)、更改性小的特點,又因爲他們屬於不同的組織,不同的系統,也就構成了樹形的結構,形成了目錄,這樣的話,在匹配用戶名和密碼時,就可以做到高效的檢索。

源碼下載 猛擊
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章