CAS最佳實踐 第一部分:配置篇 1.環(huán)境準備 Jdk1.4.2 Tomcat5.0.28 cas-server-2.0.12(沒有采用更高版本,是因為它最簡單明了) cas-client-java-2.1.1 2.在jdk上配置SSL 到http://java./products/jsse/去下載jsse,我用的是1.0.3;下載下來后是一個zip包,把里邊lib目錄下的jar包復(fù)制到你的jdk目錄下的jre\lib\ext目錄中,是三個文件:jsse.jar;jnet.jar;jcert.jar
3.SSL驗證證書 3.1.生成 keytool -genkey -alias tomcat -keyalg RSA 如果C:\Documents and Settings\Administrator\.keystore已經(jīng)存在,請先刪除。 輸入tomcat本身的缺省口令changeit 用戶前名和用戶后名都用localhost keytool -export -alias tomcat -file server.crt 只能輸入tomcat的缺省口令changeit keytool -import -trustcacerts -alias tomcat -file server.crt -keystore %java_home%/jre/lib/security/cacerts 3.2.顯示 keytool -list -v -keystore %java_home%/jre/lib/security/cacerts > t.txt 3.3.刪除 keytool -delete -alias tomcat -keystore %java_home%/jre/lib/security/cacerts -keypass changeit 只能輸入tomcat的缺省口令changeit 3.4.keytool參考 %JAVA_HOME%\bin\keytool -delete -alias tomcat -keypass changeit %JAVA_HOME%\bin\keytool -genkey -alias tomcat -keypass changeit -keyalg RSA %JAVA_HOME%\bin\keytool -export -alias tomcat -keypass changeit -file %FILE_NAME% %JAVA_HOME%\bin\keytool -import -file server.crt -keypass changeit -keystore %JAVA_HOME%/jre/lib/security/cacerts %JAVA_HOME%\bin\keytool -import -file server.crt -keypass changeit %JAVA_HOME%\bin\keytool -genkey -alias tomcat -keypass changeit -keyalg RSA -validity 365
4.Tomcat配置 4.1.拷貝 拷貝C:\Documents and Settings\Administrator\.keystore到%tomcat_home%\conf\ 4.2.配置 編輯%tomcat_home%\conf\server.xml,去掉ssl的注釋,并更改為如下配置 <Connector port="8443" keystorePass="changeit" keystoreFile="conf/.keystore" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" disableUploadTimeout="true" acceptCount="100" debug="0" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" /> 4.3.注意 請保持C:\Documents and Settings\Administrator\.keystore與%tomcat_home%\conf\.keystore一致
5.Tomcat jmx bug 在sun網(wǎng)站上http://java./javase/technologies/core/mntr-mgmt/javamanagement/download.jsp 下載jmx-1_2_1-ri.zip,解壓后,把jmxri.jar重命名為jmx.jar,覆蓋tomcat/bin目錄下的jmx.jar 這個適用于cas-server-3.*
Yale CAS最佳實踐 第二部分:原理篇
6.概念術(shù)語 CAS(Central Authentication Service) TGT(Ticket Granting Ticket) ST(Service Ticket) PGT(Proxy Granting Ticket) 7.原理剖析 Yale CAS使用了Ticket Granting Cookie (簡稱TGC)去作為獲取Service Ticket(簡稱ST)的憑據(jù),這個TGC 是保存在客戶端的cookie,即當?shù)?次被其他CAS Client重定向的時候,CAS Server實際上已經(jīng)從用戶的Cookie中抓取到TGC,然后知道TGC對應(yīng)的用戶,因此避免了再次登錄,如果CAS Server抓取不到TGC,則用戶需要登陸。
眾所周知,cookie是不能跨域的。但是CAS能夠做abc.com和xyz.com的sso,因為CAS Server緩存了所有的ticket,所以Client無需共享cookies。
Yale CAS最佳實踐 第三部分:源代碼研讀
8.源代碼研讀 8.1.web.xml參數(shù)定義: edu.yale.its.tp.cas.client.filter.loginUrl: CAS server的login URL. (Required) edu.yale.its.tp.cas.client.filter.validateUrl: CAS server的URL驗證器. (Required) edu.yale.its.tp.cas.client.filter.serviceUrl: URL of this service. (Required if serverName is not specified) edu.yale.its.tp.cas.client.filter.serverName: 主機名:端口號 edu.yale.its.tp.cas.client.filter.authorizedProxy: 身份驗證代理,用空格隔開.必須有一個. (缺省,只接受ST,不接受PT) edu.yale.its.tp.cas.client.filter.proxyCallbackUrl: 本地代理回調(diào)監(jiān)聽器,用來接受PGT/PGTIOU. (可選) edu.yale.its.tp.cas.client.filter.renew: 是否重新登錄參數(shù)(缺省為false) edu.yale.its.tp.cas.client.filter.gateway: 是否使用網(wǎng)關(guān)......雖然英文不難明白,但的確不懂到底有什么用,因而不敢斷章取義,望哪位高手能補充一下,在此謝過 edu.yale.its.tp.cas.client.filter.wrapRequest: 封裝了HttpServletRequest,重載了getRemoteUser()方法. 如果設(shè)置為"true", request.getRemoteUser()將返回登錄用戶名.(可選的,缺省為false.) 8.2.總體結(jié)構(gòu)圖
8.3.client源代碼研讀
8.4.server源代碼研讀
Yale CAS最佳實踐 第四部分:試試身手
1.測試類 我寫了一個RequestInfoServlet,可以顯示HttpRequest的絕大部分有用信息,經(jīng)過sso后,可以查看 HttpRequest里面還有什么東西。呵呵,我喜歡這樣干。
代碼
- import java.io.IOException;
- import java.io.PrintWriter;
- import java.util.Enumeration;
-
- import javax.servlet.ServletException;
- import javax.servlet.http.Cookie;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import javax.servlet.http.HttpSession;
-
- /**
- * @author Liujj Date 2006-12-19 <br>
- * Description: <br>
- * RequestHeadersServlet
- */
- public class RequestInfoServlet extends HttpServlet {
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws IOException, ServletException {
- response.setContentType("text/html");
- PrintWriter out = response.getWriter();
- //header
- Enumeration headerNames = request.getHeaderNames();
- out.println("<B>*********[1].begin print headerNames************</B><p>");
- while (headerNames.hasMoreElements()) {
- String name = (String) headerNames.nextElement();
- String value = request.getHeader(name);
- out.println(name + " = " + value + "<p>");
- }
- out.println("<B>*********[1].end print headerNames************</B><p><p>");
-
- //attributeNames
- out.println("<B>*********[2].begin print attributeNames************</B><p>");
- Enumeration attributeNames = request.getAttributeNames();
- while (attributeNames.hasMoreElements()) {
- String name = (String) attributeNames.nextElement();
- String value = (String)request.getAttribute(name);
- out.println(name + " = " + value + "<p>");
- }
- out.println("<B>*********[2].end print attributeNames************</B><p><p>");
-
- //parameterNames
- out.println("<B>*********[3].begin print parameterNames************</B><p>");
- Enumeration parameterNames = request.getParameterNames();
- while (parameterNames.hasMoreElements()) {
- String name = (String) parameterNames.nextElement();
- String value = request.getParameter(name);
- out.println(name + " = " + value + "<p>");
- }
- out.println("<B>*********[3].end print parameterNames************</B><p><p>");
-
- //session
- out.println("<B>*********[4].begin print session AttributeNames************</B><p>");
- HttpSession session = request.getSession();
- Enumeration sAttributeNames = session.getAttributeNames();
- while (sAttributeNames.hasMoreElements()) {
- String name = (String) sAttributeNames.nextElement();
- Object value = session.getAttribute(name);
- out.println(name + " = " + value + "<p>");
- }
- out.println("<B>*********[4].end print session attributeNames************</B><p><p>");
-
- //cookie
- out.println("<B>*********[4].begin print Cookie************</B><p><p>");
- Cookie[] cookie = request.getCookies();
- for(int i=0; i< cookie.length; i++) {
- String name = cookie[i].getName();
- String value = cookie[i].getValue();
- out.println(name + " = " + value + "<p>");
- }
- out.println("<B>*********[4].end print Cookie************</B><p><p>");
-
- }
-
- }
2.cas log不起作用 目前那個log4j不起作用,天天用著的,算是個小bug,哪個兄弟下載后能幫忙解決一下,再次謝過^_^
full architect.jpg |
描述: |
|
文件大小: |
22 KB |
看過的: |
文件被下載或查看 1182 次 |
下載
|
client.jpg |
描述: |
|
文件大小: |
33 KB |
看過的: |
文件被下載或查看 1172 次 |
下載
|
server.jpg |
描述: |
|
文件大小: |
27 KB |
看過的: |
文件被下載或查看 1157 次 |
下載
|
|