起步软件技术论坛
搜索
 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 20407|回复: 26

[分享] 利用X5平台开发银行代管系统,增加指纹扫描登录模块

  [复制链接]

377

主题

2594

帖子

5117

积分

论坛元老

Rank: 8Rank: 8

积分
5117
QQ
发表于 2015-2-28 21:12:06 | 显示全部楼层 |阅读模式
版本: X5.2.7 小版本号:
数据库: 服务器操作系统: 应用服务器:
客户端操作系统: 浏览器:
利用X5为某银行开发代管业务系统。出于安全性考虑,客户要求用户登录系统时,不仅要输入用户名,密码还要求核对指纹。在login界面中,由于还没有拿到session,前后台数据传输与普通动作调用不一样,特地把这个模块拿出来与大家分享。

指纹仪用的是浙江维尔科技股份有限公司的JZT-988型号的指纹仪
指纹仪图片


无标题1111.png

指纹比对的实现过程如下图所示:
无标题.png

评分

参与人数 2威望 +22 收起 理由
wgs7909 + 20 很给力!
ooopopdj + 2 很给力!

查看全部评分

长春鱼熊企业管理咨询有限公司



X5开发出入库培训视频
(出处: 起步论坛)

377

主题

2594

帖子

5117

积分

论坛元老

Rank: 8Rank: 8

积分
5117
QQ
 楼主| 发表于 2015-2-28 21:28:32 | 显示全部楼层
浙江维尔科技提供了一个前台页面实现的案例,用来帮助大家学习他的指纹仪接口
备注:目前这个接口只支持IE,不支持chrome,其他浏览器还没有进行测试

维尔指纹控件.rar

335.9 KB, 下载次数: 1606

评分

参与人数 1 +30 收起 理由
jishuang + 30 赞一个!

查看全部评分

长春鱼熊企业管理咨询有限公司



X5开发出入库培训视频
(出处: 起步论坛)
回复 支持 1 反对 0

使用道具 举报

377

主题

2594

帖子

5117

积分

论坛元老

Rank: 8Rank: 8

积分
5117
QQ
 楼主| 发表于 2015-2-28 21:37:30 | 显示全部楼层
在登录界面中总体思路:
用户按完指纹后,拿到字符串格式的指纹特征码,把这个指纹特征码借助用户名,密码的通道传到后台去与存在数据库中的该用户指纹模板做匹配(与验证密码在同一个模块)
长春鱼熊企业管理咨询有限公司



X5开发出入库培训视频
(出处: 起步论坛)
回复 支持 1 反对 0

使用道具 举报

377

主题

2594

帖子

5117

积分

论坛元老

Rank: 8Rank: 8

积分
5117
QQ
 楼主| 发表于 2015-2-28 21:45:26 | 显示全部楼层
本帖最后由 Masion 于 2015-2-28 21:54 编辑

在 /UI/portal/system/js/login.js 中修改 doLogin 函数
  1. doLogin: function(){
  2.                
  3.                 //登录处理程序
  4.                 var msg = this.doGetDefaultCheckMsg();                                                                //拿到默认的msg信息
  5.                 if (msg) {                                                                                //如果msg有内容
  6.                         this.items.hintLable && this.items.hintLable.text(msg).show();        //显示msg内容
  7.                         return;                                                                                //退出登录
  8.                 }
  9.                 this.items.loadingImage && this.items.loadingImage.show();                        //显示登录进度图片
  10.                 this.doDisabledInput(true);                                                                                        //在登录过程中,禁止利用输入框重新输入内容
  11.                 if (typeof $.jpolite.Login._error_count_ == "undefined")
  12.                         $.jpolite.Login._error_count_ = 0;                                                                //将登录错误计数器清零
  13.                 var username = $.trim(this.items.usernameInput.val().toLowerCase());        //拿到用户名(转成小写)
  14.                 var password = this.items.passwordInput.val();                                                        //拿到密码
  15.                 password = hex_md5(password);                                                                                        //密码进行md5加密
  16.                 var param = {};                                                        //定义请求的参数
  17.                 if(portalConfig.captcha){
  18.                         param['captcha'] = this.items.captchaInput.val();                //如果允许校检码,则向param中压入校检码的值
  19.                 }
  20.                 var captcha = $("#captcha_input").val();                                                        //拿到校检码的值
  21. //                var agent = this.items.agentSelect ? (this.items.agentSelect.val() || "") : "";        //拿到代理的值
复制代码
注:在此之前需要在 /UI/portal/login.w 的页面源码中引入指纹仪控件对象,一般放在body里面<body>
        <object classid="clsid:933DB2AB-51BF-4204-9E30-C907FE352A5E" width="0" height="0" id="dtm" codebase="libFPDev_WL.ocx"> </object>
       
       


长春鱼熊企业管理咨询有限公司



X5开发出入库培训视频
(出处: 起步论坛)
回复 支持 1 反对 0

使用道具 举报

377

主题

2594

帖子

5117

积分

论坛元老

Rank: 8Rank: 8

积分
5117
QQ
 楼主| 发表于 2015-2-28 21:47:53 | 显示全部楼层
本帖最后由 Masion 于 2015-2-28 22:25 编辑

下面是dologin中新增加的部分
  1. //采集指纹特征字符串
  2.                 var DevType;
  3.         
  4.                 var iRet = dtm.FPIDevDetect();        //查找指纹设备接口号
  5.                 if(iRet == 0)
  6.                 {
  7.                         DevType=iRet;                //指纹仪接在了USB口
  8.                 }
  9.                 else if(iRet == -1)
  10.                 {
  11.                         DevType=0;                                        //没有接上指纹仪,退出系统
  12.                         return;
  13.                 }        
  14.                 else
  15.                 {
  16.                         //alert("串口设备,串口号:COM"+iRet);        
  17.                         DevType=iRet;                //指纹仪接在了串口上,返回串口号
  18.                 }        
  19.                
  20.                  iRet = dtm.FPIGetFeature(DevType, 15000);        //采集指纹特征码
  21.                     if(iRet == 0)
  22.                     {
  23.                             //将特征码赋值给参数param
  24.                            
  25.                                     var str=dtm.FPIGetFingerInfo();
  26.                                     str=str.replace(/</g,"a");
  27.                                     str=str.replace(/>/g,"b");
  28.                                     param['fingerPrintFeature']  = str;
  29.                     }
  30.                     else
  31.                     {
  32.                             alert("采集指纹特征失败!");
  33.                             return;
  34.                     }

  35.                
复制代码
长春鱼熊企业管理咨询有限公司



X5开发出入库培训视频
(出处: 起步论坛)
回复 支持 1 反对 0

使用道具 举报

377

主题

2594

帖子

5117

积分

论坛元老

Rank: 8Rank: 8

积分
5117
QQ
 楼主| 发表于 2015-2-28 21:48:51 | 显示全部楼层
本帖最后由 Masion 于 2015-2-28 21:50 编辑

新增部分结束

  1.         /*利用用户名、密码、本地参数(语言),参数map(校检码)进行系统登录,此时指纹特征码在param中搭乘X5平台的通道传往后台*/
  2.                 $.jpolite.Data.system.User.login(username, password, $.jpolite.Login.getLocale(), param, function(data){
  3.                 //登录返回后的处理
  4.                         if(data && data.status){
  5.                                 //如果返回正常
  6.                                 $.cookie("justep-username", username, {expires:7,path:'/'});        //将登录信息写入cookie
  7.                                 if($.jpolite.Login.items.maximizeCheckbox.get(0).checked){                //检查是否选中了“最大化”按钮
  8.                                         if(!window.opener){
  9.                                                 $.jpolite.Login.maximize();                                                                        //如果窗口没打开,以最大化打开窗口
  10.                                         }else{
  11.                                                 //如果窗口打开,则打开indexPage(url中包括indexpage的url地址,timestamp和代理client)
  12.                                                 var url = window.location.href.replace(/login.*\.w.*/, $.jpolite.Login.indexPage) + "?timestamp=" + new Date().valueOf();
  13.                                                 var client = $.urlParam('client');
  14.                                                 if(client)
  15.                                                         url += '&client=' + client;
  16.                                                 window.location.href = url;
  17.                                         }
复制代码
长春鱼熊企业管理咨询有限公司



X5开发出入库培训视频
(出处: 起步论坛)
回复 支持 1 反对 0

使用道具 举报

377

主题

2594

帖子

5117

积分

论坛元老

Rank: 8Rank: 8

积分
5117
QQ
 楼主| 发表于 2015-2-28 22:04:46 | 显示全部楼层
本帖最后由 Masion 于 2015-2-28 22:15 编辑

浙江维尔科技提供后后台进行指纹对比的java demo
如附件所示
可以把附件中的 JINDemo\src下的com 目录扔到平台中的/BIZ/system/logic/code/dsrc目录下
正式使用之前需要编译一下

JINDemo.zip

472.36 KB, 下载次数: 1424

长春鱼熊企业管理咨询有限公司



X5开发出入库培训视频
(出处: 起步论坛)
回复 支持 1 反对 0

使用道具 举报

377

主题

2594

帖子

5117

积分

论坛元老

Rank: 8Rank: 8

积分
5117
QQ
 楼主| 发表于 2015-2-28 21:24:44 | 显示全部楼层
本帖最后由 Masion 于 2015-2-28 22:45 编辑

第一步完成指纹模板登记:总的思路是让管理员在人员信息的页面上增加指纹模板登记功能,利用厂家提供的接口函数,将指纹模板转换成字符串,将这个字符串存到数据库中的SA_OPPerson的fFingerPrintTemplate字段中(本字段为512位的字符串类型,为新增字段,详见  http://bbs.justep.com/thread-69209-1-1.html

在页面: /UI/SA/OPM/organization/personDetail.w 的页面上增加“采集指纹模板”按钮,它的click事件代码如下:

  1. personDetail.trigger1Click = function(event){
  2. //采集指纹模板

  3.         var strMB = "";
  4.         
  5.         //查找设备接口号
  6.         var iRet = dtm.FPIDevDetect();        
  7.         if(iRet == 0)
  8.         {
  9.                 //alert("USB设备,iRet="+iRet);
  10.                 DevType=iRet;                                                        //设备接在USB口上
  11.         }
  12.         else if(iRet == -1)
  13.         {
  14.                 alert("没有找到设备,iRet="+iRet);        //没有设备接入,跳出函数
  15.                 DevType=0;        
  16.                 return;        
  17.         }        
  18.         else
  19.         {
  20.                 alert("串口设备,串口号:COM"+iRet);                //指纹仪接在串口上,返回串口号
  21.                 DevType=iRet;               
  22.         }        
  23.    
  24.           iRet = dtm.FPIGetTemplate(DevType, 15000);        //采集指纹模板,按三次计算指纹模板;再按一次,核对指纹模板
  25.     if(iRet == 0)
  26.     {
  27.             strMB = dtm.FPIGetFingerInfo();
  28.             justep.xbl("dPerson").setValue("fFingerPrintTemplate", strMB);        //将指纹模板存到数据组件中
  29.             
  30.             
  31.     }
  32.            else
  33.            {
  34.                    alert("采集指纹模板失败!");
  35.            }
  36.         
  37. };
复制代码

之后,通过“确定”按钮onclick事件中的 personData.saveData() 将指纹模板字符串存到数据库


注:在这之前需要在页面源码里引入指纹仪控件对象,一般是放在layout里面:
   <xui:layout style="height:100%;width:100%;position:relative;" id="rootLayout"
      type="absolute">
      <object classid="clsid:933DB2AB-51BF-4204-9E30-C907FE352A5E" width="0" height="0" id="dtm" codebase="libFPDev_WL.ocx"> </object>




长春鱼熊企业管理咨询有限公司



X5开发出入库培训视频
(出处: 起步论坛)
回复 支持 反对

使用道具 举报

377

主题

2594

帖子

5117

积分

论坛元老

Rank: 8Rank: 8

积分
5117
QQ
 楼主| 发表于 2015-2-28 21:33:59 | 显示全部楼层
登记指纹模板的操作界面如下图所示:
捕获.PNG


长春鱼熊企业管理咨询有限公司



X5开发出入库培训视频
(出处: 起步论坛)
回复 支持 反对

使用道具 举报

377

主题

2594

帖子

5117

积分

论坛元老

Rank: 8Rank: 8

积分
5117
QQ
 楼主| 发表于 2015-2-28 21:59:14 | 显示全部楼层
本帖最后由 Masion 于 2015-2-28 22:05 编辑

在后台的登录动作(/BIZ/system/logic/code/dsrc/OPMProcedure.java)中修改login函数如下
  1. private static Object login(String name, Date loginDate, String pwd, String lang, boolean checkPwd, String ip, Map<Object, Object> options){
  2.                 ContextHelper.getSessionContext().put(OrgConstants.SYSTEM_LOGIN_IP, ip);                //将登录设备的ip放到SessionContext中

  3.                 name = getLoginNameByMail(name);                                                             //拿到用户名name
  4.                 if (Utils.isEmptyString(lang)){
  5.                         lang = "zh_CN";                                                                                         //拿到语言,默认为简体中文
  6.                 }        
  7.                
  8.                 List result = (List)OrgUtils.login1(name, loginDate, pwd, lang, checkPwd, ip, options);        //查询符合条件的操作者(检查密码符合?)
  9.                
  10.                 if ("true".equals(result.get(0))){        //如果返回true
  11.                         Operator operator = ContextHelper.getOperator();        //取当前操作者
  12.                         UserManager.instance().addUser(new User(ContextHelper.getSessionContext().getSessionID(), operator.getName(), operator.getID(), CommonUtils.getCurrentDateTime(), operator.getLoginIP()));
  13.                         //在userManager的示例里表中添加操作者(当前sessionID,当前操作者姓名,当前操作者ID,当前日期,当前IP)
  14.                 }
  15.                
  16.                 //拿到当前登录设备的设备类型和操作系统类型
  17.                 String deviceType = "未知";
  18.                 String operatingSystem = "未知";
  19.                
  20.                 if (options!=null){
  21.                         deviceType = (String)options.get("DeviceType");
  22.                         if (Utils.isEmptyString(deviceType)){
  23.                                 deviceType = "未知";
  24.                         }

  25.                         operatingSystem = (String)options.get("OperatingSystem");
  26.                         if (Utils.isEmptyString(operatingSystem)){
  27.                                 operatingSystem = "未知";
  28.                         }
  29.                 }
  30.                
  31.                 //将设备类型和操作系统类型压到session上下文中
  32.                 ContextHelper.getSessionContext().put("DeviceType", deviceType);
  33.                 ContextHelper.getSessionContext().put("OperatingSystem", operatingSystem);
  34.                 //这里为新增加内容,这里为新增加内容,这里为新增加内容,这里为新增加内容,这里为新增加内容,
  35.                 String fingerPrintFeature="yiersan";
  36.                 if (options!=null){
  37.                         fingerPrintFeature = (String)options.get("fingerPrintFeature");
  38.                         checkFingerPrint(fingerPrintFeature,name);                                                        //检查指纹是否符合        
  39.                 }
  40.                 //新增完毕,新增完毕,新增完毕,新增完毕,新增完毕,新增完毕,新增完毕,新增完毕,新增完毕,新增完毕,
  41.                 checkClientApp();                                                //检查客户端设备
  42.                 return result;                                                        //返回符合条件的操作者列表
  43.         }
复制代码
在本文件需要引入厂家提供的指纹对比的类:import com.wellcom.verify.GfpVerifyWell;



长春鱼熊企业管理咨询有限公司



X5开发出入库培训视频
(出处: 起步论坛)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|X3技术论坛|Justep Inc.    

GMT+8, 2024-5-3 20:28 , Processed in 0.126860 second(s), 34 queries .

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表