Liferay门户与CAS实现SSO单点登录
?http://blog.csdn.net/yang_19790212/article/details/6635778
?
1.1 準備工作
1.1.1? 安裝JDK1.6.0.20
JAVA 1.6.0以上的其他版本也可以,下載安裝即可。具體在這里不做描述。
1.1.2? 下載TOMCAT6.0.20
TOMCAT6.0以上的其他版本均可,下載解壓即可。
1.1.3? 下載cas-server-3.4.3.1-release
建議版本號最好一致,否則遇到問題比較難解決。下載好了先放在一邊。
1.1.4? 下載cas-client-3.1.12-release
建議版本號最好一致,否則遇到問題比較難解決。下載好了先放在一邊。
1.2 開始部署
1.2.1? 創建證書
1、? 創建前先在E盤創建keys目錄;
2、? 執行命令:
???????? ?? keytool -genkey -alias mbaobao -keyalg RSA -keystore e:/keys/mbaobao
接下來按下圖說明完成:(密碼為:mbaobao)
3、? 配置本地的虛擬域名
打開hosts用戶“記事本”編輯,即notepad
最后加入: 127.0.0.1 ??sso.mbaobao.com,保存完成。
4、? 導出證書,執行命令
keytool -export -file e:/keys/mbaobao.crt -alias mbaobao -keystore e:/keys/mbaobao
輸入密碼:mbaobao,完成認證的生成
5、為客戶端的JVM生成認證,執行以下命令:
keytool -import -keystore e:\keys\cacerts -file e:/keys/mbaobao.crt -alias mbaobao
如下圖:(密碼:mbaobao)
拷貝E:\keys\ cacerts文件到客戶端的JDK相關目錄下:
如:D:\Program Files\Java\jdk1.6.0_20\jre\lib\security
?
到這里證書已完成創建。
1.2.2? Tomcat部署CASServer
1、? 解壓cas-server-3.4.3.1-release.zip包
2、? 拷貝cas-server-3.4.3.1\modules\cas-server-webapp-3.4.3.1.war到tomcat\webapps目錄下,并改成cas.war名字
3、? 如果JAVA_HOME還沒有配置好的話,去配置一下,如果配置完成的話,則不用配置了,直接啟動tomcat
4、? 啟動后,停止tomcat,然后看到有一個cas目錄,有的話把cas.war刪除掉。
5、? 配置tomcat/conf/server.xml的第82行左右,放開注釋改成如下內容
| <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" maxThreads="150" scheme="https" secure="true" clientAuth="false" sslProtocol="TLS" keystoreFile="e:/keys/mbaobao" keystorePass="mbaobao" /> |
注意證書的路徑和密碼。
6、? 啟動Tomcat服務,在IE輸入https://sso.mbaobao.com:8443/cas,如下圖:
點擊“繼續瀏覽網站(不推薦)”,如下圖:
輸入admin/admin登錄,如果進入如下圖說明配置成功!恭喜你!!!
?
與tomcat相關的配置已經完成。為什么輸入admin都可以進去呢?試一下隨便弄一個用戶名輸進去,密碼與用戶名一樣看看效果?是不是也進去了?如果是繼續往下看casserver配置。
1.2.3? CASServer配置
1、? 注釋掉用戶名和密碼可以進去的功能
打開webapps\cas\WEB-INF\deployerConfigContext.xml文件,注釋用”<!--? -->”
| <!--<bean class="org.jasig.cas.authentication.handler.support.SimpleTestUsernamePasswordAuthenticationHandler" />--> |
2、? 與后臺的mysql關聯
在剛才注釋的那個位置下面輸入:
| <bean class="org.jasig.cas.adaptors.jdbc.QueryDatabaseAuthenticationHandler"> <property name="dataSource" ref="dataSource"/> <property name="sql" value=" SELECT password_ FROM User_ U where emailAddress=? "/> <property name="passwordEncoder" ref="MD5PasswordEncoder"/> </bean> |
本例是與liferay的user_表相關聯,這樣的話用戶可以統一在liferay的user_表里面,如果后期有需要的話再改成與ldap相關聯。
在本xml里面倒數第二行,即</beans>前面加入如下的代碼:主要是配置連接方式和采用MD5加密。
| <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> ???????? <property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property> ???????? <property name="url"><value>jdbc:mysql://192.168.0.81:3306/portal</value></property> ???????? <property name="username"><value>portal</value></property> ???????? <property name="password"><value>123456</value></property> </bean> <bean id="MD5PasswordEncoder" class="org.jasig.cas.authentication.handler.DefaultPasswordEncoder"> ???????? <constructor-arg index="0"> ???????? ??? <value>MD5</value> ???????? </constructor-arg> </bean> |
?
1.2.4? 支持中文配置
1、修改web.xml
| <filter> ??????? <description>EncodingFilter</description> ??????? <filter-name>EncodingFilter</filter-name> ??????? <filter-class>com.mbb.sso.filter.EncodingFilter</filter-class> ??????? <init-param> ??????????? <description>encoding_charset</description> ??????????? <param-name>encoding</param-name> ??????????? <param-value>UTF-8</param-value> ??????? </init-param> ??????? <init-param> ??????????? <description>ignore?</description> ??????????? <param-name>ignore</param-name> ?????????? ?<param-value>true</param-value> ??????? </init-param> ???????? </filter> ???????? <filter-mapping> ??????????????????????????? <filter-name>EncodingFilter</filter-name> ??????????????????????????? <url-pattern>/*</url-pattern> ???????? </filter-mapping> |
2、編寫過濾器類
| package com.mbb.sso.filter; ? import java.io.IOException; ? import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; ? public class EncodingFilter implements Filter{ ???????? protected String encoding = null; ??? protected FilterConfig filterConfig = null; ??? protected boolean ignore = true; ?? ??? public void destroy() {?????? ??????? this.encoding = null; ??????? this.filterConfig = null; ?????? ??? } ?? ??? public void doFilter(ServletRequest request, ServletResponse response, ??????????? FilterChain chain) ??????????? throws IOException, ServletException { ?????? // Conditionally select and set the character encoding to be used ??????? if (ignore || (request.getCharacterEncoding() == null)) { ??????????? String encoding = selectEncoding(request); ??????????? if (encoding != null) ??????????????? request.setCharacterEncoding(encoding); ??????? } ?????? // Pass control on to the next filter ??????? chain.doFilter(request, response); ?????? ??? } ?? ??? public void init(FilterConfig filterConfig) throws ServletException { ?????? ??????? this.filterConfig = filterConfig; ??????? this.encoding = filterConfig.getInitParameter("encoding"); ??????? String value = filterConfig.getInitParameter("ignore"); ??????? if (value == null) ??????????? this.ignore = true; ??????? else if (value.equalsIgnoreCase("true")) ??????????? this.ignore = true; ??????? else if (value.equalsIgnoreCase("yes")) ??????????? this.ignore = true; ??????? else ??????????? this.ignore = false; ?????? ??? } ?? ??? protected String selectEncoding(ServletRequest request) { ?????? ??????? return (this.encoding); ?????? ??? } } |
3、配置tomcat
| 在connector處增加?? URIEncoding="UTF-8" |
4、重啟一下tomcat
試一下中文用戶名登錄。
1.2.5? Liferay配置
1、? 拷貝證書到e:\keys\ cacerts文件到liferay的jre目錄下:
…\liferay-portal-6.0.5\tomcat-6.0.26\jre1.6.0_21\win\lib\security,替換即可
2、? 在portal-ext.properties增加下面兩行:
| passwords.encryption.algorithm=MD5 passwords.digest.encoding=hex |
表示md5加密。
3、? 啟動Liferay,打開liferay 控制面板—> 設置—認證 出現如下界面:
這個“按電子郵件”認證
4、? 進入”CAS”界面,如下圖:
按圖上的進行修改,其中服務器名稱是填入liferay的服務器名稱。
5、? 保存退出
6、? 點一下右上角的注銷,重新進入liferay系統
7、? 點一下右上角的登錄,然后就進入了cas的統一登錄界面了,輸入用戶名和密碼是不是就進入了liferay系統了?
8、? 如果跟平常一樣進入了,那就恭喜你!配置成功了!
1.2.6? CASClient配置
1、? JAVA的WEB系統配置
首先先建一個web項目,然后在web.xml文件中加入以下內容或或者在原有的項目上新增以下內容:
| <!-- ======================== 單點登錄開始 ======================== -->????????? <!-- 用于單點退出,該過濾器用于實現單點登出功能,可選配置-->????????? ? ? <listener>? ??? <listener-class>org.jasig.cas.client.session.SingleSignOutHttpSessionListener</listener-class> ? ? </listener>??????????? ? ? <!-- 該過濾器用于實現單點登出功能,可選配置。 --> ? ? <filter>????????????????? ? ????? <filter-name>CAS Single Sign Out Filter</filter-name> ? ????? <filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class> ??? </filter>????????? ??? <filter-mapping>????????????????? ?????? <filter-name>CAS Single Sign Out Filter</filter-name>????????????????? ?????? <url-pattern>/*</url-pattern>????????? ??? </filter-mapping>??????????? ??? <!-- 該過濾器負責用戶的認證工作,必須啟用它 -->????????? ??? <filter>???????????? ????? ?????? <filter-name>CASFilter</filter-name> ? ??? <filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class>????????????????? ?????? <init-param>????????????????????????? ?????????? <param-name>casServerLoginUrl</param-name>????????????????????????? ?????????? <param-value>https://sso.mbaobao.com:8443/cas/login</param-value>????????????????????????? ?????????? <!--這里的server是服務端的IP-->????????????????? ?????? </init-param>????????????????? ?????? <init-param>????????????????????????? ?????????? <param-name>serverName</param-name>????????????????????????? ?????????? <param-value>http://localhost:8088</param-value>????????????????? ?????? </init-param>????????? ??? </filter>????????? ??? <filter-mapping>????????????????? ?????? <filter-name>CASFilter</filter-name>????????????????? ?????? <url-pattern>/*</url-pattern>????????? ??? </filter-mapping>??????????? ??? <!-- 該過濾器負責對Ticket的校驗工作,必須啟用它 -->????????? ??? <filter>????????????????? ?????? <filter-name>CAS Validation Filter</filter-name>????????????????? ??? ??? <filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class> ?????? <init-param>????????????????????????? ?????? <param-name>casServerUrlPrefix</param-name>????????????????????????? ?????????? <param-value>https://sso.mbaobao.com:8443/cas</param-value>????????????????? ?????? </init-param>????????????????? ?????? <init-param>????????????????????????? ?????????? <param-name>serverName</param-name>????????????????????????? ?????????? <param-value>http://localhost:8088</param-value>????????????????? ?????? </init-param>????????? ??? </filter>????????? ??? <filter-mapping>????????????????? ?????? <filter-name>CAS Validation Filter</filter-name>????????????????? ?????? <url-pattern>/*</url-pattern>????????? ??? </filter-mapping>??????????? ??? <!-- 該過濾器負責實現HttpServletRequest請求的包裹,比如允許開發者通過HttpServletRequest的getRemoteUser()方法獲得SSO登錄用戶的登錄名,可選配置。????????? -->????????? ??? <filter>????????????????? ?????? <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>????????????????? ?????? <filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class>????????? ??? </filter>????????? ??? <filter-mapping>????????????????? ?????? <filter-name>CAS HttpServletRequest Wrapper Filter</filter-name>????????????????? ?????? <url-pattern>/*</url-pattern>????????? ??? </filter-mapping>??????????? ??? <!--該過濾器使得開發者可以通過org.jasig.cas.client.util.AssertionHolder來獲取用戶的登錄名。比如AssertionHolder.getAssertion().getPrincipal().getName()。? -->????????? ??? <filter>????????????????? ?????? <filter-name>CAS Assertion Thread Local Filter</filter-name>????????????????? ?????? <filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class>????????? ??? </filter>????????? ??? <filter-mapping>????????????????? ?????? <filter-name>CAS Assertion Thread Local Filter</filter-name>????????????????? ?????? <url-pattern>/*</url-pattern>????????? ??? </filter-mapping>??????????????????? ??? <!-- 自動根據單點登錄的結果設置本系統的用戶信息 -->? ??? <!--???????? ??? <filter> ?????? <display-name>AutoSetUserAdapterFilter</display-name>????????????????? ?????? <filter-name>AutoSetUserAdapterFilter</filter-name>????????????????? ?????? <filter-class>com.wsria.demo.filter.AutoSetUserAdapterFilter</filter-class>????????? ??? </filter>????????? ??? <filter-mapping>????????????????? ?????? <filter-name>AutoSetUserAdapterFilter</filter-name> ????????????????? ?????? <url-pattern>/*</url-pattern>????????? ??? </filter-mapping>?? ??? ?-->?????? ??? <!-- ======================== 單點登錄結束 ======================== -->? |
其次,導入casclient的jar包,如下圖:
最后,編寫一個jsp頁面測試一下
| <%@ page language="java" import="java.util.*,org.jasig.cas.client.authentication.*"pageEncoding="UTF-8"%> <% ??? AttributePrincipal principal = (AttributePrincipal)request.getUserPrincipal();?? ??? String username = principal.getName(); ??? System.out.println("*****************"+username); %> ? <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> ? <head> ?????? ??? <title>My JSP 'index.jsp' starting page</title> ??? <meta http-equiv="pragma" content="no-cache"> ??? <meta http-equiv="cache-control" content="no-cache"> ??? <meta http-equiv="expires" content="0">??? ??? <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> ??? <meta http-equiv="description" content="This is my page"> ??? <!-- ??? <link rel="stylesheet" type="text/css" href="styles.css"> ??? --> ? </head> ? ? <body>??? ??? 用戶名:<%=username%> ??? <a id="logout" href="https://sso.mbaobao.com:8443/cas/logout">退出登錄</a></c:if> ? </body> </html> |
測試一下是不是得到用戶名了,如果得到的話則說明統一認證通過。
?
1.3 改造界面
主要改造以下幾個界面就可以了:
登錄界面:casLoginView.jsp
登錄成功:casGenericSuccess.jsp
登出界面:casLogoutView.jsp
?
==============
http://my.oschina.net/liferay/blog/5805
Liferay中使用CAS實現單點登陸(SSO)(轉載)
2人收藏此文章, 收藏此文章 發表于1年前 , 已有1641次閱讀 共1個評論 2人收藏此文章點登陸(SSO)的實現方式有很多種,這里所說的是用CAS實現,這也是Liferay中所采納的方式。至于什么是CAS,單點登陸實現的原理等,這里不做解釋,直接一步一步明說實現方式,好了,多一個字的費話也不說了。
第一步,創建證書
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???????? 創建一個證書
-alias????????? 證書的別名
-keystore?????? 指定生成此證書的路徑(可不寫,默認存在系統的Home目錄下.keystore文件中
-storepass????? 指定密鑰庫的密碼
-keypass??????? 指定別名條目的密碼
-dname????????? 指定證書擁有者信息(可不寫,但,系統會提示你依次輸入這些信息,特別要注意“CN”的值是你想做為CAS服務器的這臺機器的域名或機器名,但就是不能是IP)
-keyalg???????? 指定密鑰的算法(可不寫)???
-validity?????? 指定創建的證書有效期多少天(可不寫,默認為90天)
第二步,導出證書
keytool -export -alias tomcat -keystore c:\mykeystore -file c:\mycerts.cer -storepass 123456
PS:
-export?????????將別名指定的證書導出到文件
-keystore???????指定生成此證書的路徑(上一步中寫的什么這就寫什么,如果沒寫,這也不寫)
?-file???????????指定導出到文件的文件名
第三步,把導出的證書導入到客戶端服務器
keytool -import -trustcacerts -alias tomcat -keystore "%JAVA_HOME%/JRE/LIB/SECURITY/CACERTS" -storepass?123456 -file c:\mycerts.cer
PS:
-import?????????將已簽名數字證書導入密鑰庫
-file???????????指定要導入到密鑰庫的文件名(也就是上一步導出的那個文件)
有一個提示:是否信任這個證書,輸入 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下添加如下內容:
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來實現
<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服務端的IP或機器名-->
????????<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需要攔截的地址和端口,一般就是這個TOMCAT所啟動的IP和port-->
????????</init-param>
????</filter>
????
????<filter-mapping>
????????<filter-name>CASFilter</filter-name>
????????<url-pattern>/*</url-pattern><!--這里就是你要攔截的URL請求-->
????</filter-mapping>
?
最后一步,在客戶端獲取CAS認證通過的用戶名
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']}"/>
問題匯總:
?嚴重: 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]]]
這個CAS異常是從CAS Client里面拋出,是當我們不使用證書的CN去訪問域名的時候(比如下文是用IP訪問而且證書的CN是該IP對應的域名而非該IP),CASClient無法信任,也就是我上面特意提到的那個CN的問題。要特別注意。
?
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]>
就種錯誤,可能是客戶端的那個配置文件里寫的不太對。也就是上面說的第五步,要多注意一下。
?
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
這種錯誤,可能是你生成的證書有問題,如果keypass和storepass的密碼不一致也會把這個錯(不知為什么非要設成一樣的)
?
總結
以上是生活随笔為你收集整理的Liferay门户与CAS实现SSO单点登录的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Liferay Portal额外研究-银
- 下一篇: ldap - 设置一个基本的OpenLD