日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Liferay门户与CAS实现SSO单点登录

發布時間:2024/4/17 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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单点登录的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。