玉管通地理,朱笔点天文
        欢迎光临文天软件之家
 
全站搜索
联系方式


网 址:文天软件之家

    www.jh-lzf.com

联系人:文天(刘中甫)

邮 箱:jh-lzf@21cn.com

地 址:湖北·武汉

    中国石化·江汉油田

    石油工程技术研究院

    信息中心

  

天气信息
新闻详情
为应用软件加装安全防护门
来源:━━━━《电脑编程技巧与维护》2004第1期作者:刘中甫网址:http://www.jh-lzf.com浏览数:10

为应用软件加装安全防护门

摘  要:应用软件的安全问题是软件设计时必须考虑的重要因素之一。本文以“应用软件安全防护门示例程序”为例,介绍了应用软件安全防护门的实现方法,并给出了程序代码及说明。

关键词:用户  密码  权限  数据库  事件代码

一、前言

应用软件的安全问题体现在两个方面:一是用户数据的安全性,应确保用户数据既不被丢失或损坏,也不被非法人员窃取;二是软件运行的安全性,应确保系统设备及操作人员的安全,这一点对高温高压等危险性很大的控制类软件尤为重要。为了达到上述目的,应用软件必须对用户身份进行严格的验证,并设置不同的用户权限,对其应用范围(即开放给用户的软件功能)加以限制,使得有些用户登录后,软件的部分功能被屏蔽或不可用。

二、设计环境

本系统在VB6+Spk3+Win98+Offices2000环境下调试通过。在工程\引用中将Microsoft DAO3.6 Object Library项打钩,在工程\部件中将Microsoft FlexGrid Control 6.0及Microsoft Windows Common Controls 6.0两项打钩,并在公用模块modUser中加上如下申明:

Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" (ByVal lpBuffer As String, ByVal nSize As Long) As Long

Public User_db As Database      '用户数据库

Public User_Table As Recordset  '用户表

Public User_Info(5) As String    '用户名称、用户密码、重要功能、手动试验、自动试验、用户管理

其中,函数GetSystemDirectory用于获取Windows的System路径,User_Info(5)为用户信息及功能权限数组,此数组随不同的应用程序相应变化。

三、主程序窗体

1、窗体说明

本程序共有三个窗体,分别为主窗体(FrmMain),用户登录窗体(frmLogin),用户管理及用户权限设置窗体(frmUser)。其中主窗体如图1(下左)所示。

   

为了简化说明,本示例程序仅设两个拉菜单:重要功能(包括自动试验、手动试验两个子菜单)、普通功能(包括用户管理、切换用户、系统帮助、退出系统、用户名称几个子菜单),并在工具条上设置相应的快捷方式,除了用户管理、切换用户、退出系统、用户名称等子菜单项给出事件代码外,其它子菜单用户可根据需要编制事件代码。

2、运行说明

当用户具有某项(菜单)权限时,相应的菜单及快捷方式有效(见图1,上面左图);当用户不具有某项(菜单)权限时,相应的菜单及快捷方式无效(见图2,上面右图);当鼠标经过当前用户快捷图标时将显示当前用户名。

3、事件代码

主窗体(FrmMain)的事件代码如下:

Public Sub User_meun_Init()                    '用户菜单初始设置

   meun_Hand.Enabled = False                  '手动试验无效

   meun_Auto.Enabled = False                  '自动试验无效

   meun_SuperUser.Enabled = False             '用户管理无效

   Menu_UserName.Caption = "当前用户:" & User_Info(0)

   Toolbar1.Buttons(7).ToolTipText = "当前用户:" & User_Info(0)

   For i = 1 To 3

       Toolbar1.Buttons(i).Enabled = False

   Next

   If User_Info(0) = "999999" Then

      meun_SuperUser.Enabled = True             '用户管理有效

      Toolbar1.Buttons(3).Enabled = True

   Else

      If User_Table.RecordCount <> 0 Then

         If User_Info(2) = True Then            '若具有运行“重要功能”菜单权限

            meun_Importance.Enabled = True      '重要功能菜单有效

            If User_Info(3) = True Then         '若具有运行“手动试验”菜单权限

               meun_Hand.Enabled = True

               Toolbar1.Buttons(1).Enabled = True

            End If

            If User_Info(4) = True Then         '若具有运行“手动试验”菜单权限

               meun_Auto.Enabled = True

               Toolbar1.Buttons(2).Enabled = True

            End If

         Else

            meun_Importance.Enabled = False

         End If

         If User_Info(5) = True Then            '用户管理有效

            meun_SuperUser.Enabled = True

            Toolbar1.Buttons(3).Enabled = True

         End If

      End If

   End If

End Sub


Private Sub Form_Load()

   frmLogin.Show vbModal                     '用户登录:用户身份验证

   User_meun_Init                            '用户菜单初始设置

End Sub

Private Sub meun_ExitSystem_Click()           '退出系统

   End

End Sub

Private Sub meun_SuperUser_Click()            '用户管理

   frmUser.Show vbModal                      '用户管理:用户权限设置

End Sub

Private Sub ChangeUser_Click()                '切换用户

   frmLogin.Show vbModal                     '用户登录:用户身份验证

   User_meun_Init                            '用户菜单初始设置

End Sub


Private Sub Toolbar1_ButtonClick(ByVal Button As MSComctlLib.Button)    '快捷工具栏

   Select Case Button.Index

          Case 3

               meun_SuperUser_Click             '用户管理

          Case 4

               ChangeUser_Click                 '切换用户

          Case 6

               End                              '退出系统

   End Select

End Sub

四、用户登录

1、窗体及运行说明

用户登录窗体(frmLogin)如图3所示。其功能是登录系统或切换用户时验证用户身份,在初次使用系统时,建立一个空结构的“用户”数据库。“用户”数据库本为Access数据库.mdb,但为了掩人耳目,系统生成的数据库文件名为User.dll(本例未设置文件打开密码),放于Windows的System系统目录下。

初次使用系统时,必须以999999用户名(对应密码666666)登录进入系统。999999用户为虚拟管理员身份,即999999用户只在安装系统后,还未加入任何用户时有效。以999999用户名登录进入系统,加入用户并设置好用户权限后,待下次登录系统或切换用户时,将在用户列表中显示所加入的用户,而999999用户名将自然消失。

登录系统时,必须输入正确的用户名称及用户密码。若用户名称及用户密码输入错误,则系统提示登录错误信息:“用户名或密码无效,请重试!”,并要求继续输入;若连续5次仍未正确输入用户名称及用户密码时,系统将中止用户登录,以防非法用户应用排列组合法进入系统。

登录系统成功后,将根据用户权限设置主系统菜单及工具条快捷图标是否灰度显示(如图1、图2)。

2、事件代码

Public LoginSucceeded As Boolean     '登录成功标志

Public SysRun As Boolean             '系统已运行标志

Public WinSysPath As String          'Win系统路径

Private Sub cmdCancel_Click() '取消

   If SysRun = True Then            '若系统已运行,则隐藏登录窗体,否则退出系统

      Unload Me

   Else

      End

   End If

End Sub

Private Sub cmdOK_Click()            '确定:用户身份验证

   Static i As Integer

   On Error GoTo ErrorHandler       '若打开错误,则新建“用户”数据库

   If SysRun <> True Then           '若系统已运行

      i = i + 1                     '检查正确的用户名及密码5次

   End If

   If User_Table.RecordCount = 0 Then    '若未建立用户

      LoginSucceeded = False

      If Combo1.Text = "999999" Then

         If txtPassword = "666666" Then

            LoginSucceeded = True        '用户名及密码正确

         End If

      End If

   Else

      User_Table.MoveFirst

      LoginSucceeded = False

      Do While Not User_Table.EOF        '用户表中是否存在相关的用户名及密码

         If User_Table.Fields("用户名称") = Combo1.Text Then

            If User_Table.Fields("用户密码") = txtPassword Then

               User_Info(0) = Combo1.Text

               User_Info(1) = txtPassword

               User_Info(2) = User_Table.Fields("重要功能")

               User_Info(3) = User_Table.Fields("手动试验")

               User_Info(4) = User_Table.Fields("自动试验")

               User_Info(5) = User_Table.Fields("用户管理")

               LoginSucceeded = True

               Exit Do                  '用户名及密码正确

            End If

         End If

         User_Table.MoveNext

      Loop

   End If

   If LoginSucceeded Then                '登录成功

      SysRun = True                      '系统已运行

      Unload Me

      FrmMain.Menu_UserName.Caption = User_Info(0)   '在菜单上显示用户名

      Exit Sub

   End If

   If i = 5 Then

      MsgBox "用户登录失败,请与系统管理员联系!", vbCritical, "登录失败"

      End

   Else

      MsgBox "用户名或密码无效,请重试!", vbCritical, "登录失败"

   End If

   Exit Sub

ErrorHandler:

   MsgBox "“用户数据库错误,请以系统管理员身份登录。", vbCritical

   User_db.Close

   Kill WinSysPath + "\User.dll"

   New_User

End Sub

Private Sub Form_Load()

   On Error GoTo ErrorHandler           '若打开错误,则新建“用户”数据库

   Dim Syspath As String

   Syspath = String(145, Chr(0))

   WinSysPath = Left(Syspath, GetSystemDirectory(Syspath, Len(Syspath))) 'Win系统路径

   If Dir(WinSysPath + "\User.dll") = "" Then  '是否存在用户数据库

      MsgBox "初次使用,现以系统管理员身份登录。", vbInformation

      New_User                         '新建“用户”数据库

   End If

   Set User_db = OpenDatabase(WinSysPath + "\User.dll")   '打开“用户”数据库

   Set User_Table = User_db.OpenRecordset("用户")         '打开“用户”表

   If User_Table.RecordCount = 0 Then                     '若未建立用户

      User_Info(0) = "999999"

      User_Info(1) = "666666"

      Combo1.Text = User_Info(0)                       '向用户名下拉列表框添加用户名

   Else

      User_Table.MoveFirst

      Do While Not User_Table.EOF

         Combo1.AddItem User_Table.Fields("用户名称")  '向用户名下拉列表框添加用户名

         User_Table.MoveNext

      Loop

   End If

   Exit Sub

ErrorHandler:

   MsgBox "“用户数据库错误,请以系统管理员身份登录。", vbCritical

   User_db.Close

   Kill WinSysPath + "\User.dll"

   New_User

End Sub

Private Sub New_User()                                 '建立新的用户数据库

   Set User_db = CreateDatabase(WinSysPath + "\User.dll", dbLangGeneral)

   User_db.Execute "Create Table[用户]([用户名称]Text(8),[用户密码]Text(8),[重要功能]YesNo,[手动试验]YesNo,[自动试验]YesNo,[用户管理]YesNo)"

End Sub

五、用户管理及用户权限设置

1、窗体说明

用户管理及用户权限设置窗体(frmUser)如图4所示。窗体界面分为“用户信息显示区”(以下简称显示区)及“用户信息编辑区”(以下简称编辑区)。显示区由MSFlexGrid1控件组成,而其它控件组成编辑区。主要控件说明如下:

⑴ MSFlexGrid1用于显示用户帐号及用户权限设置信息,数据源关联到Data1控件;

⑵ Text0及Text1控件分别为用户名称及用户密码输入框;

⑶ Combo1(2)为“重要功能”菜单权限选择框,Combo1(3) 及Combo1(4)分别为“普通功能”菜单中手动试验及自动试验子菜单权限选择框、Combo1(5)为用户管理子菜单权限选择框,权限设置“是”表示该用户具有此项权限,“否”表示该用户不具备此项权限。“重要功能”及“普通功能”菜单权限设置项数随具体应用软件而增减;

⑷ Data1为数据库控件,关联到“用户”数据库;

⑸ Command1~Command5控件分别为确认修改、增加用户、删除用户、取消返回、存盘返回等命令键。

2、运行说明

增加用户:输入用户名称、用户密码并在各下拉列表中选择“是”或“否”后,点击“增加用户”键。

修改用户:在显示区选择要修改的用户,在编辑区修改用户名称、用户密码并在各下拉列表中选择“是”或“否”后(除“是”以外的任何其它字符,均当作“否”处理),点击“修改用户”键。

删除用户:在显示区选择要删除的用户,再点击“删除用户”键。

取消返回:取消所作的用户管理操作,并返回主系统。

存盘返回:将显示区所有的用户信息存入“用户”数据库后返回主系统。

只有具备“用户管理”权限的用户才能更改用户名称、用户密码及用户权限。签于此,在设置用户权限时,必须至少设置一个系统管理员,即至少有一个用户具有“用户管理”权限。

3、事件代码

Public UserNum As Integer                          '用户数

Public SameName As Integer                         '同名用户数

Private Sub Command1_Click()                       '确认修改

   If MSFlexGrid1.Rows <= 1 Then Exit Sub         '无用户时

   SameName = 0

   If Trim(Text0) = "" Or Trim(Text1) = "" Then   '用户名及密码为空

      MsgBox "用户名及密码不为空!", vbCritical

      Exit Sub

   End If

   For i = 1 To UserNum                           '检查是否有同名用户

       a = Trim(Text0) = Trim(MSFlexGrid1.TextMatrix(i, 0))

       b = Trim(Text0) <> MSFlexGrid1.TextMatrix(MSFlexGrid1.Row, 0)

       If a And b Then SameName = SameName + 1

   Next

   If SameName > 0 Then

      MsgBox "已有同名用户!", vbCritical

      Exit Sub

   End If

   MSFlexGrid1.TextMatrix(MSFlexGrid1.Row, 0) = Trim(Text0)    '姓名

   MSFlexGrid1.TextMatrix(MSFlexGrid1.Row, 1) = Trim(Text1)    '密码

   For i = 2 To 5

       If Trim(Combo1(i).Text) = "" Then

          MSFlexGrid1.TextMatrix(MSFlexGrid1.Row, i) = ""

       Else

          MSFlexGrid1.TextMatrix(MSFlexGrid1.Row, i) = ""

       End If

   Next

End Sub

Private Sub Command2_Click()                          '增加用户

   SameName = 0

   If Trim(Text0) = "" Or Trim(Text1) = "" Then      '用户名及密码为空

      MsgBox "用户名及密码不为空!", vbCritical

      Exit Sub

   End If

   For i = 1 To UserNum                             '检查是否有同名用户

       If Trim(Text0) = Trim(MSFlexGrid1.TextMatrix(i, 0)) Then SameName = SameName + 1

   Next

   If SameName > 0 Then

      MsgBox "已有同名用户!", vbCritical

      Exit Sub

   End If

   UserNum = UserNum + 1                    '用户数加1

   MSFlexGrid1.AddItem Row                  '插入一行

   MSFlexGrid1.Row = MSFlexGrid1.Rows - 1   '指定表格当前行(最末行)

   MSFlexGrid1.Col = 0                      '指定表格当前列

   MSFlexGrid1.TextMatrix(MSFlexGrid1.Row, 0) = Trim(Text0)

   MSFlexGrid1.TextMatrix(MSFlexGrid1.Row, 1) = Trim(Text1)

   For i = 2 To 5

       If Trim(Combo1(i).Text) = "" Then

          MSFlexGrid1.TextMatrix(MSFlexGrid1.Row, i) = ""

       Else

          MSFlexGrid1.TextMatrix(MSFlexGrid1.Row, i) = ""

       End If

   Next

End Sub

Private Sub Command3_Click()                   '删除用户

   If MSFlexGrid1.Rows > 2 Then

      MSFlexGrid1.RemoveItem MSFlexGrid1.Row  '删除一行

      UserNum = UserNum - 1                   '用户数减1

   Else

      MSFlexGrid1.Rows = 1

      UserNum = 0                             '用户数0

   End If

End Sub

Private Sub Command4_Click()                   '取消返回

   Unload Me

End Sub

Private Sub Command5_Click()                   '存盘返回

   If User_Table.RecordCount <> 0 Then

      User_Table.MoveFirst

      Do While Not User_Table.EOF

         User_Table.Delete

         User_Table.MoveNext

      Loop

   End If

   For i = 1 To MSFlexGrid1.Rows - 1

       User_Table.AddNew

       User_Table.Fields("用户名称") = Trim(MSFlexGrid1.TextMatrix(i, 0))

       User_Table.Fields("用户密码") = Trim(MSFlexGrid1.TextMatrix(i, 1))

      '以下将"是"或"否"转换为Yes/No

      User_Table.Fields("重要功能")=IIf(Trim(MSFlexGrid1.TextMatrix(i, 2))="",-1, 0)

      User_Table.Fields("手动试验")=IIf(Trim(MSFlexGrid1.TextMatrix(i, 3))="",-1, 0)

      User_Table.Fields("自动试验")=IIf(Trim(MSFlexGrid1.TextMatrix(i, 4))="",-1, 0)

      User_Table.Fields("用户管理")=IIf(Trim(MSFlexGrid1.TextMatrix(i, 5))="",-1, 0)

      User_Table.Update

   Next

   FrmMain.User_meun_Init                     '更新用户菜单设置

   Unload Me

End Sub

Private Sub Form_Activate()

   UserNum = 0                               '用户数

   '以下显示表格标题

   MSFlexGrid1.TextMatrix(UserNum, 0) = "用户名称"

   MSFlexGrid1.TextMatrix(UserNum, 1) = "用户密码"

   MSFlexGrid1.TextMatrix(UserNum, 2) = "重要功能"

   MSFlexGrid1.TextMatrix(UserNum, 3) = "手动试验"

   MSFlexGrid1.TextMatrix(UserNum, 4) = "自动试验"

   MSFlexGrid1.TextMatrix(UserNum, 5) = "用户管理"

   If User_Table.RecordCount = 0 Then         '若用户数为0,则退出

      MSFlexGrid1.Rows = 1

      Exit Sub

   End If

   User_Table.MoveFirst

   Do While Not User_Table.EOF

      UserNum = UserNum + 1                   '统计用户数

      MSFlexGrid1.TextMatrix(UserNum, 0) = Trim(User_Table.Fields("用户名称"))

      MSFlexGrid1.TextMatrix(UserNum, 1) = Trim(User_Table.Fields("用户密码"))

      '因权限显示为"-1"或"0",不直观,故以下转换为"是"或"否"

       MSFlexGrid1.TextMatrix(UserNum, 2) = IIf(User_Table.Fields("重要功能") <> 0, "是", "否")

       MSFlexGrid1.TextMatrix(UserNum, 3) = IIf(User_Table.Fields("手动试验") <> 0, "是", "否")

       MSFlexGrid1.TextMatrix(UserNum, 4) = IIf(User_Table.Fields("自动试验") <> 0, "是", "否")

       MSFlexGrid1.TextMatrix(UserNum, 5) = IIf(User_Table.Fields("用户管理") <> 0, "是", "否")

      User_Table.MoveNext

   Loop

End Sub

Private Sub Form_Load()

   MSFlexGrid1.Rows = User_Table.RecordCount + 1

   For i = 2 To 5

       Combo1(i).AddItem "  "

       Combo1(i).AddItem "  "

   Next

   For i = 0 To MSFlexGrid1.Rows - 1

       For j = 0 To 5

           MSFlexGrid1.ColWidth(j) = MSFlexGrid1.Width / 6   '指定表格行宽

           MSFlexGrid1.ColAlignment(j) = 3                   '字符居中

       Next

   Next

End Sub

Private Sub MSFlexGrid1_Click()                 '在信息输入区显示相应的选择行信息

   Text0 = MSFlexGrid1.TextMatrix(MSFlexGrid1.Row, 0)

   Text1 = MSFlexGrid1.TextMatrix(MSFlexGrid1.Row, 1)

   Combo1(2).Text = MSFlexGrid1.TextMatrix(MSFlexGrid1.Row, 2)

   Combo1(3).Text = MSFlexGrid1.TextMatrix(MSFlexGrid1.Row, 3)

   Combo1(4).Text = MSFlexGrid1.TextMatrix(MSFlexGrid1.Row, 4)

   Combo1(5).Text = MSFlexGrid1.TextMatrix(MSFlexGrid1.Row, 5)

End Sub

六、结论

应用软件的安全防护门主要由两部分组成,其一是用户身份验证,其二是用户权限设置。本示例程序介绍了应用软件安全防护门的实现方法,对于任意具体的应用程序,只需根据应用程序的要求,稍加修改此示例程序,即可为其加装安全防护门。