jdk :1.7以上(必須要在1.7以上版本否則會導致登陸異常)
jboss: jboss-as-7.1.1.Final
cas-client-core-3.2.1.jar :CAS Client
opensaml-1.1.jar :OpenSAML是一個開源的OASIS安全斷言標記語言規範實施
cas-client-pcg.jar :ASC自寫jar, 因CAS也不支持Jboss7,但通過開發調整,可以讓其client支持在Jboss7下驗證),驗證使用的關鍵類如下:
com.pcg.sso.cas.client.jboss.authentication.WebAuthenticationFilter (在jboss7下使用,jboss7使用自己實現容器,不再使用tomcat)
com.pcg.sso.cas.client.jboss.authentication.WebAuthenticationFilter2(在jboss3~jboss6使用)
登出filter請使用我們自己寫的如下類:
com.pcg.sso.cas.client.session.SingleSignOutFilter
另外請特別保證登出的filter在所有的filter前面。
2. jboss7 module安裝
jboss7變動很大jar不再以直接放入lib目錄下,可以通過配置module.xml選擇性加載
2.1 安裝jdk1.7,解壓jboss-as-7.1.1.Final
2.2 在jboss-as-7.1.1.Final\modules\com目錄下建立目錄pcg\sso\main
2.3 復制cas-client-core-3.2.1.jar (cas-client-3.2.1壓縮包modules目錄下),opensaml-1.1.jar,cas-client-pcg.jar
到pcg\sso\main目錄下
2.4 設定module.xml
內容如下
<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.1" name="com.pcg.sso">
<resources>
<resource-root path="cas-client-pcg.jar"/>
<resource-root path="cas-client-core-3.2.1.jar"/>
<resource-root path="opensaml-1.1.jar"/>
</resources>
<dependencies>
<module name="javax.api" />
<module name="javax.servlet.api" />
<module name="org.apache.santuario.xmlsec" />
<module name="org.apache.commons.logging" />
<module name="org.apache.log4j" />
<module name="org.apache.commons.codec" />
</dependencies>
</module>
com.pcg.sso 發布webapp中所可以引用的module名
resources 里是jar包文件
dependencies jar包中類需要導入的類
3 jboss7 webapp configuration
3.1 編輯standalone.xml
3.1.1編輯 subsystem xmlns 為 urn:jboss:domain:ee:1.0 的節點在這加入上面配置的com.pcg.sso
module。
變動前為
<subsystem xmlns="urn:jboss:domain:ee:1.0"/>
變更后
<subsystem xmlns="urn:jboss:domain:ee:1.0">
<global-modules>
<module name="com.pcg.sso" slot="main"/>
</global-modules>
</subsystem>
3.1.2編緝 subsystem xmlns 為 urn:jboss:domain:security:1.1的節點加入安全驗證服務器。
變更前
<subsystem xmlns="urn:jboss:domain:security:1.1">
<security-domains>
<security-domain name="other" cache-type="default">
<authentication>
<login-module code="Remoting" flag="optional">
<module-option name="password-stacking" value="useFirstPass"/>
</login-module>
<login-module code="RealmUsersRoles" flag="required">
<module-option name="usersProperties"
value="${jboss.server.config.dir}/application-users.properties"/>
<module-option name="rolesProperties"
value="${jboss.server.config.dir}/application-roles.properties"/>
<module-option name="realm" value="ApplicationRealm"/>
<module-option name="password-stacking" value="useFirstPass"/>
</login-module>
</authentication>
</security-domain>
<security-domain name="jboss-web-policy" cache-type="default">
<authorization>
<policy-module code="Delegating" flag="required"/>
</authorization>
</security-domain>
<security-domain name="jboss-ejb-policy" cache-type="default">
<authorization>
<policy-module code="Delegating" flag="required"/>
</authorization>
</security-domain>
</security-domains>
</subsystem>
變動后
<subsystem xmlns="urn:jboss:domain:security:1.1">
<security-domains>
<security-domain name="other" cache-type="default">
<authentication>
<login-module code="Remoting" flag="optional">
<module-option name="password-stacking" value="useFirstPass"/>
</login-module>
<login-module code="RealmUsersRoles" flag="required">
<module-option name="usersProperties"
value="${jboss.server.config.dir}/application-users.properties"/>
<module-option name="rolesProperties"
value="${jboss.server.config.dir}/application-roles.properties"/>
<module-option name="realm" value="ApplicationRealm"/>
<module-option name="password-stacking" value="useFirstPass"/>
</login-module>
</authentication>
</security-domain>
<security-domain name="jboss-web-policy" cache-type="default">
<authorization>
<policy-module code="Delegating" flag="required"/>
</authorization>
</security-domain>
<security-domain name="jboss-ejb-policy" cache-type="default">
<authorization>
<policy-module code="Delegating" flag="required"/>
</authorization>
</security-domain>
<security-domain name="cas" cache-type="default">
<authentication>
<login-module code="org.jasig.cas.client.jaas.CasLoginModule" flag="required">
<module-option name="ticketValidatorClass"
value="org.jasig.cas.client.validation.Saml11TicketValidator"/>
<module-option name="casServerUrlPrefix"
value="https://sso.pouchen.com/cas"/>
<module-option name="defaultRoles" value="eip"/>
<module-option name="roleAttributeNames"
value="memberOf,eduPersonAffiliation"/>
<module-option name="roleGroupName" value="Roles"/>
<module-option name="principalGroupName" value="CallerPrincipal"/>
<module-option name="cacheAssertions" value="false"/>
<module-option name="cacheTimeout" value="480"/>
<module-option name="tolerance" value="60000"/>
<module-option name="encoding" value="UTF-8"/>
</login-module>
</authentication>
</security-domain>
</security-domains>
</subsystem>
紅色區域內容為新增部分。
注意 https://sso.pouchen.com/cas 為CAS服務端 。
eip為默認角色 。
<login-module />的code屬性請給我們自己寫的 com.pcg.sso.cas.client.jaas.CasLoginModule,否則當你用 cacheAssertions時登出將無無法達到預期的效果。
<module-option name="cacheAssertions" value="false"/> client端的ticket是否使用cache,默認為true。如果使用cache,只要URL給合法的ticket都能登錄通過,就算瀏覽器關閉後再開或session銷毀後都可以,只有通過logout才能登出;如果不是用cache則瀏覽器關閉後再開瀏覽器給合法的ticket都會要求重新登錄。
<module-option name="cacheTimeout" value="480"/> 當client端使用cache時,cache清空的時間間隔,單位為分鐘。
<module-option name="tolerance" value="60000"/> CAS Client與Server之間的時間差可允許
的范圍以毫秒計算 這項必須設置正否則會導致登陸不通過。
<module-option name="encoding" value="UTF-8"/> SAML消息內容之字符集,非常關鍵。
3.1.3 編緝interfaces 節點(可選)
新增如下內容
<interface name="ipv4-global">
<any-ipv4-address/>
</interface>
any-ipv4-address 這是為了讓jboss相關服務發布在其server所在的ipv4之IP上,這樣外部才能訪問這個CAS Client。
然後找到socket-binding-group節點修改屬性default-interface為 ipv4-global 這樣所有的ip 都可以訪問這臺server。
備註:此點只是讓非本服務器外的IP能訪問到這個jboss提供的服務而已,方法有很多種,如直接在啟動命令後加入 -b 參數,或直接改<interface name="public" /> 內的jboss.bind.address值為本服務器IP等都可以。
3.2. 編輯jboss-web.xml
必須含有下述紅色部分內容,這裡說明下:jboss7裡的jndi地址不再使用java:/service/name 的方式,但是如果你仍繼續使用這種形式也是可以的,所以下述方式<security-domain/>內的內容如果是java:/jaas/cas 也沒有問題,jboss7仍然兼容之前版本的jndi命名方式。
<?xml version="1.0" encoding="UTF-8"?>
<jboss-web>
<security-domain>cas</security-domain>
</jboss-web>
3.3 編輯web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0" metadata-complete="true">
<display-name>Welcome to Test</display-name>
<description>Welcome to Test</description>
<context-param>
<param-name>serverName</param-name>
<param-value>http://172.17.45.92:8080</param-value>
</context-param>
<context-param>
<param-name>casServerLoginUrl</param-name>
<param-value>https://sso.pouchen.com/cas/login</param-value>
</context-param>
<context-param>
<param-name>system</param-name>
<param-value>en_US:Test System|zh_TW:測試系統</param-value>
</context-param>
<!-- removeTicket 默認為true,如果默認符合您的需要則下述參數無需設置
<context-param>
<param-name>removeTicket</param-name>
<param-value>true</param-value>
</context-param>
-->
<!-- Facilitates CAS single sign-out -->
<listener>
<listener-class>
org.jasig.cas.client.session.SingleSignOutHttpSessionListener
</listener-class>
</listener>
<!-- Following is needed only if CAS single-sign out is desired -->
<filter>
<filter-name>CASSingleSignOutFilter</filter-name>
<filter-class>com.pcg.sso.cas.client.session.SingleSignOutFilter</filter-class>
</filter>
<!-- Only 2 CAS filters are required for JAAS support -->
<filter>
<filter-name>CASWebAuthenticationFilter</filter-name>
<filter-class>com.pcg.sso.cas.client.jboss.authentication.WebAuthenticationFilter
</filter-class>
</filter>
<filter>
<filter-name>CASAuthenticationFilter</filter-name>
<filter-class>com.pcg.sso.cas.client.authentication.AuthenticationFilter</filter-class>
</filter>
<!-- CAS client filter mappings -->
<!-- The order of the following filters is vitally important -->
<filter-mapping>
<filter-name>CASSingleSignOutFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CASWebAuthenticationFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CASAuthenticationFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CASAuthenticationFilter</filter-name>
<url-pattern>*.zul</url-pattern>
</filter-mapping>
<security-constraint>
<display-name>Test app Constraint</display-name>
<web-resource-collection>
<web-resource-name>Protected Area</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
</security-constraint>
</web-app>
需要變更的參數配置:
serverName :CAS Client 的ip與port。
casServerLoginUrl: CAS Server 登陸的url。
system:CAS Client傳給CAS Server 在登錄界面顯示的糸統名稱。參數格式system=locale1:xxx|locale2:yyy,當直接是system=xxx時,則所有語言的系統名稱都顯示為 xxx,傳入多語糸系統名稱使用“|”來分隔,無對應語言的系統名稱時,CAS Server會取糸統默契值(如繁體中文為“單一簽入系統”)。請注意web.xml編碼encoding="UTF-8"
removeTicket:值為true或false表示登錄成功后是否在url中移除ticket,不設定默契為true。另外如果app處於移除ticket的設定時,想讓某個請求不移除ticket,則可以通過url傳值方式設定,傳值方式為removeTicket=false。
CAS client 保護資源:
不能用JEE web中通用的 <security-constraint />,而要使用它的 filter CASAuthenticationFilter進行。
CASAuthenticationFilter的默認配置如下(保護所有資源):
<filter-mapping>
<filter-name>CASAuthenticationFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
需要對*.jsp或*.zul進行保護的話,則可以改成如下:
<filter-mapping>
<filter-name>CASAuthenticationFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CASAuthenticationFilter</filter-name>
<url-pattern>*.zul</url-pattern>
</filter-mapping>
需要對/index.jsp,/protected/*進行保護的話,則可以改成如下:
<filter-mapping>
<filter-name>CASAuthenticationFilter</filter-name>
<url-pattern>/index.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>CASAuthenticationFilter</filter-name>
<url-pattern>/protected/*</url-pattern>
</filter-mapping>
訪問其它未被保護的資源時,將不需要進行驗證。
關於CAS的logout,請調用對應CAS server的/cas/logout 即可,如果希望登出後返回app頁面,可傳入service參數對應app的相關頁面,如 https://sso.pouchen.com/cas/logout?service=http://172.17.45.92:8080/test/index.jsp 登出後cas會重定位到
http://172.17.45.92:8080/test/index.jsp 上。
4 測試
用eclipse建立test工程
在WEB-INF下加入上面所編輯的 jboss-web.xml,web.xml
新建index.jsp內容如下:
<%@page contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt"%>
<%@ page import="java.util.Map"%>
<%@ page import="com.pcg.sso.cas.client.plugin.UserAttribute"%>
<!DOCTYPE HTML PUBLIC
"-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>CAS Test</title>
</head>
<body>
<h1>CAS Test</h1>
<p>now is <%=new java.util.Date()%></p>
<p><%=request.getRemoteUser()%></p>
<%
UserAttribute ua = new UserAttribute(request);
Map<String, Object> personAttrs = ua.getMap();
// 打印用戶LDAP帳號的所有屬性和值
if (null != personAttrs && !personAttrs.isEmpty()) {
for (String key : personAttrs.keySet()) {
out.println(key + " = " + personAttrs.get(key));
out.println("<br>");
}
}
// 集團員工號的key為"groupEmployeeID"可以直接通過下述方式獲得
String empId = (String)personAttrs.get("groupEmployeeID");
out.println("groupEmployeeID : " + empId + "<br>");
%>
</body>
</html>
jboss-web.xml,web.xml ,index.jsp打成 test.war(注意必須要使用war包)包發布到jboss-as-7.1.1.Final\standalone\deployments 目錄下。
使用http://CAS-Client-IP:Port/test訪問CAS-Client ,會跳轉到 CAS-Server先進行登陸,登陸成功 轉至 http://CAS-Client-IP:Port/test/index.jsp 。
5 jboss-4.2.2.GA下安裝
jboss4.2與jboss7稍有不同,變更如下
5.1 module安裝
上面2 jboss7 module安裝變為如下
安裝jdk1.7,解壓jboss-4.2.2.GA
復制cas-client-core-3.2.1.jar,opensaml-1.1.jar,cas-client-pcg.jar到 jboss-4.2.2.GA\server\default\lib
編輯jboss-4.2.2.GA\server\default\conf\login-config.xml
policy下增加子節點
<application-policy name = "cas">
<authentication>
<login-module code="com.pcg.sso.cas.client.jaas.CasLoginModule" flag="required">
<module-option name="ticketValidatorClass">
org.jasig.cas.client.validation.Saml11TicketValidator
</module-option>
<module-option name="casServerUrlPrefix">
https://sso.pouchen.com/cas
</module-option>
<module-option name="defaultRoles">eip</module-option>
<module-option name="roleAttributeNames">
memberOf,eduPersonAffiliation
</module-option>
<module-option name="roleGroupName">Roles</module-option>
<module-option name="principalGroupName">CallerPrincipal</module-option>
<module-option name="cacheAssertions">false</module-option>
<module-option name="cacheTimeout">480</module-option>
<module-option name="tolerance">60000</module-option>
<module-option name="encoding">UTF-8</module-option>
</login-module>
</authentication>
</application-policy>
5.2 webapp configuration
上面3.1 編輯standalone.xml變為如下
編緝jboss-4.2.2.GA\server\default\deploy\jboss-web.deployer\server.xml去掉服務端口訪問ip限定
調整前如下
<Connector port="8080" address="${jboss.bind.address}"
maxThreads="250" maxHttpHeaderSize="8192"
emptySessionPath="true" protocol="HTTP/1.1"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" />
調整后如下
<Connector port="8080"
maxThreads="250" maxHttpHeaderSize="8192"
emptySessionPath="true" protocol="HTTP/1.1"
enableLookups="false" redirectPort="8443" acceptCount="100"
connectionTimeout="20000" disableUploadTimeout="true" />
5.3 web.xml
上面3.3 編輯web.xml中的
CASWebAuthenticationFilter 改為
com.pcg.sso.cas.client.jboss.authentication.WebAuthenticationFilter2