MSTR實現(xiàn)單點登陸
MicroStrategy Web 的設(shè)計模式MicroStrategy Web 應(yīng)用的實現(xiàn)方式是使用類似Struts 的MVC 模式,整個應(yīng)用的核心是一個servlet 作為MVC 中的Controller 。所有的請求都發(fā)送給這個servlet,按照默認(rèn)的web.xml 中的定義,這個servlet 名稱是 mstrWeb, mstrWeb 只接受兩種參數(shù)evt=或者頁面參數(shù) pg=通過在客戶自己的應(yīng)用中,通過URL 就可以訪問已經(jīng)訂制的報表、文檔或者某個特定頁面(例如 共享報表頁面)
MicroStrategy Web 的URL 參數(shù)說明
h ttp:/ /210.82.33.248/MicroStrategy/servlet/mstrWeb?evt=4001&src=mstrWeb.4001&reportViewMode=1&reportID=D08450DF4E71E2068B9AE78845C1BA28&Port=0&Project=MicroStrategy+Tutorial&Server=FBI&Uid=xxx&Pwd=xxx
在MicroStrategy Web 中要執(zhí)行一個報表、或者訪問一個已知的頁面的時候,需要必要的認(rèn)證信息,從request 或者session 中需要提供的五個最基本認(rèn)證參數(shù)如下:
Server ---- Intelligence Server 的HostName 或者IP 地址
Port –--- Interlligence Server 的監(jiān)聽端口,0 表示默認(rèn)的端口
Project –--- 項目名稱
Uid –--- MSTR 用戶名
Pwd –--- MSTR 口令
在具體的應(yīng)用集成中,往往要求業(yè)務(wù)用戶在登陸業(yè)務(wù)系統(tǒng)后,在調(diào)用MicroStrategy 的時候,不需要再次輸入用戶信息,即單點認(rèn)證。在具體實現(xiàn)中,MicroStrategy Web 將上面的五個認(rèn)證基本參數(shù),封裝在一個內(nèi)部對象中WebIServerSession。每個WebIServerSession 的實例代表一個用戶的連接,其中WebIServerSession 代表在Intelligence Server 中的一個用戶會話,這個會話通過sessionID進(jìn)行唯一的標(biāo)識。
MicroStrategy Web 對SSO 的支持—ExternalSecurity
MicroStrategy Web 提供ExternakSecurity 機(jī)制,來支持SSO。External Security 提供如下的接口,這些接口實現(xiàn)以后的客戶自定義的ExternalSecurity 通過web.xml 的配置加入到現(xiàn)有的Web 應(yīng)用中,供MicroStratey Web使用。在用戶首次訪問MicroStratey Web 的時候,或者是簽退后重新訪問的時候, Web應(yīng)用會調(diào)用實現(xiàn)中的handlesAuthenticationRequest 的方法,其返回值一共三種,根據(jù)返回的參數(shù)的不同,Web 應(yīng)用會調(diào)用ExternalSecurity 實現(xiàn)中的不同函數(shù),參見下:

通用的實現(xiàn)ExternalSecurity 步驟流程
1、繼承 AbstractExternalSecurity 父類,實現(xiàn)代碼public class WithSUN_ExternalSecurity extends AbstractExternalSecurity { ... ...
2、編譯的類,打成jar 放在 web-inf/lib 下,或者按照包路徑放在 web-inf/classes 下
3、修改 web.xml 中的 mstrWeb Servlet 配置中的 ExternalSecurityClass 參數(shù),注釋原有的參數(shù),使用用戶定義的類,例如
<param-name>externalSecurityClass</param-name>
<!--param-value>com.microstrategy.web.app.DefaultExternalSecurity</param-value-->
<param-value>com.fbi.WithSUN_ExternalSecurity</param-value>
</init-param>
在不同的項目中,根據(jù)集成模式的不同,會有不同的集成模式。解決這個問題的核心是如何根據(jù)傳入的TOKEN 或者信息獲取對應(yīng)的MSTR 的登錄信息。
下面就幾種不同的模式進(jìn)行介紹:
使用MicroStrategy 的登陸界面,(或者自定義的Login 頁面)進(jìn)行登陸。這個時候用戶輸入的是外部用戶的業(yè)務(wù)ID,以及Password。
[解決方式] 通過定義ExternalSecurity 類,實現(xiàn)用戶輸入的用戶信息和MicroStrategy 之間用戶的轉(zhuǎn)換。通常是基于數(shù)據(jù)庫用戶信息表,通過輸入的信息映射到MSTR 的用戶信息。使用到了數(shù)據(jù)庫表來存儲用戶名和密碼。
[需要附加的包]
SQL Server 的 JDBC 包: jtds-0.9.jar
Oracle 的JDBC 包:
模式二 用戶有自己的Web 應(yīng)用,需要調(diào)用MicroStrategy Web 的應(yīng)用
這種模式下不會提供MSTR 的任何登錄的頁面,但是要求從發(fā)起調(diào)用的Web 應(yīng)用,在訪問MicroStrategy,需要通過Session 或者 Request 傳遞某個參數(shù)給MicroStrategy。
簡化的實現(xiàn)是:在Web 應(yīng)用調(diào)用handlesAuthenticationRequest 的時候返回常數(shù)COLLECT_SESSION_NOW;
然后Web 應(yīng)用會調(diào)用getWebIServerSession 方法,在getWebIServerSession 中系統(tǒng)會傳遞兩個參數(shù),RequestKeys 和 ContainerServices,其中前者是對httpRequest 的封裝,后者則是對httpSession 的封裝。需要在這個方法中返回一個WebIServerSession 的實例。
接下來,Web應(yīng)用會調(diào)用底層的API 創(chuàng)建相應(yīng)的Session,并將session 交于SessionManager(內(nèi)部對象)維護(hù)。
注意一個問題,傳入的這個參數(shù),可以考慮加密處理,可以將登錄MSTR 的用戶名和密碼信息加密后直接傳入。另外更可為的方式為傳入某一個臨時的Key利用 Key 從數(shù)據(jù)庫,或者其他位置獲得登陸MSTR 的用戶名和密碼。
客戶化方式同模式二,特殊的是:
步驟1: 需要修改Web 的描述文件web.xml,將應(yīng)用配置使用SUN SSO 認(rèn)證,這樣當(dāng)未認(rèn)證的用戶訪問Web Universal 的時候,會進(jìn)入SUN SSO 的登錄界面。
樣例,具體項目需要參考SUN 的文檔
- <filter>
<filter-name>Agent1</filter-name>
<filter-class>com.sun.amagent.as.filter.AgentFilter</filter-class>
</filter>
- <filter>
<filter-name>Agent2</filter-name>
<filter-class>com.sun.amagent.as.filter.AgentFilter</filter-class>
</filter>
- <filter-mapping>
<filter-name>Agent1</filter-name>
<url-pattern>/servlet/*</url-pattern>
</filter-mapping>
- <filter-mapping>
<filter-name>Agent2</filter-name>
<url-pattern>/userinfo/*</url-pattern>
</filter-mapping>
步驟2:當(dāng)用戶輸入統(tǒng)一的用戶身份信息后,認(rèn)證成功后,進(jìn)入MicroStrategy 的界面,Web Universal 會調(diào)用External Security 模塊。
在handleAuthentication 或者 getWebIServerSession 中獲得SUN Identity 的Token,調(diào)用SUN SSO Client 的API,需要import SUN 的包:
- import com.iplanet.sso.*;
- import com.iplanet.am.sdk.*;
- import com.sun.identity.authentication.*;
- //另外調(diào)用SUN 的API 獲得認(rèn)證成功后的令牌 Token,代碼片斷如下:
- SSOTokenManager manager = SSOTokenManager.getInstance();
- SSOToken ssoToken = manager.createSSOToken(reqKeys);
- if(manager.isValidToken(ssoToken))
- {
- AMStoreConnection dpsc = new AMStoreConnection(ssoToken);
- AMUser dpUser = dpsc.getUser(ssoToken.getPrincipal().getName());
- uid = dpUser.getStringAttribute("uid");
- cn = dpUser.getStringAttribute("cn");
- employeeNo = dpUser.getStringAttribute("employeenumber");
- alias = dpUser.getStringAttribute("iplanet-am-user-alias-list");
- mail = dpUser.getStringAttribute("mail");
- entrydn = dpUser.getStringAttribute("entrydn");
- }
通過認(rèn)證源的返回的信息,如果正常,那么需要根據(jù)其他的信息獲得MSTR 的登錄信息。
否則,需要參見下面 [關(guān)于認(rèn)證失敗的處理]
樣例1: 用戶自己開發(fā)了portal,實現(xiàn)集中的認(rèn)證源,那么需要在External Sercurity 類的handelAuthentication 或者getWebIServerSession 中利用下面的代碼:
- URL url=new URL("http://portal.xbxs.petrochina:38081/ssoauth/SSOValidate?tokenID=" + tokenId);
- URLConnection con=url.openConnection();
- con.setUseCaches(false);
- java.io.BufferedReader br = new BufferedReader(new InputStreamReader(con.getInputStream()));
- String line= br.readLine();
- while(null != line){
- if (line.indexOf("SUCCESS")>-1) break;
通過認(rèn)證源的返回的信息,如果正常,那么需要根據(jù)其他的信息獲得MSTR 的登錄信息。
否則,需要參見下面 [關(guān)于認(rèn)證失敗的處理]。
第一種方法是:在 getwebiserversession 中,用提供的credential 創(chuàng)建session,如果創(chuàng)建session 不成功,getwebiserversession 會自動return null。這時getfailureurl 方法會被call with reason =1??梢栽趃etfailureurl 方法中指定reason=1 時出現(xiàn)的錯誤信息頁面的url
第二個方法是:
1. 在handlehandlesAuthenticationRequest 中用非建立session 的方法驗證credential
2. 如果驗證ok,就call getWebIServerSession,create mstr session
3. 如果驗證不ok,就call getCustomLoginURL, 然后在getCustomLoginURL 方法中,指定error page 的url
這兩個方法那個更好,取決于如何驗證mstr credential。如果credential 只能通過session是不是null 來驗證,就用方法1。如果是通過其他方法驗證credential,就用方法2。
posted on 2009-02-12 17:23 風(fēng) 閱讀(2010) 評論(3) 編輯 收藏 所屬分類: MSTR