互联网服务商业智能

Cognos单点登录问题

这两天都在研究Cognos的单点登录问题,首先说说自己对单点登录的一些认识,一般Cognos集成单点登录都是在系统已经有一套用户权限的情况下,而客户要求在登录了原有的系统使同时登录Cognos。用户权限可以通过Java SDK认证实现,但是如何实现同时登录Cognos呢?目前我会的是通过URL方式通过在报表后面添加CAMUsername=admin&CAMPassword=admin或者m_passportID=101:e521af37-bd65-ccba-965f-728deb1ac622:0580892245,随着研究的深入,我觉得这样的方式并不是我理解中的单点登录
下面是我这两天研究出来的一段程序,我觉的比较接近答案了,但是还没实现,但我觉得这样的方式应该才是Cognos单点登录好的方式,大家有时间帮我瞧瞧问题出在哪里?
public class CognosLogin extends HttpServlet {
private static final long serialVersionUID = 1L;
@Override
public void doPost(HttpServletRequest req, HttpServletResponse resp)
   throws ServletException {
  String url = "http://xxx.xxx.xxx.xx/cognos10/cgi-bin/cognos.cgi";
  ContentManagerService_ServiceLocator cmServiceLocator = new ContentManagerService_ServiceLocator();
  ContentManagerService_PortType cmService = null;
  try {
   cmService = cmServiceLocator
     .getcontentManagerService(new java.net.URL(url));
  } catch (MalformedURLException e) {
   e.printStackTrace();
  } catch (ServiceException e) {
   e.printStackTrace();
  }
  StringBuffer credentialXML = new StringBuffer();
  credentialXML.append("");
  credentialXML.append("").append("SunOne").append(
    "
");
  credentialXML.append("").append("admin").append(
    "
");
  credentialXML.append("").append("admin").append(
    "
");
  credentialXML.append("
");
  String encodedCredentials = credentialXML.toString();
  try {
     cmService.logon(new XmlEncodedXML(encodedCredentials),new SearchPathSingleObject[] {});
  } catch (RemoteException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  BiBusHeader cmBiBusHeader = null;
  SOAPHeaderElement temp = ((Stub) cmService).getResponseHeader(
    "http://developer.cognos.com/schemas/bibus/3/", "biBusHeader");
  cmBiBusHeader = BIBusHeaderHelper.getHeaderObject(temp, true, "");
  ((Stub) cmService).setHeader(
    "http://developer.cognos.com/schemas/bibus/3/", "biBusHeader",
    cmBiBusHeader);
  Cookie newCookie = null;
  for (int i = 0; i < cmBiBusHeader.getHdrSession().getSetCookieVars().length; i++) {
      newCookie = new Cookie(cmBiBusHeader.getHdrSession()
     .getSetCookieVars().getName(), cmBiBusHeader
     .getHdrSession().getSetCookieVars().getValue());
     newCookie.setDomain("xxx.xxx.xxx.xx");
     newCookie.setMaxAge(-1);
     newCookie.setPath("/");
     resp.addCookie(newCookie);
  }
  
}
我验证单点登录成功的方法为:如果这段程序执行成功了话,那么我在浏览器中直接输入http://xxx.xxx.xxx.xx/cognos10/cgi-bin/cognos.cgi是不用输入用户名和密码可以直接进入的。还请大家多多帮忙
参与27

24同行回答

伤心的贼伤心的贼软件开发工程师恒拓开源
回复  伤心的贼     不知道,兄弟有具体的代码实现?可否贴上来我参考下呢? ...jhhn945 发表于 2013-8-13 17:13     我这没有。我这用的是直接拼接m_passportid参数的方案,拦截器的方案我没弄,麻烦- -。还得重写个拦截器。代码我没有,给你一个网...显示全部
回复  伤心的贼


    不知道,兄弟有具体的代码实现?可否贴上来我参考下呢? ...
jhhn945 发表于 2013-8-13 17:13



    我这没有。我这用的是直接拼接m_passportid参数的方案,拦截器的方案我没弄,麻烦- -。还得重写个拦截器。
代码我没有,给你一个网站,你可以去看看。这个有别人实现的思路和部分代码讲解。
无非就是servlet,拦截你的请求,你判断是cognos的连接请求,就sdk登录服务器,然后在cognos的请求后面拼接凭证参数,然后转发。OK,解决了。不是cognos的请求就直接转发。
http://www.blogjava.net/xcp/archive/2010/04/13/318125.html

其实,拼接m_passportid也能够实现了,而且安全方面也有保证,对于客户来说,和你的那个想法方案没有任何体验的不同。无非就是前台拼接url和后台拼接url的实现不同。收起
软件开发 · 2013-08-13
浏览1230
sealinksealink技术总监sealink.com
回复  sealink     第一种会暴露用户信息(虽然可以通过JS方式隐藏,但是还是可以获取的到),第二中可 ...winyee 发表于 2013-8-7 16:55 其实在系统中,我们多cognos权限的限制很少,展示用第三方,当成一个登陆的工具,就能用户也是一对多的,登陆cognos不需要那么...显示全部
回复  sealink


    第一种会暴露用户信息(虽然可以通过JS方式隐藏,但是还是可以获取的到),第二中可 ...
winyee 发表于 2013-8-7 16:55


其实在系统中,我们多cognos权限的限制很少,展示用第三方,当成一个登陆的工具,就能用户也是一对多的,登陆cognos不需要那么多用户。

很多权限的控制不在cognos的系统管理中设置,所以多cognos的安全性也没要求那么高。收起
银行 · 2014-09-09
浏览2188
我的名字叫白我的名字叫白软件开发工程师上海安硕
回复 2# sealink     请问下,拼接CAMUsername=张三&CAMPassword=密码,这样的方式需要什么前提吗,我可以直接拼接在某张报表的URL后面然后打开吗?张三是可以单独登录进Cognos的。显示全部
回复 2# sealink


    请问下,拼接CAMUsername=张三&CAMPassword=密码,这样的方式需要什么前提吗,我可以直接拼接在某张报表的URL后面然后打开吗?张三是可以单独登录进Cognos的。收起
软件开发 · 2014-09-04
浏览2411
我的名字叫白我的名字叫白软件开发工程师上海安硕
回复 16# winyee     刚开始弄单点登录,请问下,passportid接到报表url后面登录是怎么弄呢?有没有哪篇帖子说到?显示全部
回复 16# winyee


    刚开始弄单点登录,请问下,passportid接到报表url后面登录是怎么弄呢?有没有哪篇帖子说到?收起
软件开发 · 2014-08-28
浏览2179
wljf520wljf520软件开发工程师kuodazixun
回复 21# mzk365    最后我是现在系统中嵌入一个空白的报表url,然后再展示真正需要展示的报表显示全部
回复 21# mzk365


   最后我是现在系统中嵌入一个空白的报表url,然后再展示真正需要展示的报表收起
IT咨询服务 · 2014-05-16
浏览2185
mzk365mzk365软件开发工程师sun
回复  sealink     我用的也是这种,直接在后面拼接的,但是在登陆的时候,有点时候 会出现需要输入name ...wljf520 发表于 2014-2-16 23:34    我是在portal系统里,通过嵌入iframe方式,显示cognos,在url后带m_passportid参数,  总是出...显示全部
回复  sealink


    我用的也是这种,直接在后面拼接的,但是在登陆的时候,有点时候 会出现需要输入name ...
wljf520 发表于 2014-2-16 23:34



   我是在portal系统里,通过嵌入iframe方式,显示cognos,在url后带m_passportid参数,  总是出现登录窗口,请问我应该怎么解决收起
互联网服务 · 2014-04-27
浏览2177
mzk365mzk365软件开发工程师sun
回复  sealink     我现在用passportid接到报表url后面登录的,但是过一段时间再登陆就会显示发生内部错 ...lsxljx1219 发表于 2013-9-10 22:15 我跟你的情况一样,请问你最后是怎么解决的?...显示全部
回复  sealink


    我现在用passportid接到报表url后面登录的,但是过一段时间再登陆就会显示发生内部错 ...
lsxljx1219 发表于 2013-9-10 22:15





我跟你的情况一样,请问你最后是怎么解决的?收起
互联网服务 · 2014-04-27
浏览2195
mzk365mzk365软件开发工程师sun
回复 14# lsxljx1219 显示全部
回复 14# lsxljx1219 收起
互联网服务 · 2014-04-27
浏览2206
wljf520wljf520软件开发工程师kuodazixun
回复 2# sealink     我用的也是这种,直接在后面拼接的,但是在登陆的时候,有点时候 会出现需要输入namespace的情况,但是一点击确定的时候 却会报错,进入系统后,刷新一下页面就好了,不知道这个是什么问题,这个问题是时而有,时而无的,还不知道怎么解决啊...显示全部
回复 2# sealink


    我用的也是这种,直接在后面拼接的,但是在登陆的时候,有点时候 会出现需要输入namespace的情况,但是一点击确定的时候 却会报错,进入系统后,刷新一下页面就好了,不知道这个是什么问题,这个问题是时而有,时而无的,还不知道怎么解决啊收起
IT咨询服务 · 2014-02-16
浏览2150
lcyaolcyao软件开发工程师VP科技股份有限公司
有点高深.......显示全部
有点高深.......收起
银行 · 2014-01-10
浏览2235

提问者

winyee
软件开发工程师东软集团
擅长领域: 商业智能大数据cognos

相关问题

相关资料

问题状态

  • 发布时间:2013-08-07
  • 关注会员:1 人
  • 问题浏览:13738
  • 最近回答:2014-09-09
  • X社区推广