單點登錄-CAS基礎入門

1.什麼是單點登錄

單點登錄(SingleSignOn,簡稱爲SSO,是目前比較流行的企業業務整合的解決方案之一。
SSO的定義是在多個應用系統(分佈式應用)中,用戶只需要登錄一次就可以訪問所有相互信任的應用系統。

SSO含義
在一個分佈式系統中,假設有很多個子系統,那麼只要在一個子系統登錄成功,所有的系統就自動全部登錄成功!只要在一個在子系統中退出,那麼所有的系統自動退出!

我們目前的系統存在諸多子系統,而這些子系統是分別部署在不同的服務器中,那麼使用傳統方式的session是無法解決的,我們需要使用相關的單點登錄技術來解決。
在這裏插入圖片描述
SSO中文單點登錄,如何實現單點登錄功能?

需要CAS這個開源框架來實現! SSO術語 CAS是實現單點登錄的一個框架!

2.什麼是CAS

SSO是單點登錄名詞: CAS是實現單點登錄SSO的一種框架!

CAS是Yale大學發起的一個開源項目,旨在爲Web應用系統提供一種可靠的單點登錄方法,CAS在2004年12月正式成爲JA-SIG的一個項目。CAS具有以下特點:

【1】開源的企業級單點登錄解決方案。
【2】CASServer爲需要獨立部署的Web應用。認證服務器!
【3】CASClient支持非常多的客戶端(要登錄的子系統)(這裏指單點登錄系統中的各個Web應用),包括Java,.Net,PHP,Perl,Apache,uPortal,Ruby等。

從結構上看,CAS包含兩個部分:CASServerCASClientCASServer需要獨立部署,主要負責對用戶的認證工作;CASClient負責處理對客戶端受保護資源的訪問請求,需要登錄時,重定向到CASServer。下圖是CAS最基本的協議過程:
在這裏插入圖片描述

SSO單點登錄訪問流程主要有以下步驟:

1. 訪問服務:SSO客戶端發送請求訪問應用系統提供的服務資源。
2. 定向認證:SSO客戶端會重定向用戶請求到SSO服務器。
3. 用戶認證:用戶身份認證。
4. 發放票據:SSO服務器會產生一個隨機的Service Ticket。
5. 驗證票據:SSO服務器驗證票據Service Ticket的合法性,驗證通過後,允許客戶端訪問服務。
6. 傳輸用戶信息:SSO服務器驗證票據通過後,傳輸用戶認證結果信息給客戶端。

3.CAS服務端部署

Cas服務端其實就是一個war包。
cas-server-4.0.0-release\cas-server-4.0.0\modules目錄下
cas-server-webapp-4.0.0.war 將其改名爲cas.war放入tomcat目錄下的webapps下。啓動tomcat自動解壓war包。瀏覽器輸入http://localhost:8080/cas/login ,可看到登錄頁面
在這裏插入圖片描述
不要嫌棄這個頁面醜,我們後期可以再提升它的顏值。暫時把注意力放在功能實現上。
這裏有個固定的用戶名和密碼 casuser /Mellon
登錄成功後會跳到登錄成功的提示頁面!
在這裏插入圖片描述
添加登陸的用戶:
在這裏插入圖片描述
在這裏插入圖片描述
在此配置文件中添加用戶!

4.CAS服務端配置

4.1.端口修改

如果我們不希望用8080端口訪問CAS, 可以修改端口

(1)修改TOMCAT的端口

打開tomcat 目錄 conf\server.xml 找到下面的配置
將端口8080,改爲9999
在這裏插入圖片描述
(2)修改CAS配置文件
修改cas的WEB-INF/cas.properties
在這裏插入圖片描述

4.2.cas如何去掉HTTPS認證

CAS默認使用的是HTTPS協議,如果使用HTTPS協議需要SSL安全證書(需向特定的機構申請和購買) 。如果對安全要求不高或是在開發測試階段,可使用HTTP協議。我們這裏講解通過修改配置,讓CAS使用HTTP協議。

(1)修改cas的WEB-INF/deployerConfigContext.xml
找到下面的配置
在這裏插入圖片描述
這裏需要增加參數p:requireSecure=“false”,requireSecure屬性意思爲是否需要安全驗證,即HTTPS,false爲不採用

(2)修改cas的/WEB-INF/spring-configuration/ticketGrantingTicketCookieGenerator.xml
找到下面配置

參數p:cookieSecure=“true”,同理爲HTTPS驗證相關,TRUE爲採用HTTPS驗證,FALSE爲不採用https驗證。
參數p:cookieMaxAge="-1",是COOKIE的最大生命週期,-1爲無生命週期,即只在當前打開的窗口有效,關閉或重新打開其它窗口,仍會要求驗證。可以根據需要修改爲大於0的數字,比如3600等,意思是在3600秒內,打開任意窗口,都不需要驗證。
在這裏插入圖片描述
(3)修改cas的WEB-INF/spring-configuration/warnCookieGenerator.xml
找到下面配置
在這裏插入圖片描述

5.CAS服務端數據源設置

5.1.需求分析

我們現在讓用戶名密碼從我們的tb_user表裏做驗證

5.2.配置數據源

(1)修改cas服務端中web-inf下deployerConfigContext.xml ,添加如下配置
在這裏插入圖片描述

<!--數據源-->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"  
	  p:driverClass="com.mysql.jdbc.Driver"  
	  p:jdbcUrl="jdbc:mysql://127.0.0.1:3306/easygodb?characterEncoding=utf8"  
	  p:user="root"  
	  p:password="123456" /> 
	  
  <!--密碼加密處理-->  
<bean id="passwordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder"  
c:encodingAlgorithm="MD5"  
p:characterEncoding="UTF-8" />  
	  
<!--數據庫認證 -->		  
<bean id="dbAuthHandler"  
  class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"  
  p:dataSource-ref="dataSource"  
  p:sql="select password from tb_user where username=? and del=0"  
  p:passwordEncoder-ref="passwordEncoder"/> 

然後在配置文件開始部分找到如下配置

<bean id="authenticationManager" class="org.jasig.cas.authentication.PolicyBasedAuthenticationManager">
        <constructor-arg>
            <map>               
                <entry key-ref="proxyAuthenticationHandler" value-ref="proxyPrincipalResolver" />
                <entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" />
            </map>
        </constructor-arg>      
        <property name="authenticationPolicy">
            <bean class="org.jasig.cas.authentication.AnyAuthenticationPolicy" />
        </property>
</bean>

其中

 <entry key-ref="primaryAuthenticationHandler" value-ref="primaryPrincipalResolver" />

一句是使用固定的用戶名和密碼,我們在下面可以看到這兩個bean ,如果我們使用數據庫認證用戶名和密碼,需要將這句註釋掉。

添加下面這一句配置

<entry key-ref="dbAuthHandler" value-ref="primaryPrincipalResolver"/>

在這裏插入圖片描述
(2)將以下三個jar包放入webapps\cas\WEB-INF\lib
在這裏插入圖片描述
用數據庫中的用戶名和密碼進行測試!

6.CAS服務端界面改造

6.1.需求分析

我們現在動手將CAS默認的登錄頁更改爲自己的登陸頁

6.2.改頭換面

6.2.1.拷貝資源

(1)將易購商城的登陸頁login.html拷貝到cas系統下WEB-INF\view\jsp\default\ui 目錄下
(2)將css js等文件夾拷貝到 cas目錄下
(3) 將原來的casLoginView.jsp 改名(可以爲之後的修改操作做參照),將login.html改名爲casLoginView.jsp

6.2.2.修改頁面

編輯casLoginView.jsp內容
(1)添加指令

<%@ page pageEncoding="UTF-8" %>
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

(2)修改form標籤

<form:form method="post" id="fm1" commandName="${commandName}" htmlEscape="true" class="sui-form">
......
</form:form>

(3)修改用戶名框

<form:input id="username" tabindex="1" 
                    accesskey="${userNameAccessKey}" path="username" autocomplete="off" htmlEscape="true" 
                    placeholder="郵箱/用戶名/手機號" class="l_user" />   

(4)修改密碼框

 <form:password  id="password" tabindex="2" path="password" 
                    accesskey="${passwordAccessKey}" htmlEscape="true" autocomplete="off" 
                    placeholder="請輸入密碼" class="l_pwd"   />

(5)修改登陸按鈕

<input type="hidden" name="lt" value="${loginTicket}" />
<input type="hidden" name="execution" value="${flowExecutionKey}" />
<input type="hidden" name="_eventId" value="submit" />
<input class="XXXX" accesskey="l" value="登陸" type="submit" />
6.2.3.錯誤提示

在表單內加入錯誤提示框

<form:errors path="*" id="msg" cssClass="errors" element="div" htmlEscape="false" />

測試:輸入錯誤的用戶名和密碼,提示是英文。這個提示信息是在WEB-INF\classes目錄下的messages.properties文件中

authenticationFailure.AccountNotFoundException=Invalid credentials.
authenticationFailure.FailedLoginException=Invalid credentials.

設置國際化爲zh_CN ,修改cas-servlet.xml
在這裏插入圖片描述

<bean id="localeResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver" p:defaultLocale="zh_CN" />

在這裏插入圖片描述
我們需要將此信息拷貝到messages_zh_CN.properties下,並改爲中文提示(轉碼)

authenticationFailure.AccountNotFoundException=\u7528\u6237\u4E0D\u5B58\u5728.
authenticationFailure.FailedLoginException=\u5BC6\u7801\u9519\u8BEF.

第一個是用戶名不存在時的錯誤提示
第二個是密碼錯誤的提示

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