標籤:
最近項目需要,需要做一個單點登陸的功能,由於之前沒有接觸過SSO,不是很瞭解,查閱資料後 選擇使用CAS作為研究對象。CAS是有耶魯大學研發的單點登入伺服器。
借鑒了:http://blog.csdn.net/small_love/article/details/6664831的經驗,
1.開發環境
- tomcat7
- CAS Service 版本 cas-server-4.0.0
- CAS Client 版本 cas-client-3.3.3
- eclipse
- jdk1.7
2.開發步驟大致分為三部
- 產生認證
- 佈建服務端
- 配置用戶端
- 設定資料庫串連
- 測試
3.產生認證
認證對於實現此單點登入非常之重要,認證是伺服器端和用戶端安全通訊的憑證,本教程只是示範,所有用了 JDK內建的認證產生工具keytool。
1. 產生認證
命令:keytool -genkey -alias sslverisign -keyalg RSA -keystore D:/keys/smallkey
其中sslverisign是產生認證的一個別名 自訂 D:/keys/smallkey 是產生的路徑 一定要確保產生的路徑是存在的,smallkey會自己建立。
命令執行後如:
其中名字與姓氏這一最好寫你的網域名稱,如果在單擊測試你可以在C:\Windows\System32\drivers\etc\hosts檔案中映射一個虛擬網域名稱。
不要寫IP 其中紅字部分非常重要,在後面還會用到。
配置本地虛擬網域名稱的方法為:C:\Windows\System32\drivers\etc\hosts 找到hosts檔案 開啟編輯輸入如下:
配置的時候 該檔案有時候無法修改不能儲存,自個百度吧 有解決方案。
2.匯出認證
C:\>keytool -export -file d:/keys/ssl.crt -alias sslverisign -keystore d:/keys/smallkey
ssl.crt 為產生認證的名字 sslverisign為第一步產生的認證別名
執行後 如:
密碼為第一步自己所設定的密碼
3.把認證匯入到用戶端JDK中
命令:keytool -import -keystore C:\Java\jdk1.7.0_15\jre\lib\security\cacerts -file D:/keys/ssl.crt -alias sslverisign
執行如下:
匯入成功.
該步驟容易出現的問題就是:
1.keytool錯誤: java.io.IOException: Keystore was tampered with, or password was incorrect
錯誤的解決方案是,把%JAVA_HOME%\lib\security下的cacerts檔案刪除掉,在執行
2. 還有就是jdk存放的位置路徑如果存在空格也會導致匯入認證不成功,提示非法(預設安裝jdk的時候如:C:\Program Files 存在空格 將會導致匯入不成功),需要注意。
4.佈建服務端
1、 下載CAS的服務端cas-server-4.0.0-release.zip解壓,把解壓後的檔案中modules檔案夾中的cas-server-webapp-4.0.0.war檔案拷貝的D:\apache-tomcat7\webapps目錄下並改重新命名為cas.war :http://downloads.jasig.org/cas/
2、修改D:\apache-tomcat7\conf\server.xml檔案去掉此檔案83到93行之間的注釋,修改為:
keystoreFile="D:/keys/smallkey" <!--產生認證的時候的路徑-->
keystorePass="smalllove"/> <!--在產生認證的時候設定的密碼-->
設定完成後手動啟動tomcat:D:\apache-tomcat7\bin\startup.bat 點擊該bat檔案運行。
如果運行出現如下錯誤 導致啟動不成功。
嚴重: Failed to initialize end point associated with ProtocolHandler ["http-apr-443"]
java.lang.Exception: Connector attribute SSLCertificateFile must be defined when using SSL with APR
需要修改D:\apache-tomcat7\conf\server.xml 找到如下注釋掉:
<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
3、以上配置完成訪問https://www.deng.com:8443/cas出現以下頁面
點擊繼續瀏覽此網頁,後出現
由於我們用的是cas4.0的版本 所以預設的初始帳號是密碼是 casuser Mellon 之前看很多教程用的是3.4的版本 那時候初始帳號和密碼是admin
輸入帳號密碼後 會出現如下介面 表示登陸成功 伺服器端配置完成。
5.配置用戶端
下載用戶端:http://downloads.jasig.org/cas-clients/,目前最新版本為:cas-client-3.3.3,然後解壓cas-client-3.1.12.zip,在modules檔案夾中有需要的jar包(cas-client-core-3.3.3.jar,jul-to-slf4j-1.6.1.jar,log4j-over-slf4j-1.6.1.jar,slf4j-api-1.7.1.jar).
由於自己要做測試測試兩個項目登陸後是否能實現單點,在單獨部署一個tomcat伺服器(加之前部署修改的一共兩個),如果是解壓包的tomcat,就把之前的tomcat複製一個出來,開啟D:\apache-tomcat-7.0.40\conf\server.xml檔案,修改他的連接埠號碼保證兩個tomcat啟動後不衝突。
第22行修改後 <Server port="8055" shutdown="SHUTDOWN">第70到74 修改後 <Connector port="18080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="18443" />第97行 修改後 <Connector port="18009" protocol="AJP/1.3" redirectPort="18443" />
登陸建立兩個WEB工程 開啟web.xml檔案配置如下資訊,我cas伺服器用的預設的tomcat連接埠號碼,所以web項目我部署在後面修改連接埠後的tomcat上18080:
兩個web工程配置一樣 可以在預設的index.html頁面上標註一下區別。
1 <!-- ======================== 單點登入開始 ======================== --> 2 <!-- 用於單點退出,該過濾器用於實現單點登出功能,可選配置 --> 3 <listener> 4 <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class> 5 </listener> 6 7 <!-- 該過濾器用於實現單點登出功能,可選配置。 --> 8 <filter> 9 <filter-name>CAS Single Sign Out Filter</filter-name> 10 <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class> 11 </filter> 12 <filter-mapping> 13 <filter-name>CAS Single Sign Out Filter</filter-name> 14 <url-pattern>/*</url-pattern> 15 </filter-mapping> 16 17 <!-- 該過濾器負責使用者的認證工作,必須啟用它 --> 18 <filter>19 <filter-name>CASFilter</filter-name>20 <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>21 <init-param>22 <param-name>casServerLoginUrl</param-name>23 <param-value>https://www.deng.com:8443/cas/login</param-value>24 <!--這裡的server是服務端的IP -->25 </init-param>26 <init-param>27 <param-name>serverName</param-name> 28 <param-value>http://www.deng.com:18080</param-value> 29 </init-param> 30 </filter> 31 <filter-mapping> 32 <filter-name>CASFilter</filter-name>33 <url-pattern>/*</url-pattern>34 </filter-mapping>35 36 <!-- 該過濾器負責對Ticket的校正工作,必須啟用它 -->37 <filter> 38 <filter-name>CAS Validation Filter</filter-name> 39 <filter-class> 40 org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class> 41 <init-param> 42 <param-name>casServerUrlPrefix</param-name> 43 <param-value>https://www.deng.com:8443/cas</param-value> 44 </init-param> 45 <init-param> 46 <param-name>serverName</param-name> 47 <param-value>http://www.deng.com:18080</param-value> 48 </init-param> 49 </filter>50 <filter-mapping> 51 <filter-name>CAS Validation Filter</filter-name> 52 <url-pattern>/*</url-pattern> 53 </filter-mapping> 54 55 <!-- 該過濾器負責實現HttpServletRequest請求的包裹, 比如允許開發人員通過HttpServletRequest的getRemoteUser()方法獲得SSO登入使用者的登入名稱,可選配置。 --> 56 <filter> 57 <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name> 58 <filter-class> 59 org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class> 60 </filter> 61 <filter-mapping> 62 <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name> 63 <url-pattern>/*</url-pattern> 64 </filter-mapping> 65 66 <!-- 該過濾器使得開發人員可以通過org.jasig.cas.client.util.AssertionHolder來擷取使用者的登入名稱。 比如AssertionHolder.getAssertion().getPrincipal().getName()。 --> 67 <filter> 68 <filter-name>CAS Assertion Thread Local Filter</filter-name> 69 <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class> 70 </filter> 71 <filter-mapping> 72 <filter-name>CAS Assertion Thread Local Filter</filter-name> 73 <url-pattern>/*</url-pattern> 74 </filter-mapping> 75 76 <!-- ======================== 單點登入結束 ======================== -->
配置完成後手動啟動cas所屬的tomcat,確認沒有報錯後,在eclipse部署兩個web功能,然後eclipse裡啟動tomcat部署的兩個項目。
博主建了兩個簡單的功能 工程名為:
啟動完成後 網頁輸入項目任意一個項目的地址進行測試。
開啟後都自動跳轉到如下介面,開啟另外一個項目也是如此。
登陸測試帳號,驗證通過後,就會返回到該項目的index頁面。開啟另一個項目也會跳轉到對應的index頁面。不會被攔截登陸。至此說明配置單點登陸成功。
5.設定資料庫
目前使用的是預設帳號登陸的的情況,但是要是串連到資料庫又怎麼辦呢。下面cas伺服器如何設定資料庫。我使用的資料庫是mysql
1. 開啟cas伺服器所屬的tomcat 找到D:\apache-tomcat7\webapps\cas\WEB-INF\lib。加入幾個依賴包(cas-server-support-jdbc-4.0.0.jar,commons-dbcp-1.4.jar,commons-pool-1.6.jar,mysql-connector-java-5.0.8-bin.jar)
其中cas-server-support-jdbc-4.0.0.jar可以在cas-server-4.0.0\modules目錄下找到 其他的需要自行下載了。
2.開啟D:\apache-tomcat7\webapps\cas\WEB-INF\deployerConfigContext.xml,找到如下預設的帳號密碼 注釋掉。
然後新增:
1 <bean id="primaryAuthenticationHandler" class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"> 2 <property name="dataSource" ref="dataSource" /> 3 <property name="sql" value="select password from ms_user where user_code=?" />
<!-- 上面這句寫自己資料庫sql -->
4 </bean>
5<!-- MySQL connector -->
6 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> 7 <property name="driverClassName"> 8 <value>com.mysql.jdbc.Driver</value> 9 </property>10 <property name="url">11 <value>jdbc:mysql://localhost:3306/test</value>12 </property>13 <property name="username">14 <value>資料庫帳號</value>15 </property>16 <property name="password">17 <value>資料庫密碼</value>18 </property>19 </bean>
修改完成後再重新啟動cas服務端的tomcat伺服器 cas登陸頁面就需要登陸自己資料庫的帳號才能登陸了。
CAS伺服器的搭建和Java項目整合