背景介绍:
广州XXX公司是一家从事日用品生产的专业化公司。目前采购了我们公司的EKP系统、SAP系统和IBM的BW(数据仓库)系统,由于SAP的License比较昂贵,为了节省License,客户希望从EKP登录SAP之后,所有的用户使用同一个SAP帐号,而该用户能访问哪些报表或数据的权限信息在EKP中进行维护和管理。
它们之间的逻辑关系如下:
EKP -> BW -> SAP
BW负责从SAP基础数据库中抽取数据并生成报表
EKP负责从BW中抓取客户需要的报表并展现出来
关键问题:
要解决以上问题,有两个关键技术点需要解决:
1. EKP跟SAP之间的单点登录
2. 由于访问BW报表是通过URL带参数的方式来传递的,所以必须保证权限参数不被泄漏出去
解决方案(一):
1. 单点登录
对于单点登录,由于SAP支持Form认证,所以该功能很容易就实现了。实现的代码样例如下:(注意下表中的红色字体)
<html>
<FORM name="logonForm" method="post" action="http://bwdq.liby.com.cn:50200/logon/logonServlet?j_user=sangq&j_password=980401&redirectURL=/irj/servlet/prt/portal/prtroot/pcd!3aportal_content!2fcom.sap.pct!2fplatform_add_ons!2fcom.sap.ip.bi!2fiViews!2fcom.sap.ip.bi.bex?QUERY=TEST2&VARIABLE_SCREEN=X&DUMMY=6">
<input style="WIDTH: 21ex" class="urEdfTxtEnbl" id="logonuidfield" name="j_user" type="text" value="sangq" title="用户 ID *">
<input style="WIDTH: 21ex" class="urEdfTxtEnbl" id="logonpassfield" name="j_password" type="password" value="980401" title="用户密码">
<input style="height:3ex;" class="urBtnStd" type="submit" name="uidPasswordLogon" value="登录">
</FORM>
<script>document.forms[0].submit()</script>/
</html>
2. 参数安全
A、方案一
由于我第一次去XXX公司,不认识IBM的顾问,也不知道IBM还有个项目团队在XXX公司,更不认识IBM的项目经理,在IBM项目经理缺席的情况下,我们三方初步确定了以下方案:
1. EKP开发一套权限管理,用户能访问哪些报表由权限管理来控制。
2.用户登录EKP之后立即登录SAP,获取单点登录需要的Session。
3.当用户点击报表时,EKP将该报表需要的权限参数加密,也就是说将上表中的&VARIABLE_SCREEN=X&DUMMY=6加密成串,然后将该加密串送给BW。
4. BW开发一个专门用来解密权限参数的接收页面,根据解密后的结果BW负责Open相关的报表。
方案确定后,我们公司方开始技术预研并通过了测试。但是,IBM方项目经理来了之后否决了该方案,原因是在XXX公司的IBM项目团队中没有懂JAVA开发的人员,他也很难申请到JAVA开发人员来支持,在他的强烈要求下,我们采取了第二种方案。
B、方案二
1.EKP开发一套权限管理,用户能访问哪些报表由权限管理来控制。
2.用户登录EKP之后立即登录SAP,获取单点登录需要的Session。
3.当用户点击报表时,EKP将该报表需要的权限参数取出来,后台提交给一个公共页面,该页面内嵌BW的报表页面,它的唯一作用就是隐藏参数,保证参数不被泄漏。
4.同时为了降低风险,将EKP用户的权限限制在一个可控的范围之内,EKP还需要开发一套帐号映射管理,它是用来控制EKP用户进入SAP时是用哪个身份登录的,多个EKP帐号映射一个SAP帐号,这样,在BW中,BW可以将不同的SAP用户限制在不同的报表上。
方案确定后,我们公司方调整了技术方案并通过了测试。