谢谢精灵把自己的心得体会写出来,与大家分享。
关于读者帐户没有密码而可能导致隐私泄露问题,绝不是空穴来风。我们对隐私和安全问题应当抱有严肃的态度。江汇泉曾经提出过这个问题,并且给出了一定的解决办法建议就是读者记录创建的时候其初始密码可以采用姓名拼音或者生日或者几个字段的内容的组合。
当时我觉得解决办法还不太成熟,也想听听用户单位的意见;另外我们的系统以灵活和可以配置为傲,我一直在想是不是可以用一个二次开发脚本函数来定制这个缺省密码的功能,但又觉得动用脚本函数是不是有些牛刀了,也要考虑大部分用户单位对于管理的简便性的要求 ---- 于是在纠结和试图平衡的过程中时间就流逝了。
我想,是不是还是尽早把这个缺省密码的功能,也可以做出来再改进,不过那样就有可能带来用户的一些颠簸了 --- 可能要跟着把配置文件改来改去。
即便是解决了缺省密码的问题,但是那些以前创建的没有密码的读者记录怎么办呢?怎么给它们加上密码?那么精灵编写的这个统计方案还是有现实意义的。可以认为是缺省密码机制的一个补充。
但,目前这个统计方案还需要通用化以后,才能作为公司推荐的统计方案放在网站上,提供给所有用户单位使用。我建议可以设定一些预定义的动作类型,比如采用生日字符串,采用姓名拼音,采用其他什么字段来填入密码。
(顺便悄悄问一句:有拼音字段么,读者记录中?)
这样使用这个统计方案的操作者就可以选用预定义的动作来执行了。
~~~
我前两天还在琢磨,精灵同志将怎样在程序中判断一个读者记录有没有密码呢?
看了今天的代码,我不得不解释一下了。精灵所采用的判断<password>元素的值是否为空的办法,是可以用的,但是理论上不严密。
为什么呢?因为读者记录中<password>这个元素中存储的是读者密码的hash码,而“空”密码hash以后可不是空哟!当然恰好现在的dp2library服务器程序在创建读者记录的时候让<password>元素内容是空,这是一个巧合。理论上说,<password>元素内容是空,或者是“空”的hash码,两种情况都算空。
那么这个“空”的hash码是什么呢?这,就是天机不可泄漏了。hash码的用意就是不要你知道,故意扰乱的。我们就不要沿着这个方向去走了。
可以改换方向思考。在dp2circulation的出纳窗中,有一种校验读者密码的方式,那么肯定dp2circulation前端采用了什么API调用来验证读者密码的。我们可以使用这个API来,验证一下读者的密码是不是空。这个方法最好,因为这个API是系统提供的,有足够的可靠性和稳定性,我们作为二次开发者就不必操心那些hash码之类的事情了。
这个校验读者密码的API的类型是:
long VerifyReaderPassword(Stop stop, string strReaderBarcode, string strPassword, out strError)
返回-1是出错,返回0是校验不匹配,返回1是匹配。
调用这个API,需要当前用户具有verifyreaderpassword的权限。如果是读者类型的帐户,则只能校验自己的密码,不能校验其他人的密码。
希望精灵可以试一试用这个函数判断读者当前是否有了密码。
当然,这个API和其他API一样,是在Channel里面的一个函数,调用时形态如下:
long lRet = this.ReaderStatisForm.Channel.VerifyReaderPassword(
null, // stop,
strReaderBarcode, // 读者证条码号
"", // 要检测的密码
out strError);