1. 程式人生 > >Spring Security 3和CAS 3.5.2整合的完整例項

Spring Security 3和CAS 3.5.2整合的完整例項

摘要 使用Spring Security 3與CAS 3.5.2整合,完成單點登入與單點登出。並使用Apache httpd做逆向代理。本實驗可以按照其中的步驟,一步一步的搭建一個稍微複雜的多網站整合系統。只要按照步驟走了,一定能跑起來。

回顧

在上一篇文章,利用Spring Security 3.2的remember-me搭建SSO,我做了一個簡單的單點登入。但其畢竟不夠健壯,比如無法點單登出,也無法與非Spring Security的應用整合。今天,我將使用CAS重新搭建SSO。 

本實驗架構圖

以下是本實驗要搭建的服務的架構圖,兩個web應用網站和一個認證中心。三個網站均隱藏在Apache reverse proxy身後。

本實驗使用的軟體:

  1. Spring Security 3.2

  2. CAS 3.5.2

  3. Apache Httpd 2.2

  4. Tomcat 8

  5. OpenLdap 2.4

  6. OpenSSL

CAS原理

這不是本文的重點。但如果不提一下,後面的實驗則可能會比較困難。我在網上找了張別人畫的圖,清晰的解釋了CAS是如何工作的。

簡單的講,CAS client將使用者轉向CAS server,使用者在CAS server上登陸,產生了ticket。CAS server將使用者轉回CAS client頁面,帶著ticket引數。 CAS client悄悄的使用httpClient向CAS server索取使用者全部資訊,憑證就是ticket。CAS server將使用者資訊返回給CAS client,client對使用者進行檢驗並重定向到原始請求的頁面。

安裝配置CAS Server

CAS Server只是一個部署在伺服器上的java web應用,並且其使用的是Spring工具包,所以在配置CAS和LDAP上,跟Spring的ldap配置幾乎相同。我還是使用之前配好的OpenLDAP,見OpenLDAP搭建

CAS server的原始碼和安裝檔案都在一起,可以從http://www.jasig.org/cas/download下載。下載完以後,將裡面的maven專案全部匯入到eclipse中。建議使用Spring tool suite。Eclipse在匯入這些maven專案時,會有一些錯誤。怕麻煩的話,就用STS吧。

在專案cas-server-webapp下,編輯pom.xml,增加ldap的依賴:

?
1 2 3 4 5 <dependency> <groupId>org.jasig.cas</groupId> <artifactId>cas-server-support-ldap</artifactId> <version>${project.version}</version> </dependency>

然後開啟WEB-INF下的deployerConfigContext.xml,在最後面新增:

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 <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/dc=mycompany,dc=com" /> <property name="userDn" value="cn=admin,dc=mycompany,dc=com"/> <property name="password" value="admin"/> <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>

註釋掉SimpleTestUsernamePasswordAuthenticationHandler並加入新的程式碼:

?
1 2 3 4 5 6 <!--  <bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" /> --> <bean class="org.jasig.cas.adaptors.ldap.BindLdapAuthenticationHandler" p:filter="uid=%u" p:searchBase="ou=people" p:contextSource-ref="contextSource" />

另外需要註冊cas client,否則cas server則不信任client傳送的任何請求。在deployerConfigContext.xml找到serviceRegistryDao。本文使用最簡單的方式:

?
1 2 3 4 5 6 7 <bean class="org.jasig.cas.services.RegexRegisteredService"> <property name="id" value="0" /> <property name="name" value="HTTPS and IMAPS" /> <property name="description" value="Allows HTTPS and IMAPS protocols" /> <property name="serviceId" value="^(https?|imaps?)://.*" /> <property name="evaluationOrder" value="10000001" /> </bean>

maven install將cas-server-webapp構建成cas.war,然後部署在tomcat4上。啟動tomcat4,可以訪問http://localhost:8003/cas/login並嘗試用ldap使用者登入。

CAS Server開啟Https

儘管我的CAS server是隱藏在Apache代理的後面,CAS Server還是要求使用Https進行登入驗證。在文章Apache httpd開啟SSL中, 我曾經使用openSSL開啟了apache的HTTPS。由於CAS server隱藏在Apache之後,所以我對CAS server的SSL證書並不在乎其權威性,只需要使用本地keytool產生一個證書即可。步驟如下:

  1. 生成伺服器證書 keytool -genkey -alias casServer -keyalg RSA -keystore d:/servers/keys/casServerStore, 密碼為:wwwtestcom。

    特別注意:名字與姓氏一定要使用網站的域名,例如cas.test.com。Cas Client使用httpclient訪問cas server的時候,會嚴格的檢查證書。


  2. 匯出證書:keytool -export -file d:/servers/keys/casServer.crt -alias casServer -keystore d:/servers/keys/casServerStore, 匯出的證書需要匯入cas client jvm中。但本例我們將cas server隱藏在了apache proxy的後面了,所以並不需要匯入此證書。而我們需要向cas client中匯入的是apache proxy的SSL證書。

  3. 修改TOMCAT配置檔案:tomcat/conf/server.xml 

    首先關閉APR模式。 在APR模式下,SSL的配置引數跟非APR模式完全不一樣,詳細請參考tomcat手冊。

    ?
    1 2 3 <!--APR library loader. Documentation at /docs/apr.html <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" /> -->

    然後開啟tomcat的https connector.

    ?
    1 2 3 4 <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS"  keystoreFile="d:/servers/keys/casServerStore" keystorePass="wwwtestcom"/>

Apache代理CAS Server

為了節省IP,繼續使用之前firstWeb與secondWeb共用的apache。共用Apache的方法有一個缺陷,我後面會提到。

首先為我們新的auth.test.com產生新的SSL證書,請根據之前文章中列出的步驟做:OpenSSL生成證書步驟記住Common Name必須為auth.test.com. 我們將得到authServer.crt與authServer.key.

然後在httpd-ssl.conf中新增新的逆向代理,為了節省文字,不突破上限1萬字,我用圖片代替程式碼:

為CAS客戶端匯入SSL證書

CAS client是跑在tomcat上的一個servletFilter。CAS client使用HttpClient與CAS server打交道,因為中間存在著apache代理,所以HttpClient實際是與apache打交道。如果httpClient的環境不信任apache的SSL證書,就會產生SSLHandshakeException和SunCertPathBuilderException:

所以需要把apache的證書匯入到tomcat的jvm中。由於openssl產生的authServer.crt並不是x509證書,無法被匯入到java cacerts中。需要將authServer.crt轉為x509格式.

?
1 >openssl x509 -in authServer.crt -inform PEM -out authServer.der -outform DER

然後將authServer.der匯入java的cacerts中:

?
1 keytool -import -keystore %JAVA_HOME%/jre/lib/security/cacerts -file pathto/authServer.der -alias auth.test.com

注意,這裡有個bug。我匯入了證書以後,CASClient還是報SunCertPathBuilderException,我向JVM加啟動引數

-Djavax.net.debug=all

來除錯SSL握手過程。發現接受的證書並不是auth.test.com的,而是來自於httpd-ssl.conf中<VirtualHost _default_:443>定義中的證書。我猜想httpclient在進行SSL握手的時候,使用的是IP地址,所以轉向了_default_虛擬網站,並獲取了它的證書。為了解決此問題,我不得不把<VirtualHost _default_:443>中的證書指定與auth.test.com相同的證書。

開發CAS客戶端

FirstWeb與SecondWeb若想通過CAS伺服器來做登入驗證,需要與CAS的客戶端整合。CAS客戶端在java web上則是一個servlet filter。接下來配置firstWeb與secondWeb的CAS客戶端。

以下程式碼修改都是基於前一篇文章開啟Remember Me SSO之前的Firstweb與SecondWeb.這兩個的初始原始碼可以從下面地址下載:

我只展示如何修改secondWeb。步驟如下:

  1. 在pom.xml中宣告對CAS client的依賴:

    ?
    1 2 3 4 5 6 <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-cas</artifactId> <version>3.2.0.RELEASE</version> <scope>compile</scope> </dependency>
  2. 因為登陸頁面已經交給了CAS,所以刪除自己的login.jsp。但建立一個403.jsp,用於展示access dennied。

  3. 對Spring Security進行配置。由於之前我一直用的javaconfig。隨著複雜度的增加,javaconfig越來越麻煩,網上也沒教程。XML配置的教程到很多。但實在是不想修改了,於是繼續堅持使用javaconfig。以下是Spring的javaconfig:

    為了控制字數,我用截圖來展示程式碼和註釋。 原始碼可下載。


    之前的formLogin()和rememberMe()全部刪除了,因為這兩塊全部交給了CAS Server來做。

  4. 修改index.jsp中的logout URL 

    ?
    1 <a href="${pageContext.request.contextPath }/j_spring_cas_security_logout">logout</a>
  5. 為了能夠單點登出,除了在第3步中註冊的SingleSignOutFilter,(注意SingleSignOutFilter需要註冊在CsrfFilter之前,否則會被Csrf阻擋)。還需要在web.xml中新增下面一段程式碼。此外,還需要把https://second.test.com的SSL證書匯入到CAS伺服器的JVM中。原理在下面講。

    ?
    1 2 3 4 5 <listener> <listener-class> org.jasig.cas.client.session.SingleSignOutHttpSessionListener   </listener-class> </listener>
  6. 修改完畢,打包部署。

CAS單點登入的時序圖

為了更好的理解上面的程式碼,我將用時序圖來解釋,當未認證的使用者訪問受保護頁面的時候,程式碼都做了哪些工作。

CAS單點登出原理

CAS的單點登出是自動實現了。FirstWeb與SecondWeb使用同一個CAS登入。使用者在同一個瀏覽器中做了以下幾個操作:

  1. 登入FirstWeb, 轉向cas server登入頁面。登入以後,瀏覽器中存放有cas server的cookie.

  2. 登入SecondWeb,直接使用瀏覽器中的cas server cookie,自動登入了。

使用者在完成上面的操作時,cas server端自動的將來自firstWeb和secondWeb網站的service URL和它們共用的cas server cookie儲存起來了。

當用戶登出firstWeb的時候,會轉向cas的登出頁面,cas伺服器會根據firstWeb提交的cookie,而列出所有跟此cookie繫結在一起的service url. 然後cas伺服器會通過httpclient向所有的service url傳送下面的請求:

?
1 post SERVICE_URL?LogoutRequest=<samlp:LogoutRequest xmlns:samlp="urn:oasis:names:tc:SAML:2.0:protocol" ID="LR-29-s7cF2OLhk7I3fN03ifDMTMbQ4tPedaR0jTJ" Version="2.0" IssueInstant="2014-03-04T01:38:14Z"><saml:NameID xmlns:saml="urn:oasis:names:tc:SAML:2.0:assertion">@[email protected]</saml:NameID><samlp:SessionIndex>ST-28-ZvyU0hUzbMkzLiQqnkdY-cas.test.com</samlp:SessionIndex></samlp:LogoutRequest>

上面的請求會被SingleSignOutFilter所截獲。然後銷燬其session。

注意:既然是使用了httpclient傳送請求,如果service url使用的是https, 那需要把不信任的證書先匯入到伺服器執行環境中。

最後的原始碼以及WAR下載

有疑問可以跟我聯絡,[email protected], QQ14687489

改造架構

為了統一域名,減少SSL證書,讓所有的網站看起來像一個網站,請把上面的架構改造成如下:

  1. 使用同一個域名www.test.com.

  2. 對外使用https,對內全部使用ajp協議。

  3. Apache與cas server之間使用ajp聯絡。

以上是我在本地做的最後改動,步驟和程式碼就不上傳了,留給大家自己去嘗試吧。有問題可聯絡。

相關推薦

Spring Security 3CAS 3.5.2整合完整例項

摘要 使用Spring Security 3與CAS 3.5.2整合,完成單點登入與單點登出。並使用Apache httpd做逆向代理。本實驗可以按照其中的步驟,一步一步的搭建一個稍微複雜的多網站整合系統。只要按照步驟走了,一定能跑起來。 回顧 在上一篇文章,利用S

Angular 6整合Spring Boot 2,Spring Security,JWTCORS系列:二、Angualr專案連線heroapi專案的增刪改查介面

Angular官方樣例Tour of Heroes通過angular-in-memory-web-api來模擬實現遠端呼叫對hero進行增刪改查,本節對其修改呼叫上一節實現的介面。 二、下載Angular官方樣例程式碼 三、安裝依賴包,在專案所在資料夾的控制檯(或cm

(轉)allegro轉pads(使用allegro 16.3pads9.3.1)

load 條件 com 引號 command 虛擬 ase mil borde 原文網址:http://www.eechina.com/thread-86340-1-1.html 以16.3版本的abc.brd文件為例: 1、將<PADS install dir

Spring Security 集成 CAS(基於HTTP協議版本)

可能 key 1.3 remove gin repo produce writing monit Spring Security 集成 CAS(基於HTTP協議版本) 近段時間一直研究Spring Security 集成 CAS,網上資料相關資料也很多,不過大都是基於Htt

Angular集成Spring Boot,Spring Security,JWTCORS

cli tput ces 編譯 pre ini pes 集成 dep 本文介紹了Spring Boot的基本配置,Angular集成Spring Boot、Spring Security的方法。當前流行的JWT更適合與Angular集成,優於Spring Secuity提供

5章:作為Web應用:屬性監聽者/5.2 Servlet監聽器

監聽器介面彙總 上下文相關 初始化完成或者銷燬監聽器:ServletContextListener 新增、刪除或者替換一個屬性監聽器:ServletContextAttributeListener(屬性相關) 會話有關:

朱曄你聊Spring系列S1E10:強大且複雜的Spring Security(含OAuth2三角色+三模式完整例子)

Spring Security功能多,元件抽象程度高,配置方式多樣,導致了Spring Security強大且複雜的特性。Spring Security的學習成本幾乎是Spring家族中最高的,Spring Security的精良設計值得我們學習,但是結合實際複雜的業務場景,我們不但需要理解Spring Se

itext-2.1.7.jaritextasian-1.5.2.jar 在 maven 專案依賴不上。問題解決。

問題描述:java 匯出 PDF 檔案 遇到報錯 Exception in thread "main" com.lowagie.text.DocumentException: Font 'STSong-Light' with 'UniGB-UCS2-H' is not recognized

3篇 RabbitMQ的5種模式與例項

3.1 簡單模式Hello World 功能:一個生產者P傳送訊息到佇列Q,一個消費者C接收 生產者實現思路: 建立連線工廠ConnectionFactory,設定服務地址127.0.0.1,埠號5672,設定使用者名稱、密碼、virtual host,從連線工廠中獲取連

Spring Security 4.0 CAS實現單點登入

1、各framework版本資訊       JDK 8       Tomcat 7       SpringMVC-4.2.0.RELEASE       Spring Security 4.2.0.RELEASE       CAS-Client 3.3.3       CAS-Serv

jwt,spring security ,feign,zuul,eureka 前後端分離 整合 實現 簡單 許可權管理系統 與 使用者認證的實現

本例子 包含有 一下模組:  eureka 模組,充當 註冊中心角色 user-service-api 客戶端介面和實體 user-service-provider 客戶端服務提供者 user-conusmer 客戶端消費者 zuul 模組為閘道器,用來實現統一路由

elasticsearch+logstash+kibana5.5.2整合searchguard實現使用者許可權管理(一)

本文不講elk的安裝,只說如何在現有elk環境下新增searchguard功能。 bin/elasticsearch-plugin install -b com.floragunn:search-guard-5:5.5.2-16 線上安裝可能不成功,可以

elasticsearch+logstash+kibana5.5.2整合searchguard實現使用者許可權管理(二)

上一篇我們完成了elk整合sg的配置,但是,我們的logstash只能使用一臺es,這是遠遠不夠的,我們要重新制作自己的授信檔案,幸運的是官網給出了一個工具,並且還給出了一個線上製作的網站,支援10個es節點,這裡我們使用線上製作 url: https://f

Spring Security入門(2-3)HttpSecurity的使用

登錄 一個 最終 指定 ebs row pat ati 是我 到目前為止我們的 SecurityConfig 只包含了關於如何驗證我們的用戶的信息。 Spring Security怎麽知道我們想對所有的用戶進行驗證?Spring Security怎麽知道我們需要支持基於表單

用forwhile循環求e的值[e=1+1/1!+1/2!+1/3!+1/4!+1/5!+...+1/n!]

主函數 int class urn log emp art print tracking /*編敲代碼,依據下面公式求e的值。要求用兩種方法計算: 1)for循環。計算前50項 2)while循環,直至最後一項的值小於10-4 e=1+1/1!+1/2!+1/

Qt5.5.1Qt5.3.2編譯OCI驅動教程及驗證方法

oracle下載 電腦 博客 size 版權 ring nbsp scott 所有 我們都知道oracle數據庫的強大,並且好多企業或者教學用到數據庫時都會推薦使用。但是Qt因為版權問題沒有封裝oracle數據庫專用驅動,網上也有一大堆說法和教程,但是或多或少的都有問題。下

5.1 vim介紹 5.2 vim顏色顯示移動光標 5.3 vim一般模式下移動光標 5.4 vim一般模式下復制、剪切粘貼

介紹 vim 顏色顯示 5.1 vim介紹5.2 vim顏色顯示和移動光標5.3 vim一般模式下移動光標5.4 vim一般模式下復制、剪切和粘貼5.1 vim介紹vim 是 vi的一個升級版本vim 是帶有顏色顯示的再試下vim 命令[[email protected]/* */ ~

Spring4 In Action-5.2.3-Spring Web應用程序-向頁面輸出列表、接收參數、接收表單

pla data prot template ack bin 通過 final span 源代碼鏈接:http://download.csdn.net/download/poiuy1991719/10117665 本代碼是基於數據庫表的操作,所以請先建立數據庫表 1

5.1 vim介紹 5.2 vim顏色顯示移動光標 5.3 vim一般模式下移動光標 5.4 vi

vim5.1 vim介紹vim介紹按 i 鍵進入編輯模式5.2 vim顏色顯示和移動光標vim顏色顯示和移動vim編輯:gg:移動到最上面一行shift+O:光標在最上面一行的上面,相當於插入顯示顏色5.3 vim一般模式下移動光標5.4 vim一般模式下復制、剪切和粘貼5.1 vim介紹 5.2 vim顏色

四周第二次課(1月3日) 5.1 vim介紹 5.2 vim顏色顯示移動光標 5.3 vim一般模式下移動光標 5.4 vim一般模式下復制、剪切粘貼

技術 完成 1.0 正在 tin carp 3.4 style ransac 四周第二次課(1月3日)5.1 vim介紹5.2 vim顏色顯示和移動光標5.3 vim一般模式下移動光標5.4 vim一般模式下復制、剪切和粘貼 [root@localhost ~]# [r