【Tech】單點登陸系統CAS服務器端搭建及實現用戶名密碼由MYSQL數據庫驗證

CAS是YALE大學發起的一個開源項目,旨在爲web應用系統提供一種可靠的單點登陸方法。它主要分爲client和server端,server端負責對用戶的認證工做,client端負責處理對客戶端受保護的資源的訪問請求,CAS的原理以下圖所示:php

上述的6個步驟解釋以下:html

1.用戶經過browser請求cas client A端的資源。java

2.client A端發現用戶未登陸(client沒有收到ST),redirect到cas server,而且把用戶請求服務的url發送給server;server發現用戶瀏覽器中沒有TGC(Ticket Granting Cookie),就跳轉到登陸頁面。mysql

3.用戶在登陸頁面登陸並登陸成功。web

4.server在用戶的瀏覽器中設置一個TGC(Ticket Granting Cookie),而且在server端保存一個TGT(Ticket Granting Tciket),而後把用戶重定向到{client A網址+ST(Service Ticket)},其中ST是由TGT生成的。spring

5.client A端經過GET的方法收到ST,向server端驗證這個ticket的有效性,這一步主要是爲了防止惡意用{client網址+杜撰的ST}來訪問client A,因此雖然ST是server發送給client A的,client A仍然須要向server驗證其有效性。sql

6.ticket有效,server端返回ticket對應的用戶的用戶名,client A端爲用戶提供請求的服務。數據庫

上述是未登陸的用戶訪問client A的過程,用戶經過以上步驟已經登陸了CAS系統,此時他訪問CAS系統中信任的client B端,是不用登陸的,實現步驟以下:
1.1.用戶經過browser請求cas client B端的資源。apache

2.client B端發現沒有收到ST,redirect到cas server,而且把用戶請求服務的url發送給server;server發現用戶瀏覽器中有TGC(Ticket Granting Cookie),驗證該TGC後,用server端存儲的TGT生成一個ST。瀏覽器

3.server把用戶重定向到{client B網址+ST(Service Ticket)}。

4.client B端經過GET的方法收到ST,向server端驗證這個ticket的有效性.

5.ticket有效,server端返回ticket對應的用戶的用戶名,client B端爲用戶提供請求的服務,這樣用戶就不用再次登陸就能夠訪問到client B了。

因此從上述過程當中,能夠看到client端既不能接觸到用戶的用戶名密碼,也不能接觸到用戶的憑證TGT或者TGC,它只作兩件事情:若是用戶的請求裏有ST,那麼就向服務器驗證ST的有效性;若是用戶的請求裏沒有ST,那麼就把用戶重定向到cas server;

cas server全權負責管理用戶的用戶名和密碼,若是發現用戶的瀏覽器裏面有有效的TGC,就生成ST把用戶重定向到client端;若是用戶瀏覽器裏面沒有TGC或者TGC無效,就讓用戶從新登陸,而後在用戶的瀏覽器裏面設置新的TGC。而server和用戶瀏覽器之間的交互是https安全協議,這樣就保證了用戶的用戶名密碼的安全性。

本文記錄server端的搭建過程。

1.安裝JDK

2.搭建TOMCAT:

   下載tomcat7.0

   雙擊%TOMCAT_PATH%/bin/startup.bat啓動tomcat

   瀏覽器打開http://localhost:8080,若顯示以下界面,則配置成功:

3.配置tomcat使用https協議

  (1)生成安全證書

        cd到%JAVA_HOME%/bin/目錄下,執行一下命令

keytool -genkeypair -alias "tomcat" -keyalg "RSA" -keystore "g:\tomcat.keystore"

  其中"g:\tomcat.keystore"是保存生成證書的路徑和名稱。

  在接下來的操做中,要注意的是「您的名字和姓氏是什麼?」這裏要回答域名,好比我是在本機搭建tomcat,因此回答localhost,以下圖所示:

  其餘的隨便填就行了,密碼固然要記住,我這裏用的是"tomcat"做爲密碼,後面配置的時候要用到的。

  上述命令執行完後就能夠在g:\下看到證書tomcat.keystore了。

    (2)配置tomcat

    在%TOMCAT_PATH%/conf下找到server.xml文件,定位到下面的代碼上:

<!--
    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" />
    -->

    去掉註釋,而後把它修改爲下面的代碼:

 <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
               maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
               keystoreFile="G:\tomcat.keystore"
               keystorePass="tomcat"
               clientAuth="false" sslProtocol="TLS" />

各項的含義見下表:

而後在瀏覽器裏面打開https://localhost:8443,出現以下界面就說明配置tomcat使用https成功了:

4.配置CAS Server

CAS主頁上下載cas server,我這裏下載的並非最新版,是cas-server-3.5.2-release.zip;而後解壓,到\cas-server-3.5.2\modules目錄下找到cas-server-webapp-3.5.2.war,把它拷貝到\apache-tomcat-7.0.56\webapps下而且重命名爲cas.war,重啓tomcat(雙擊\apache-tomcat-7.0.56\bin\startup.bat),用瀏覽器打開https://localhost:8443/cas/login,若是出現一下界面則說明CAS Server配置成功:

 5.與MYSQL鏈接

目前配置好的CAS的用戶名和密碼驗證十分簡單,既只要用戶名和密碼相同就能夠登陸了。但在實際應用中咱們的用戶名密碼經常是保存在數據庫裏面的,因此咱們但願實現從數據庫裏面驗證用戶名和密碼。操做步驟以下:

(1)用phpMyAdmin在MYSQL中建立用戶名密碼的表,這裏新建一個數據庫casuserdatabase,建立一張表app_user來存放用戶名密碼信息,而後插入兩條測試用的用戶名密碼,sql語句以下;

CREATE DATABASE casuserdatabase;
USE casuserdatabase;
CREATE TABLE app_user (username varchar(30), password varchar(45) , primary key (username));
INSERT INTO app_user (username,password) values ('test01','psw01');
INSERT INTO app_user (username,password) values('test02','psw02');
 

(2)到這裏下載mysql-connector-java-5.1.22,其餘版本的我沒有嘗試過,不知道可不能夠。解壓,咱們只須要文件夾裏面的mysql-connector-java-5.1.22-bin.jar包。

到cas-server-3.5.2\modules\目錄下找到cas-server-support-jdbc-3.5.2.jar。

把上述兩個包拷貝到apache-tomcat-7.0.56\webapps\cas\WEB-INF\lib\目錄下。

(3)配置apache-tomcat-7.0.56\webapps\cas\WEB-INF\目錄下的deployerConfigContext.xml文件:

首先增長一個datasource,經過增長一下的代碼實現:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost/casuserdatabase"/>
        <property name="username" value="sunshineatnoon"/>
        <property name="password" value="49531218"/>
    </bean>

而後改變認證方式,定位到以下代碼:

<bean                     
class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />

把它註釋掉,換成:

<bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">  
                        <property name="dataSource" ref="dataSource" />  
                        <property name="sql" value="select password from app_user where userName=?" /> 
                </bean> 

其中<property name="sql" value="select password from app_user where userName=?" /> 中app_user是我存放用戶名和密碼的表,須要根據實際狀況而定。

注意這裏datasource放在註釋掉的那行代碼所在的</list>外面,大概相對位置見下面的代碼,不然會報錯:

                <!--bean
                    class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" /-->
                <bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler">  
                    <property name="dataSource" ref="dataSource" />  
                    <property name="sql" value="select password from app_user where userName=?" /> 
                </bean> 
            </list>
        </property>
    </bean>

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost/casuserdatabase"/>
        <property name="username" value="sunshineatnoon"/>
        <property name="password" value="49531218"/>
    </bean>

 

(4)重啓tomcat,再次到登陸頁面https://localhost:8443/cas/login上,就能夠用數據庫中的用戶名和密碼登陸了,好比這裏用上面設置的"test01","psw01"登陸:

到這裏還有個bug就是登陸的時候老是會清空一次登陸框,第二次才能登上去,研究下這個bug怎麼解決再說。

還有一個是目前我還不知道怎麼登出,因而就用最笨的方法,把瀏覽器的cookie刪掉,刷新登陸頁面,就算登出啦。

 

參考資料

[1]配置tomcat使用https:http://ln-ydc.iteye.com/blog/1330674

[2]與mysql鏈接配置:http://blog.sina.com.cn/s/blog_3fc815b30100ihtr.html

[3]mysql-connector-java-5.1.22下載:http://6881116.blog.51cto.com/6871116/1190148

相關文章
相關標籤/搜索