关于连续登录失败封锁用户登录权限的问题

mike0392 2010-05-27 02:21:21
我想要做一个登录的window,用户输入密码错误(用户名正确)3次后,该用户再次登入时封锁该用户,无论密码正确与否都不允许连接服务器,请问如何做到?(本想将失败次数等数据存在表中做检查,结果发现没连上数据库前根本读不了表)
现在有关登录权限等数据都存放在数据库的一张表内,而用户名和密码则是在服务器端
其中检查权限是在成功输入用户名和密码并且访问到数据库后做的(可以读表了中数据)。
我想把所有逻辑都放在登录window的OK健中。大体的window如下:

USER:(sle_userid.txt)
PASSWD:(sle.passwd.txt)
OK(button) CANCEL(button)
...全文
366 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
chengg0769 2010-06-01
  • 打赏
  • 举报
回复
连数据库是连数据库,用户登录验证是登录验证。是两码事吧。
如果你很介意这个,应该先连上,然后把恶意登录的情况记录下来。这样管理员就能知道。
ini有点作用。但假设a,b两个人,a的账户被b恶意登录失败,当a要正常登录时,还得找管理员。麻烦。


-------------------------------------------
powerbuilder混淆器v2010.05.4
obufscator for powerbuilder v2010.05.4

download:
http://chengg0769.download.csdn.net/
liuxg1981 2010-05-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 smilysoft 的回复:]
可以把登陆信息保存在ini文件中,如果某个用户名登陆了3次,还没登陆成功。就把该用户名记录下来,下次不让他登陆。
[/Quote]
同意
jjoulejcc 2010-05-29
  • 打赏
  • 举报
回复
PB一般都是保存到INI配置文件中,但是你这样做有点不友好了,要是别个人知道你的登录名,故意登录失败3次,那你还要去管理解锁,有点麻烦了。
lchh0917 2010-05-28
  • 打赏
  • 举报
回复
String ls_user_id,ls_user_name,ls_yhzb,ls_gh //用户代码,用户姓名,用户组标识
String ls_enter_password,ls_password//用户口令
String ls_subsystem_id//子系统代码
String ls_adm_flag//系统管理员标识
String ls_user_status//登录标识
String ls_priv_group_id//用户组编号
String ls_sffc //封存标志
String ls_dzyid//职员内码
string ls_bz //连接的数据库
DateTime ld_datetime
Long ll_count
Boolean lb_first = FALSE

ls_user_id = Trim(sle_1.Text)
ls_user_name = Trim(sle_2.Text)
ls_enter_password = Trim(sle_3.Text)

If ls_user_id = '' OR IsNull(ls_user_id) Then
MessageBox("注意:","请输入用户代码!")
sle_1.SetFocus()
Return
End If

If ls_enter_password = '' OR IsNull(ls_enter_password) Then
MessageBox("注意:","请输入用户密码!")
sle_3.SetFocus()
Return
End If

SetPointer (HourGlass!)
SELECT count(1) INTO :ll_count FROM zhiydoc ;
If ll_count = 0 Then
If Left(sle_1.Text ,5) = 'ADMIN' AND sle_3.Text = 'jzt' Then
lb_first = TRUE
End If
Else
//从人员信息表中读当前用户的口令
SELECT dzyid,kl,jsid,sf_gly,sffc,SBDLID INTO :ls_dzyid,:ls_password,:ls_priv_group_id,:ls_adm_flag,:ls_sffc,:ls_gh FROM zhiydoc
Where Upper(dzycode) = :ls_user_id;

If ls_sffc = '是' Then
MessageBox('提示:','当前帐号已经停用,请输入新的用户帐号!',StopSign!)
sle_1.Text = ''
sle_2.Text = ''
sle_3.Text = ''
Return
End If

ls_password = f_decocde(ls_password) //对口令解密
End If
If ls_password = ls_enter_password OR lb_first Then
//判断该用户是否已经登录了系统
SELECT yhzt INTO :ls_user_status FROM zhiydoc Where dzycode = :ls_user_id ;


//写系统全局变量
If ls_password = 'jzt' Then
MessageBox('提示:','你使用的是默认口令,为确保安全进入系统后请立即修改口令!')
End If


ld_datetime = f_get_sysdatetime()
gs_user_info.enter_ip = f_get_ip('Oralce','Client')
gs_user_info.user_id = ls_dzyid
gs_user_info.user_group_id = ls_priv_group_id
gs_user_info.user_name = ls_user_name
gs_user_info.adm_flag = ls_adm_flag
gs_user_info.enter_time = String(ld_datetime,'yyyy-mm-dd hh:mm:ss')
gs_user_info.user_pwd = ls_password
gs_user_info.user_code = ls_user_id
gs_user_info.user_gh = ls_gh


//写用户登录信息
f_update_user_info('enter')
CloseWithReturn(PARENT,'1')

Open(w_main)

select bz into :ls_bz from sys_cs where csbh = 'GSMCH';
w_main.Title = gs_user_info.system_name + '---'+ ProfileString(gs_ini,'System_info','有效期信息','试用版') + " " + ls_bz
w_main.wf_set_status_bar("设计:张青松 戴廷尧 开发:张青松 张毅 张学鹏 李强 刘鲁 颜俊松",'操作员:'+&
gs_user_info.user_name+'('+gs_user_info.user_code+')') //ProfileString(gs_ini,'System_info','dev_info','')
//初始化功能菜单
SELECT count(*) Into :ll_count From sys_mkdan ;
If ll_count > 0 Then
w_main.wf_create_menu(gs_user_info.user_group_id,gs_user_info.system_id)
// w_main.wf_disable_menu(w_main.MenuID)
// w_main.wf_init_user_right(gs_user_info.user_group_id,gs_user_info.system_id,w_main.MenuID)
End If

// sleep(500)

window lwin
OpenSheet(lwin,'w_back',w_main,1,layered!)
Idle(ProfileInt(gs_ini,'System_info','Idle',10)*60)

Else
MessageBox("注意:","用户密码不正确,请重输!")
sle_1.SetFocus()
ii_count++ //这里进行错误次数计数
If ii_count = 3 Then
MessageBox('警告:','你不是本系统的合法用户,系统将自行关闭!',StopSign!)
Halt CLOSE
End If
sle_1.Text = ""
sle_2.Text = ""
sle_3.Text = ""
Return
End If
new4everlau 2010-05-28
  • 打赏
  • 举报
回复
是应该先连再检测!
无论啥,顶贴了
dragon45 2010-05-28
  • 打赏
  • 举报
回复
本想将失败次数等数据存在表中做检查,结果发现没连上数据库前根本读不了表

通常的做法是先链接数据库吧?
zlf19810306 2010-05-28
  • 打赏
  • 举报
回复
最简单的就是你给数据库设置两个用户,一个是用来登录用户信息表的,一个是用来连接数据库的,就可以完成你的功能了。如果是在程序里用实例变量来计数的话,就没有考虑到客户关闭window的情况。按楼主所说应该是不管你是否重新运行程序,只要总共3次失败就锁定。

你也可以做一个com组件放到数据库服务器上,由这个com组件来负责登录验证,这样一旦你要改动登录验证程序的话就不用每个客户端都分发了,只需要更新数据库服务器上的com组件
wag_enu 2010-05-28
  • 打赏
  • 举报
回复
什么哦?

几次登录不成功就锁定, 锁多久呢?
用户始终是要使用系统的,如何解锁呢?
flywoof 2010-05-28
  • 打赏
  • 举报
回复
楼上的写的很详细了,应该是先连接数据库然后才判断用户密码正确与否,发现错误当然可以直接将违禁用户直接放入禁止列表存档。
mike0392 2010-05-27
  • 打赏
  • 举报
回复
好了,我自己查到了,学会了,多谢2L了
mike0392 2010-05-27
  • 打赏
  • 举报
回复
我刚开始学做pb,请问具体如何在pb中建立,保存,查询ini文件?能不能简单给个例子,谢谢。
PB菜鸟 2010-05-27
  • 打赏
  • 举报
回复
可以把登陆信息保存在ini文件中,如果某个用户名登陆了3次,还没登陆成功。就把该用户名记录下来,下次不让他登陆。

1,109

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 相关问题讨论
社区管理员
  • 基础类社区
  • WorldMobile
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧