马上就要2016农历新年了,送点什么给大家呢?我觉得还是分享点技术吧。前不久用户在抱怨为什么登录Cognos Connection的密码不能让我们自己改?相信Cognos开发的很多人知道,Cognos门户中没有提供用户管理的模块,比如添加用户,修改用户密码等基本操作,原因我也不知道为什么。对了,上面说的是Cognos10以及以下的版本,听说Cognos11发布了,有没有这些基本功能就不知道了,因为试用版的下载地址我也一直没有下载成功过,IBM毕竟是美国的,当然这里不谈政治,只谈技术。下面我就把Cognos10如何修改用户密码的解决方案之一分享给大家,也为自己2015年技术分享画上一个句号。
一:配置环境
操作系统:Win10 专业版操作系统
数据库环境:SQLServer2008 R2
Cognos Server版本:IBM Cognos Bussiness Inteligence 10.2.1
Cognos FM版本:IBM Cognos FrameWork Manager10.2.1
Cognos认证方式:基于CJAP的Cognos第三方用户认证
二:功能描述
不借助任何第三方工具,在Report Studio中实现类似Form表单实现对Cognos用户密码的修改功能,让使用者在Cognos Connection中可以自己维护自己的密码信息,从而减少开发人员在后台对用户密码的修改工作。
三:开发步骤
3.1:存储过程部分
在Cognos用户认证库创建一个带参数的存储过程,该存储过程有两个参数,一个就是用户名,一个就是用户的新密码,如下面的脚本所示
CREATE PROCEDURE [dbo].[UpdatePwd] ( @username NVARCHAR(50), @newpwd NVARCHAR(50) ) AS update dbo.PT_User set Password=@newpwd where UserName=@username SELECT @@ROWCOUNT as "is_update" --如果@@ROWCOUNT=1则说明受影响1行,表示修改成功
测试上面的存储过程,如下图所示
执行结果查看,返回1表示执行成功
查看用户表,可以看到用户密码为111111修改成功
3.2:FM建模部分
创建一个查询主题,查询主题调用的是我们3.1中创建的存储过程,具体设置如下图所示
注意上图中红色线圈起来的值设置:username和newpwd都是采用宏函数的形式进行传参的,从而保证不同的用户登录username是可变的,以及用户
从前端输入的密码是自定义的,具体表达式如下图所示
用户名宏函数表达式
新密码宏函数表达式
测试一下查询主题
如果用户admin的密码被初始为缺省状态000000那么则说明查询主题设计OK
3.3:RS设计部分
选择我们查询主题所在的数据包,发布到CognosConnection,然后新建一个RS
3.3.1:新建一个提示页面1,如下图所示
HTML处的代码如下图所示,作用是生成一个提交button以及完成表单的验证工作
<script> function update() { var form=getFormWarpRequest(); var pass=form._textEditBoxpass.value; var againpass=form._textEditBoxagainpass.value; if(pass == "" || againpass == "") { alert("新密码不能为空!请输入密码!"); return false; } else if(pass!=againpass ) { alert("两次输入的密码不一致,请重新输入!"); return false; } else { promptButtonFinish(); } } </script> <button type="button" name="finishN15E390E0x165E83C8RS" id="finishN15E390E0x165E83C8RS" class="bp" οnmοuseοver="this.className = 'bp bph'" οnmοuseοut="this.className = 'bp'" οnclick="update()" style="padding-left:10px;padding-right:10px;">完成</button>
3.3.2:返回页面1,如下图所示
[重新登录]是一个超级链接按钮,地址为
http://localhost:9300/p2pd/servlet/dispatch?b_action=xts.run&m=portal/logoff.xts&h_CAM_action=logoff
密码修改结果是一个数据项,表达式为
if([物理层].[update_password].[is_update]=1) then ('密码修改成功!') else ('密码修改失败!')
3.4:功能测试部分
运行报表,在报表输入新密码,验证非空,和二次密码输入如下图‘
非空验证
密码二次输入验证
填写正确提交修改
查看数据库看是否是我填的123456
点击重新登录按钮,注销然后重新登录
再次登录用新密码123456,登录成功
四:答疑与扩展
4.1:方案答疑
4.1.1:UI解疑
提示页面的输入框如何设置为隐藏形式,即密码框形式?
如下图所示,设置文本框空间的隐藏文本属性即可
4.1.2:调用解疑
RS什么时候调用了存储过程?
我们提示页面没有做任何操作,但是页面1里面有一个数据项的表达式是
if([物理层].[update_password].[is_update]=1) then ('密码修改成功!') else ('密码修改失败!')
这个数据项在页面1展示,由于update_password是来自于引用存储过程的查询主题的
也需要注意:如果想让RS调用到存储,那么存储过程中的项 目必须在页面中被查询出来
4.2:扩展1:开发自定义JAVA程序
是否可以开发一个具有修改密码功能的java程序,把程序导出为jar放入到Cognos安装目录,然后在前端调用
4.3:扩展2:RS调用JQuery,AjaX等实现表单的提交
是否可以基于高级JS功能完成和数据库的异步通讯,从而实现修改数据库的密码
4.4:扩展3:优缺点分析
优点:本方案仅仅通过一个RS页面就可以让用户完成修改自己密码的功能,是最简化的方案之一,可移植性很高,通过这个案例,我们也可以考虑更复杂的用户和角色的管理也通过这样的方法来实现.
缺点:还是要依赖Cognos本身的UI,比如修改完密码后的返回页面,即注销后的页面,Cognos的本身页面是很丑的,目前还没有找到修改这个页面的地方,或者说是更改Cognos
Logoff的返回地址为登录页
The End :2016年1月26日21:33:42