CAS單點登錄(二)——搭建基礎服務

前一篇文章中,我們對CAS及SSO(單點登錄)有了大致的瞭解,今天我們開始講解如何搭建一個簡單的CAS服務認證中心,如果你對CAS中單點登錄的概念忘記了,可以先去複習一下先前的文章——CAS單點登錄(一)——初識SSO,再開始接下來的內容。


一、搭建CAS基礎服務

1、準備

首先CAS官方文檔地址:https://apereo.github.io/cas/5.3.x/index.html,在後面我們可能隨時會用到。

然後我們從Geting Started開始,在文檔裏面告訴我們部署CAS,推薦我們使用WAR Overlay method的方法,利用覆蓋機制來組合CAS原始工件和本地自定義方法來達到自定義CAS的要求。

It is recommended to build and deploy CAS locally using the WAR Overlay method. 
This approach does not require the adopter to explicitly download any version of CAS, 
but rather utilizes the overlay mechanism to combine CAS original artifacts and local 
customizations to further ease future upgrades and maintenance.

官方給了兩種編譯方式,一種是Maven、另一種是Gradle,這裏使用Maven安裝部署。

在這裏插入圖片描述
具體的詳情可以參考:https://apereo.github.io/cas/5.3.x/installation/Maven-Overlay-Installation.html

在開始之前,我們需要配置好電腦環境,筆者當前的環境爲:

  • JDK 1.8
  • Maven 3.5.3
  • Tomcat 8.5(官方推薦Tomcat至少要8版本以上)

在這裏插入圖片描述

2、下載代碼打包

我們需要下載打包成WAR的代碼架子,地址爲: https://github.com/apereo/cas-overlay-template

這裏我們使用的CAS當前最新版本5.3.x,然後我們進入代碼根目錄下打開pom.xml文件,添加國內的maven鏡像源地址,加快下載包的速度,因爲CAS需要的包有點多,並且很大,如果爲原來的地址,速度非常慢。

     <repositories>
        <repository>
            <id>sonatype-releases</id>
            <url>http://oss.sonatype.org/content/repositories/releases/</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
            <releases>
                <enabled>true</enabled>
            </releases>
        </repository>
        <repository>
            <id>sonatype-snapshots</id>
            <url>https://oss.sonatype.org/content/repositories/snapshots/</url>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
            <releases>
                <enabled>false</enabled>
            </releases>
        </repository>
        <repository>
            <id>shibboleth-releases</id>
            <url>https://build.shibboleth.net/nexus/content/repositories/releases</url>
        </repository>

        <!--添加國內鏡像源地址-->
        <repository>
            <id>maven-ali</id>
            <url>http://maven.aliyun.com/nexus/content/groups/public//</url>
            <releases>
                <enabled>true</enabled>
            </releases>
            <snapshots>
                <enabled>true</enabled>
                <updatePolicy>always</updatePolicy>
                <checksumPolicy>fail</checksumPolicy>
            </snapshots>
        </repository>
    </repositories>

更改pom.xml文件後,我們到項目的跟目錄下,執行mvn clean package命令,接着就會去下載相應的jar包。

在這裏插入圖片描述

當執行完畢後,我們便可在項目根目錄下的target目錄下發現生成的cas.war包。然後我們將其放入Tomcat目錄下的webapps下面。接着在瀏覽器裏訪問http://localhost:8080/cas/login,可以發現CAS出現登錄界面。
在這裏插入圖片描述
默認賬號:casuser 默認密碼:Mellon 目前的配置僅有這一個用戶。輸入用戶名和密碼,登錄成功!

在這裏插入圖片描述
這樣我們就完成了CAS的登錄過程,基本的CAS服務搭建就實現了。

我們在登錄界面可以發現,彈出了兩個提示框,如下圖紅框所圈:

在這裏插入圖片描述
我們仔細閱讀可以發現,這裏主要說了:

  • 一、我們的登錄不是安全的,並沒有使用HTTPS協議,這裏我們使用了HTTP。
  • 二、提示我們這裏用戶驗證方式是靜態文件寫死的,指定就是我們的用戶名和密碼(casuser/Mellon),這個只適合demo使用。

接下來我們就主要圍繞這兩點來解決問題。

二、配置證書

1、生成證書

接下來我們便開始解決這兩個問題,首先是HTTPS,我們知道使用HTTPS是需要證書的,所以接下來我們便製作一個證書。

使用JDK自帶的工具keytool

keytool -genkey -alias caskeystore -keypass 123456 -keyalg RSA -keystore thekeystore

首先輸入密鑰庫口令,然後在輸入名字與姓氏時爲爲具體路由地址,就是待會CAS認證服務器的地址(這裏以sso.anumbrella.net爲例),而其餘的根據具體情況填寫即可,然後就會在當前目錄下生成證書。

在這裏插入圖片描述

2、導出數字證書

keytool -export -alias caskeystore -keystore thekeystore -rfc -file cas.crt

輸入先前的密鑰庫口令,然後在當前目錄下生成具體的cas.crt數字證書。
在這裏插入圖片描述

3、將數字證書導入jdk下的jre裏

windows:

keytool -import -alias caskeystore -keystore %JAVA_HOME%\jre\lib\security\cacerts -file cas.crt -trustcacerts -storepass changeit

Unix:

sudo keytool -import -alias caskeystore -keystore $JAVA_HOME/jre/lib/security/cacerts -file cas.crt -trustcacerts -storepass changeit

這裏導入JDK時需要默認密碼changeit,在命令中已經配置好了。如果沒有該密碼,則會報java.io.IOException: Keystore was tampered with, or password was incorrect錯誤。

在這裏插入圖片描述

4、配置DNS

這裏我的CAS服務端是部署在本地的,所以需要做一個本地映射。

我的系統爲Mac OS, 所以用管理員權限打開**/private/etc/hosts**文件

sudo vim /private/etc/hosts

添加映射地址:

127.0.0.1       sso.anumbrella.net

如果是Windows,則用管理員身份修改C:\Windows\System32\drivers\etc\hosts文件。

5、配置Tomcat

編輯Tomcat目錄Conf下的server.xml文件。

將8443的端口配置文件打開,配置如下(添加前面剛剛生成的keystore的地址和密匙):

    <Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
               maxThreads="150" SSLEnabled="true">
        <SSLHostConfig>
            <Certificate certificateKeystoreFile="/Users/anumbrella/keystore/thekeystore"
                         type="RSA" certificateKeystoreType="JKS" certificateKeystorePassword="123456"/>
        </SSLHostConfig>
    </Connector>

重啓Tomcat服務器,接着我們訪問https://sso.anumbrella.net:8443/cas/login,可以發現先前的情況一的提示沒有了。
在這裏插入圖片描述

三、 更改配置

我們知道cas-overlay-template是採用配置覆蓋的策略來進行自定義的,因此我們可以通過覆蓋或者繼承某些類重寫某些方法實現自定義的需求。將我們先前的cas.war解壓,或者直接去Tomcat下webapps目錄下面,打開WEB-INF目錄下的classes裏面的application.properties文件
在這裏插入圖片描述

可以看到該文件就是對CAS認證服務器的配置,我們現在要自定義,打開我們的項目,新建src/main/resources文件夾,同時將剛纔的application.properties文件複製到該目錄下。

在這裏插入圖片描述
現在我們就可以通過配置application.properties文件來實現對CAS服務器的自定義。

除了上面我們剛剛在Tomcat裏面配置證書,我們還可以直接將證書配置到CAS服務信息裏面,打開application.properties文件,我們可以發現在開頭有配置信息如下:

在這裏插入圖片描述

我們將信息更改如下:

#SSL配置
server.ssl.enabled=true
server.ssl.key-store=file:/etc/cas/thekeystore
server.ssl.key-store-password=123456
server.ssl.key-password=changeit
server.ssl.keyAlias=caskeystore

然後將剛纔上面生成的thekeystore放入到電腦目錄/etc/cas/目錄下面(這裏你需要指定爲自己具體的目錄)。

現在我們啓動項目就可以直接使用/etc/cas/下面的證書了。

除此之外,我們還可以將證書放在resources包下面,每次打包就可以直接使用該證書了。

server.ssl.key-store=classpath:thekeystore

注意:server.ssl.keyAlias是生成證書填寫的別名,不是隨便填寫的,可以通過keytool -list -keystore thekeystore命令查看。
在這裏插入圖片描述
這裏配置使用的是CAS自帶的Tomcat,所以我們需要通過命令啓動(與前面使用電腦自帶Tomcat不同)。

Windows:

運行命令:

build.cmd run

打包命令:

build.cmd package

Unix:

運行命令:

build.sh run

打包命令:

build.sh package

當然你還可以使用java -jar cas.war 直接運行已經打包好的cas.war來運行CAS。

在這裏插入圖片描述
接着我們在配置文件的最後我們發現了CAS的認證配置,這裏就是CAS默認用戶名和密碼配置的地方,我們現在對其進行更改。

在這裏插入圖片描述默認的認證方式爲靜態文件認證,現在我們更改爲JDBC認證方式,同時添加相關數據庫驅動。

    <dependencies>
        <!--新增支持jdbc驗證-->
        <dependency>
            <groupId>org.apereo.cas</groupId>
            <artifactId>cas-server-support-jdbc</artifactId>
            <version>${cas.version}</version>
        </dependency>

        <!--若不想找驅動可以直接寫下面的依賴即可,其中包括HSQLDB、Oracle、MYSQL、PostgreSQL、MariaDB、Microsoft SQL Server-->
        <dependency>
            <groupId>org.apereo.cas</groupId>
            <artifactId>cas-server-support-jdbc-drivers</artifactId>
            <version>${cas.version}</version>
        </dependency>

    </dependencies>

筆者這裏直接使用了CAS提供的綜合驅動庫,這裏不推薦這個用法,具體使用什麼數據庫引入具體的相關驅動即可,因爲引入綜合包,同時也引入了太多不必要的包。

現在我們更改application.properties配置,同時註釋靜態用戶配置,具體更改如下:

##
# CAS Authentication Credentials
#
#cas.authn.accept.users=casuser::Mellon

#查詢賬號密碼SQL,必須包含密碼字段
cas.authn.jdbc.query[0].sql=select * from user where username=?

#指定上面的SQL查詢字段名(必須)
cas.authn.jdbc.query[0].fieldPassword=password

#指定過期字段,1爲過期,若過期不可用
cas.authn.jdbc.query[0].fieldExpired=expired

#爲不可用字段段,1爲不可用,需要修改密碼
cas.authn.jdbc.query[0].fieldDisabled=disabled

#數據庫連接
cas.authn.jdbc.query[0].url=jdbc:mysql://127.0.0.1:3306/cas?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false

#數據庫dialect配置
cas.authn.jdbc.query[0].dialect=org.hibernate.dialect.MySQLDialect

#數據庫用戶名
cas.authn.jdbc.query[0].user=root

#數據庫用戶密碼
cas.authn.jdbc.query[0].password=123

#數據庫事務自動提交
cas.authn.jdbc.query[0].autocommit=false

#數據庫驅動
cas.authn.jdbc.query[0].driverClass=com.mysql.jdbc.Driver

#超時配置
cas.authn.jdbc.query[0].idleTimeout=5000

#默認加密策略,通過encodingAlgorithm來指定算法,默認NONE不加密
cas.authn.jdbc.query[0].passwordEncoder.type=NONE
#cas.authn.jdbc.query[0].passwordEncoder.characterEncoding=UTF-8
#cas.authn.jdbc.query[0].passwordEncoder.encodingAlgorithm=MD5

因爲這裏使用到了數據庫,所以我在本地新建了一個數據庫cas,然後新建用戶表user,添加id、username、password、expired、disabled字段,同時添加用戶名和密碼,並給expired,disabled字段賦值爲0。重新執行打包命令,mvn clean package,替換掉Tomcat下webapps下的cas.war包,並刪除cas目錄,重啓Tomcat。

在這裏插入圖片描述
訪問https://sso.anumbrella.net:8443/cas/login,我們可以發現,情況二的提示也沒有出現了,因爲我們的認證方式更改了。

接着我們輸入anumbrella/anumbrella,就是剛纔創建的用戶名和密碼,結果成功登陸。

在這裏插入圖片描述
在這裏插入圖片描述
到此,CAS基礎服務搭建就介紹完畢了。如果有疑問,歡迎留言!!

代碼實例:Chapter1

參考

  • CAS單點登錄-自定義認證之JDBC(五)
  • CAS之5.2x版本單點登錄服務安裝
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章