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

通用的實現ExternalSecurity 步驟流程
1、繼承 AbstractExternalSecurity 父類,實現代碼public class WithSUN_ExternalSecurity extends AbstractExternalSecurity { ... ...
2、編譯的類,打成jar 放在 web-inf/lib 下,或者按照包路徑放在 web-inf/classes 下
3、修改 web.xml 中的 mstrWeb Servlet 配置中的 ExternalSecurityClass 參數,注釋原有的參數,使用用戶定義的類,例如
<param-name>externalSecurityClass</param-name>
<!--param-value>com.microstrategy.web.app.DefaultExternalSecurity</param-value-->
<param-value>com.fbi.WithSUN_ExternalSecurity</param-value>
</init-param>
在不同的項目中,根據集成模式的不同,會有不同的集成模式。解決這個問題的核心是如何根據傳入的TOKEN 或者信息獲取對應的MSTR 的登錄信息。
下面就幾種不同的模式進行介紹:
使用MicroStrategy 的登陸界面,(或者自定義的Login 頁面)進行登陸。這個時候用戶輸入的是外部用戶的業務ID,以及Password。
[解決方式] 通過定義ExternalSecurity 類,實現用戶輸入的用戶信息和MicroStrategy 之間用戶的轉換。通常是基于數據庫用戶信息表,通過輸入的信息映射到MSTR 的用戶信息。使用到了數據庫表來存儲用戶名和密碼。
[需要附加的包]
SQL Server 的 JDBC 包: jtds-0.9.jar
Oracle 的JDBC 包:
模式二 用戶有自己的Web 應用,需要調用MicroStrategy Web 的應用
這種模式下不會提供MSTR 的任何登錄的頁面,但是要求從發起調用的Web 應用,在訪問MicroStrategy,需要通過Session 或者 Request 傳遞某個參數給MicroStrategy。
簡化的實現是:在Web 應用調用handlesAuthenticationRequest 的時候返回常數COLLECT_SESSION_NOW;
然后Web 應用會調用getWebIServerSession 方法,在getWebIServerSession 中系統會傳遞兩個參數,RequestKeys 和 ContainerServices,其中前者是對httpRequest 的封裝,后者則是對httpSession 的封裝。需要在這個方法中返回一個WebIServerSession 的實例。
接下來,Web應用會調用底層的API 創建相應的Session,并將session 交于SessionManager(內部對象)維護。
注意一個問題,傳入的這個參數,可以考慮加密處理,可以將登錄MSTR 的用戶名和密碼信息加密后直接傳入。另外更可為的方式為傳入某一個臨時的Key利用 Key 從數據庫,或者其他位置獲得登陸MSTR 的用戶名和密碼。
客戶化方式同模式二,特殊的是:
步驟1: 需要修改Web 的描述文件web.xml,將應用配置使用SUN SSO 認證,這樣當未認證的用戶訪問Web Universal 的時候,會進入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:當用戶輸入統一的用戶身份信息后,認證成功后,進入MicroStrategy 的界面,Web Universal 會調用External Security 模塊。
在handleAuthentication 或者 getWebIServerSession 中獲得SUN Identity 的Token,調用SUN SSO Client 的API,需要import SUN 的包:
- import com.iplanet.sso.*;
- import com.iplanet.am.sdk.*;
- import com.sun.identity.authentication.*;
- //另外調用SUN 的API 獲得認證成功后的令牌 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");
- }
通過認證源的返回的信息,如果正常,那么需要根據其他的信息獲得MSTR 的登錄信息。
否則,需要參見下面 [關于認證失敗的處理]
樣例1: 用戶自己開發了portal,實現集中的認證源,那么需要在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;
通過認證源的返回的信息,如果正常,那么需要根據其他的信息獲得MSTR 的登錄信息。
否則,需要參見下面 [關于認證失敗的處理]。
第一種方法是:在 getwebiserversession 中,用提供的credential 創建session,如果創建session 不成功,getwebiserversession 會自動return null。這時getfailureurl 方法會被call with reason =1。可以在getfailureurl 方法中指定reason=1 時出現的錯誤信息頁面的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 風 閱讀(2008) 評論(3) 編輯 收藏 所屬分類: MSTR