李德華,許立梓,李文國
1 引言
InTouch是當今最流行的工控軟件開發工具之一,是美國Wonderware公司開發的世界上第一個集成的、基于組件的MMI(生產制造管理信息)系統FactorySuite2000中的一個核心組件。它具有世界領先的HMI(人機接口界面)和面向對象的圖形開發環境,便于高效、快捷地配置用戶的應用程序。筆者在使用InTouch7.1開發工控軟件的過程中發現在安全功能的實現上,傳統的方法不能完全滿足用戶的要求,因而有必要在此進行探討并給出解決方案。
2 實現安全功能的傳統方法
2.1 方法一:用InTouch7.1自帶的安全功能菜單
InTouch7.1包括WindowMaker和WindowViewer兩部分。其中,WindowMaker是InTouch的可視化開發環境,用于開發基于Windows的應用程序;WindowViewer是InTouch的運行環境,顯示和執行在WindowMaker中編寫好的應用程序。InTouch自帶的安全功能,在WindowMaker和WindowViewer的Security菜單下均可以找到,有關選項包括Log on、Change Password、Configure Users和Log off。一般來說,客戶使用應用程序,都是運行在WindowViewer環境下,而不允許切換到WindowMaker下去修改源程序,即安全功能是通過對WindowViewer的Security菜單操作來實現的。但這種方法有以下幾種弊端:
(1) 開發國內的工控軟件,界面的文字一般都使用中文,但InTouch7.1是英文版,Security菜單下的各選項和其中的設置內容都是用英文顯示,因而不協調。
(2) Security菜單的位置固定在窗口的最上方,不夠靈活,有時同整個系統的界面不一致。
(3) 在InTouch7.1中用戶權限設置是通過Configure Users窗口里的Access Level(0~9999)來設定的,權限最高是9999,權限最低是0,為缺省權限。什么樣的權限享有什么樣的功能可以在軟件編寫的時候通過語句來控制。這樣帶來一個管理上的不便,就是要附加一份權限和功能對應的記錄交給客戶,客戶必須嚴格遵循這份記錄來設定用戶的級別,而且也不夠直觀。
2.2 方法二:創建控件和使用系統變量
在InTouch7.1中,提供了能實現安全功能的對外接口,這些接口都屬于系統變量。它們分別是$Operator、$AccessLevel、$OperatorEntered、$PasswordEntered、$ChangePassword和$ConfigureUsers。其中,$OperatorEntered和$PasswordEntered分別對應用戶名輸入和用戶密碼輸入,用于用戶登陸,當它們的值都輸入正確時,$Operator和$AccessLevel就會分別設置為當前用戶名和當前用戶的對應權限,這兩項要先在Configure Users窗口里配置好。另外,把$ChangePassword和$ConfigureUsers置1,能分別顯示Security菜單中的Change Password和Configure Users對話窗口。因此,我們可以在WindowViewer的屬性設置中把Security菜單隱藏起來,而用InTouch7.1里的控件和Script語言來重新創建能實現Security菜單同樣功能的安全功能條(如圖1所示)。單擊登陸、改變密碼和設置用戶可分別彈出對應的窗口(如圖2所示)。其中,登陸窗口是自己用控件創建的,Change Password窗口和Configure Users窗口都是InTouch自帶的,因而是英文界面。方法二比方法一在界面設計上多了一些靈活性,克服了方法一中的第二種弊端,但由于使用了$ChangePassword和$ConfigureUsers系統變量,因而也避免不了方法一中的第一、三種弊端。
圖1 安全功能條
圖2 登陸、更改密碼和設置用戶的窗口
3 實現安全功能的新方法
該方法是對方法二的改進,它不使用$ChangePassword和$ConfigureUsers系統變量,而是開發人員自己創建更改密碼窗口和配置用戶窗口(如圖3所示)。
圖3 更改密碼窗口和配置用戶窗口
但是,這樣做會帶來一個難題就是自行創建的窗口如何讀取系統的用戶管理數據文件的數據。InTouch7.1并沒有提供這樣的接口。但提供了訪問數據庫的接口,因而,我們自己可以建立一個用戶管理數據表,表中有UserName、Password和Privilege 3個字段,分別記錄圖3配置用戶窗口中的用戶名、密碼和用戶身份,密碼窗口和配置用戶窗口可直接對這個數據表進行讀寫;另一方面,當用戶登陸時,根據用戶名和密碼來查找這個數據表中的匹配記錄,如果找到(只能有一個記錄符合),就把這條記錄的Privilege字段值讀取出來,再以這個值為真正的系統用戶名,加上對應密碼(這兩個值已在Configure Users窗口中配置好)分別賦值給$OperatorEntered和$PasswordEntered來登陸InTouch系統。用戶管理數據表在這里的作用類似網絡中防火墻的功能,要登陸的用戶必須先經過它來驗證身份,通過后再以相應的身份登陸InTouch系統。
為了進一步說明,下面著重舉例說明配置用戶窗口和登陸窗口的實現方法,更改密碼窗口的做法類似。
第一步,在Security菜單的Configure Users窗口中,做如圖2中Configure Users窗口中的用戶設置,也就是為系統設置了以下幾種用戶(見表1)。
表1
用戶名 |
密碼 |
用戶權限 |
Administrator |
Wonderware |
9999 |
Manager |
abc |
8888 |
Operator |
123 |
2000 |
第二步,新建一個名為用戶的Access數據庫,數據庫里新建一個名為table1的表(如圖4所示),并在系統的ODBC數據源里將這個數據庫綁定。
圖4 table1表圖
第三步,在InTouch的SQL Access Manager\Table Template中定義一個名字和字段都跟table1一樣的表;然后在InTouch的SQL Access Manager\Bind List中為這張表定義一個綁定列bind1,注意表與綁定列的格式和數據類型應完全一樣。在這里,綁定的TagName和綁定列名也取為一樣,都是UserName、Password和Privilege。
第四步,分別建立如圖2中的登陸窗口和圖3中的配置用戶窗口,并在窗口中寫入腳本程序。由于篇幅所限,只能以登陸窗口為例,說明登陸腳本程序的編寫。在登陸窗口的確認按鈕的Action Script窗口中寫入以下程序。
SQLConnect(ConnectionId, "DSN=用戶");/*連接數據庫*/
SQLSelect(ConnectionId,"table1","bind1","UserName='"+OperatorEntered_Temp+"'"+" and "+"Password ='"+ PasswordEntered_Temp+"'","");/*查找匹配的記錄*/
NumRows=SQLNumRows(ConnectionId);/*讀取記錄的條數*/
IF NumRows>0 THEN
SQLFirst(ConnectionId);/*如果有符合條件的記錄,則讀取記錄*/
SQLEnd(ConnectionId);/*釋放記錄緩沖區*/
SQLDisconnect(ConnectionId);/*關閉數據庫*/
IF Privilege=="Manager" THEN /*以下8行到20行語句功能為:檢查記錄的Privilege字段值是Manager、Administrator和Manager中的哪一個,并以相應的身份來登陸系統*/
$OperatorEntered ="Manager";
$PasswordEntered="abc";
ENDIF;
IF Privilege=="Administrator" THEN
$OperatorEntered ="Administrator";
$PasswordEntered="Wonderware";
ENDIF;
IF Privilege=="Operator" THEN
$OperatorEntered ="Operator";
$PasswordEntered="123";
ENDIF;
ENDIF;
IF NumRows =0 THEN /*如果沒有符合條件的記錄*/
$OperatorEntered ="None";/*以None身份來登陸*/
ENDIF;
程序中的OperatorEntered_Temp和Password-
Entered_Temp變量分別對應登陸窗口中輸入用戶名和密碼的兩個TextBox的TagName屬性。
4 結語
用這種新方法實現安全功能,可以有效的克服傳統方法中的弊端,而且在安全性、靈活性和實用性方面都有所提高。
參考文獻:
[1] WonderWare FactorySuite InTouch User’s Guide. WonderWare Corporation, Revision C, July 1999.
[2] WonderWare FactorySuite SQL Access Manager User’s Guide. WonderWare Corporation, Revision B, July 1999.