Liferay中使用CAS實(shí)現(xiàn)單點(diǎn)登陸(SSO)

          單點(diǎn)登陸(SSO)的實(shí)現(xiàn)方式有很多種,這里所說的是用CAS實(shí)現(xiàn),這也是Liferay中所采納的方式。至于什么是CAS,單點(diǎn)登陸實(shí)現(xiàn)的原理等,這里不做解釋,直接一步一步明說實(shí)現(xiàn)方式,好了,多一個(gè)字的費(fèi)話也不說了。

          第一步,創(chuàng)建證書

          keytool -genkey -alias tomcat -keystore c:\mykeystore  -dname "CN=xyb, OU=localhost, O=localhost, L=SH, ST=SH, C=CN" -keypass 123456 -storepass 123456

          PS:

           -genkey         創(chuàng)建一個(gè)證書
          -alias          證書的別名
          -keystore       指定生成此證書的路徑(可不寫,默認(rèn)存在系統(tǒng)的Home目錄下.keystore文件中
          -storepass      指定密鑰庫的密碼
          -keypass        指定別名條目的密碼
          -dname          指定證書擁有者信息(可不寫,但,系統(tǒng)會(huì)提示你依次輸入這些信息,特別要注意“CN”的值是你想做為CAS服務(wù)器的這臺(tái)機(jī)器的域名或機(jī)器名,但就是不能是IP)
          -keyalg         指定密鑰的算法(可不寫)   
          -validity       指定創(chuàng)建的證書有效期多少天(可不寫,默認(rèn)為90天)

          第二步,導(dǎo)出證書

          keytool -export -alias tomcat -keystore c:\mykeystore -file c:\mycerts.cer -storepass 123456

          PS:

          -export         將別名指定的證書導(dǎo)出到文件
          -keystore       指定生成此證書的路徑(上一步中寫的什么這就寫什么,如果沒寫,這也不寫)
           -file           指定導(dǎo)出到文件的文件名

          第三步,把導(dǎo)出的證書導(dǎo)入到客戶端服務(wù)器

          keytool -import -trustcacerts -alias tomcat -keystore "%JAVA_HOME%/JRE/LIB/SECURITY/CACERTS" -storepass 123456 -file c:\mycerts.cer

          PS:

          -import         將已簽名數(shù)字證書導(dǎo)入密鑰庫
          -file           指定要導(dǎo)入到密鑰庫的文件名(也就是上一步導(dǎo)出的那個(gè)文件)
          有一個(gè)提示:是否信任這個(gè)證書,輸入 Y,回車。

          第四步,下載cas集成包。將下載后的文件改名為cas-web,放置在liferay的webapps目錄下,在conf/server.xml中找到下面這段,去掉原有的注釋并修改為:

          <Connector port="8443" maxHttpHeaderSize="8192" maxThreads="150" minSpareThreads="25" maxSpareThreads="75" enableLookups="false" disableUploadTimeout="true" acceptCount="100" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" URIEncoding="UTF-8"  keystorePass="123456" keyAlias="tomcat"/>

          第五步,在Liferay的webapps\ROOT\WEB-INF\classes\portal-ext.properties下添加如下內(nèi)容:

          cas.auth.enabled=true
          cas.login.url=https://xyb:8443/cas-web/login
          cas.logout.url=https://xyb:8443/cas-web/logout
          cas.server.name=客戶端IP:8080
          cas.service.url=
          #cas.service.url=http://localhost:8080/c/portal/login
          cas.validate.url=https://xyb:8443/cas-web/proxyValidate

          如果沒在Liferay下,只是普通的Web程序可用Filter來實(shí)現(xiàn),打開Web-INF\Web.XML文件,增加如下代碼

          <filter>
                  
          <filter-name>CASFilter</filter-name>
                  
          <filter-class>edu.yale.its.tp.cas.client.filter.CASFilter</filter-class>
                  
          <init-param>
                      
          <param-name>edu.yale.its.tp.cas.client.filter.loginUrl</param-name>
                      
          <param-value>https://xyb:8443/cas-web/login</param-value>
                  
          </init-param><!--這里的xyb是CAS服務(wù)端的IP或機(jī)器名-->
                  
          <init-param>
                      
          <param-name>edu.yale.its.tp.cas.client.filter.validateUrl</param-name>
                      
          <param-value>https://xyb:8443/cas-web/proxyValidate</param-value>
                  
          </init-param>
                  
          <init-param>
                    
          <param-name>edu.yale.its.tp.cas.client.filter.serverName</param-name>
                    
          <param-value>localhost:8080</param-value><!--client:port就是需要CAS需要攔截的地址和端口,一般就是這個(gè)TOMCAT所啟動(dòng)的IP和port-->
                  
          </init-param>
              
          </filter>
              
              
          <filter-mapping>
                  
          <filter-name>CASFilter</filter-name>
                  
          <url-pattern>/*</url-pattern><!--這里就是你要攔截的URL請(qǐng)求-->
              
          </filter-mapping>

           

          最后一步,在客戶端獲取CAS認(rèn)證通過的用戶名,并修改身份驗(yàn)證程序?yàn)橹煌ㄟ^用戶名來驗(yàn)證。如是在Liferay下就不用做這一步了,Liferay中本身的驗(yàn)證是ScreenName字段

          1、在JSP或Servlet中的用法:

          <%@ page import="edu.yale.its.tp.cas.client.filter.CASFilter" %>
          <%@ page import="javax.servlet.http.HttpServletRequest" %>
          <%@ page import="javax.servlet.http.HttpSession" %>
          <%
          HttpSession ses 
          = request.getSession();

          String screenName 
          =
          (String)ses.getAttribute(CASFilter.CAS_FILTER_USER);
          System.out.println(
          "screenName==:"+screenName);
          %> 

          2、在Java中通過 Session 獲取登錄用戶名

          // 以下兩者都可以
          session.getAttribute(CASFilter.CAS_FILTER_USER);
          session.getAttribute(
          "edu.yale.its.tp.cas.client.filter.user");

          3、在 JSTL 中獲取用戶名的方法

          <c:out value="${sessionScope[CAS:'edu.yale.its.tp.cas.client.filter.user']}"/>


          問題匯總:

           嚴(yán)重: edu.yale.its.tp.cas.client.CASAuthenticationException: Unable to validate ProxyTicketValidator [[edu.yale.its.tp.cas.client.ProxyTicketValidator prox
          yList=[null] [edu.yale.its.tp.cas.client.ServiceTicketValidator casValidateUrl=[https://192.168.1.111:8443/cas/proxyValidate] ticket=[ST-0-9h7Mx5HK3pfsdxRv
          MD3y] service=[http%3A%2F%2F192.168.1.222%3A8080%2Fservlets-examples%2Fservlet%2FHelloWorldExample] renew=false]]]

          這個(gè)CAS異常是從CAS Client里面拋出,是當(dāng)我們不使用證書的CN去訪問域名的時(shí)候(比如上文是用IP訪問而且證書的CN是該IP對(duì)應(yīng)的域名而非該IP),CASClient無法信任,也就是我上面特意提到的那個(gè)CN的問題。要特別注意。

          還有一種情況就是客戶端證書沒有導(dǎo)入,同樣也報(bào)這個(gè)錯(cuò)誤,最終可以歸為一句話,肯定是證書驗(yàn)證沒有通過所致.

           

          INFO [org.jasig.cas.authentication.AuthenticationManager
          Impl] - <AuthenticationHandler: cn.com.tiansky.cas.authenticationHandlers.UPAuthenticationHandler successfully authenticated the user which provided the followi
          ng credentials: [username: test]>

          就種錯(cuò)誤,可能是客戶端的那個(gè)配置文件里寫的不太對(duì)。也就是上面說的第五步,要多注意一下。

           

          java.io.IOException: Cannot recover key
                  at org.apache.tomcat.util.net.jsse.JSSE14SocketFactory.init(JSSE14Socket
          Factory.java:125)
                  at org.apache.tomcat.util.net.jsse.JSSESocketFactory.createSocket(JSSESo
          cketFactory.java:88)
                  at org.apache.tomcat.util.net.PoolTcpEndpoint.initEndpoint(PoolTcpEndpoi
          nt.java:292)
                  at org.apache.coyote.http11.Http11BaseProtocol.init(Http11BaseProtocol.j
          ava:138)
                  at org.apache.catalina.connector.Connector.initialize(Connector.java:101

          這種錯(cuò)誤,可能是你生成的證書有問題,如果keypass和storepass的密碼不一致也會(huì)把這個(gè)錯(cuò)(不知為什么非要設(shè)成一樣的)



          眼鏡蛇

          posted on 2009-02-22 12:53 眼鏡蛇 閱讀(3716) 評(píng)論(4)  編輯  收藏 所屬分類: JavaLiferaySSO

          評(píng)論

          # re: Liferay中使用CAS實(shí)現(xiàn)單點(diǎn)登陸(SSO)[未登錄] 2010-01-09 11:47 ben

          我遇到過此問題,是我的jdk導(dǎo)入錯(cuò)誤。
          因?yàn)槲以趀clipse下配置好證書,換到MyEclipse下時(shí),默認(rèn)使用的是MyEclipse的jdk,所以就出現(xiàn)了上述錯(cuò)誤。
          希望能給你點(diǎn)幫助!  回復(fù)  更多評(píng)論   

          # re: Liferay中使用CAS實(shí)現(xiàn)單點(diǎn)登陸(SSO) 2010-01-26 11:07 wacel

          自己寫的portlet有自己的用戶系統(tǒng),也要用CAS實(shí)現(xiàn)單點(diǎn)登陸,這時(shí)的web.xml應(yīng)該怎么寫?filter的url-pattern不管怎么寫也不執(zhí)行這個(gè)filter啊!  回復(fù)  更多評(píng)論   

          # re: Liferay中使用CAS實(shí)現(xiàn)單點(diǎn)登陸(SSO) 2010-01-28 22:22 眼鏡蛇

          請(qǐng)看我的第五步,<url-pattern>/*</url-pattern><!--這里就是你要攔截的URL請(qǐng)求-->
          @wacel
            回復(fù)  更多評(píng)論   

          # re: Liferay中使用CAS實(shí)現(xiàn)單點(diǎn)登陸(SSO) 2013-10-17 13:50 張明

          好  回復(fù)  更多評(píng)論   

          <2013年10月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(6)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 武邑县| 高雄市| 思南县| 巨鹿县| 偏关县| 苗栗县| 阳新县| 高陵县| 锦州市| 新蔡县| 嘉义市| 玛曲县| 潼关县| 和平县| 株洲市| 柳河县| 苍梧县| 长岭县| 泾阳县| 隆回县| 安达市| 望谟县| 平顶山市| 太仆寺旗| 台安县| 申扎县| 棋牌| 安化县| 东乡族自治县| 雷波县| 黑河市| 东安县| 玉屏| 讷河市| 北海市| 玉林市| 富顺县| 昂仁县| 习水县| 武汉市| 屏南县|