风之语
posts(201)
comments(182)
trackbacks(1)
BlogJava
联系
聚合
管理
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
给我留言
查看公开留言
查看私人留言
随笔分类
ajax(1)
android(1)
apache(1)
AppFuse(1)
BIRT(1)
iText(1)
JSF(8)
kettle(1)
linux(5)
mac(1)
maven(1)
MSTR(3)
Open XML(1)
Oracle(21)
RCP
Struts(2)
Struts2(2)
SybaseIQ(6)
tapestry
tomcat(2)
weblogic(1)
webservice(1)
weka(1)
云计算(1)
收藏(31)
数据仓库(11)
架构设计(3)
生活(2)
集群(1)
项目管理(6)
随笔档案
2012年12月 (4)
2012年11月 (1)
2012年7月 (2)
2011年8月 (1)
2011年7月 (1)
2011年3月 (1)
2010年12月 (2)
2010年11月 (4)
2010年10月 (3)
2010年9月 (5)
2010年8月 (1)
2010年7月 (4)
2010年3月 (1)
2010年2月 (3)
2009年12月 (3)
2009年11月 (4)
2009年9月 (3)
2009年6月 (5)
2009年5月 (3)
2009年4月 (2)
2009年3月 (5)
2009年2月 (4)
2009年1月 (2)
2008年11月 (2)
2008年9月 (1)
2008年7月 (2)
2008年6月 (4)
2008年5月 (6)
2008年4月 (1)
2008年3月 (1)
2007年12月 (2)
2007年11月 (5)
2007年10月 (2)
2007年9月 (3)
2007年8月 (3)
2007年4月 (1)
2007年3月 (2)
2007年2月 (2)
2007年1月 (2)
2006年12月 (3)
2006年8月 (2)
2006年7月 (2)
2006年6月 (2)
2006年4月 (2)
2006年3月 (1)
2006年2月 (3)
2006年1月 (6)
2005年12月 (6)
2005年11月 (4)
2005年10月 (17)
2005年9月 (25)
2005年8月 (16)
2005年7月 (8)
相册
技术图片
收藏夹
java
link
My wife
My wife's blog
最新随笔
1. apache修改最大连接并用ab网站压力测试
2. Vm虚拟机访问本地硬盘文件
3. NFS文件无法写入的权限问题
4. weblogic设置上传文件访问权限
5. 在android上动态实现ichartjs的3D柱形图
6. 使用Oracle trunc 来指定精确的年月日时分秒
7. Quartz 2.1.5 web应用配置
8. LoginAny 使用笔记
9. MyEclipse 无响应的几种解决办法
10. java.sql.SQLException: No more data to read from socket
搜索
积分与排名
积分 - 399187
排名 - 139
最新评论
1. re: 使用Oracle trunc 来指定精确的年月日时分秒[未登录]
政治
--张三
2. re: 干掉流氓软件vrvrf_c.exe,vrvedp_m.exe[未登录]
`
--1
3. re: 无需刻录DMG光盘,教你在VMWare下安装MAC OS X Snow Leopard 10.6
我走到了换DMG映像的时候,然后就没有反应了,这个是什么情况,是不是我的映像文件有问题,还是。。。。
--玉竹常青
4. re: LoginAny 使用笔记
怎么没一个人留言,现在来是不是在挖坟啊
--ellipse
5. MSTR web应用的部署[未登录]
请问,如何用oracle Application Server服务器部署mstr web应用?
--rocky
阅读排行榜
评论排行榜
View Post
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 的登录信息。
下面就几种不同的模式进行介绍:
Web Universal 作为单独的Web 应用使用
使用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 的用户名和密码。
[模式三] 与 SUN 的Identity Server 进行集成,SSO 软件进行集成,
客户化方式同模式二,特殊的是:
步骤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 的包:
view plain
copy to clipboard
print
?
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"
);
}
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 中利用下面的代码:
view plain
copy to clipboard
print
?
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
;
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
风
阅读(1998)
评论(3)
编辑
收藏
所属分类:
MSTR
View Comments
#
re: MSTR实现单点登陆
回复
更多评论
请教下:mstr部署后,如何实现匿名访问呢?谢谢!!
emmy_lee@126.com
2011-06-24 16:26 |
emmy
#
re: MSTR实现单点登陆
回复
更多评论
@emmy
已解决。谢谢!!
2011-06-27 16:22 |
emmy
#
MSTR web应用的部署[未登录]
回复
更多评论
请问,如何用oracle Application Server服务器部署mstr web应用?
2011-11-07 10:04 |
rocky
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
知识库
C++博客
博问
管理
相关文章:
mstr文档添加超链的方法
获取mstr下的报表列表reportViewMode类型的方法
MSTR实现单点登陆