4.2.1. Форма Login - контроль доступа к приложению

 

Научимся делать доступными пользователю только те пункты меню и кнопки, с которыми ему положено работать в соответствии с правилами разграничения доступа (ПРД), существующими на предприятии. Для этих целей создадим форму Login. Эта форма запускается на выполнение до активации меню программного комплекса и либо вообще запрещает регистрацию работника, если его данных (фамилия и пароль) нет в базе, либо ограничивает доступ в соответствии с ПРД.

Создадим форму Login в режиме конструктора форм. Microsoft Visual FoxPro имеет в своем арсенале еще одно средство для создания формы за несколько минут – Мастер форм. Однако позволю себе порекомендовать вам не работать с ним. Это инструмент для непрофессионалов. Времени потратите немного, но и хорошего результата не получите!

 

 

Рис. 4.2. Форма контроля доступа к программного комплексу

 

Перед Вами самый распространенный вид формы (рис. 4.2), созданной в Microsoft Visual FoxPro. Обратите внимание на то, что до завершения процесса регистрации главное меню программного комплекса отсутствует. Вместо него – светлая полоса над картинкой. Это сделали две строки из RealEstate.prg:

 

SET SYSMENU TO           && Убрать системное меню

DO FORM LOGIN            && Запуск формы контроля доступа

 

Для создания формы в главном меню Visual FoxPro щелкните пункт File и выберите команду New. В открывшемся окне щелкните радиокнопку Form и нажмите кнопку New file. На экране дисплея появится окно Form Designer. Это окно конструктора форм. В нем наша первая форма с именем Form1. Справа увидите еще одно окно – окно Propertis (Свойства). В окне свойств несколько десятков строчек. Все содержат значения по умолчанию. В нашем случае следует изменить всего несколько из них. На рис. 4.3 показаны только измененные свойства. Остальные удалены для наглядности. Если значение свойства изменялось, то его система выделяет жирным цветом.

 

 

Рис. 4.3. Окно свойств формы Login.

 

Значком молнии  отмечены события. Для двух из них Activate и Load написан текст (User procedure), который запускается на выполнение при наступлении события. Activate – появление формы на экране. Текст события Activate имеет вид:

 

* Создать переменные памяти с пустыми значениями

SCATTER MEMVAR BLANK

* Дать некоторым из них начальные значения

M.LastName=  []

M.Post=      [         Добро пожаловать!]

M.FirstName= [Уважаемый гость,]

M.SecondName=[Зарегистрируйтесь!]

PAROL=       []

* Определение полного пути к картинке с приглашением

SET EXACT ON

IF ALLTRIM(SYS(2003))=[\]

   RealDirectory=[]

ELSE

   RealDirectory=[\]

ENDIF     

SET EXACT OFF

* Размещение картинки-приглашения в объекте IMAGE1

THISFORM.IMAGE1.PICTURE=DISK+RealDirectory+[PHOTO\Welcome.jpg]

* Перерисовать форму

THISFORM.REFRESH

* Запуск обработчика событий Visual FoxPro

READ EVENTS

 

Текст события Load (загрузка формы) имеет вид:

 

* Установить в таблице Пользователей отображение фамилий

* по алфавиту

SELECT USER

SET ORDER TO TAG LastName

 

Форма Login работает с таблицей User, которая не включена в базу данных Real Estate и является в терминах Visual FoxPro свободной таблицей. Это сделано из соображений безопасности. Права доступа к ней устанавливаются средствами операционной системы отдельно для каждого пользователя локальной вычислительной сети.

 Добавим таблицу User в окружение формы. Сделайте щелчок правой кнопки мыши в любом месте окна Form Designer. Появится меню. Выберите в нем третий пункт Data Environment. Еще один щелчок правой кнопкой, но уже в появившемся окне Data Environment активизирует очередное меню. Выберите в нем первый пункт Add. Появится окно Open. Найдите в нем таблицу User. Она находится в одноименной папке User. Состав полей приведен в табл. 4.1.

Таблица 4.1

Состав  таблицы пользователей

 

Поле

Тип

Размер

Описание

1

LastName

Character

15

Фамилия пользователя

2

FirstName

Character

12

Имя

3

SecondName

Character

10

Отчество

4

Post

Character

25

Занимаемая должность

5

PassWord

Character

10

Зашифрованное значение пароля

6

File

Character

8

Имя файла с фотографией

7

Access01

Logical

1

Настройка картинки в главном окне

8

Access02

Logical

1

Возможность смены своего пароля

9

Access03

Logical

1

Показ удаленных записей

10

Access04

Logical

1

Просмотр объема базы данных

11

Access05

Logical

1

Просмотр своих прав доступа

12

Access06

Logical

1

Возможность поиска зданий

13

Access07

Logical

1

Возможность добавления зданий

14

Access08

Logical

1

Возможность работы с квартирами

15

Access09

Logical

1

Работа с лицевыми счетами

16

Access10

Logical

1

Возможность работы с отчетами

17

Access11

Logical

1

Работа с адресным планом

18

Access12

Logical

1

Работа со списком районов

19

Access13

Logical

1

Доступ к материалу стен зданий

20

Access14

Logical

1

Установка прав доступа всем работникам

21

Inspector

Character

15

Фамилия предоставившего доступ

22

Date_up

Date

8

Дата последней корректировки

23

Time_up

Character

10

Время последней корректировки

24

Range

Numeric

1

Типовой код доступа

 

После добавления таблицы в окружение данных формы нам не нужно беспокоиться о своевременном ее открытии и закрытии. Все теперь Visual FoxPro сделает сам.

Создадим текстовое поле для отображения имени работника (рис. 4.4). Это однострочное текстовое поле, присоединенное к полю FirstName таблицы User. Порядок действий следующий. Если на экране дисплея отсутствует окно списка полей таблицы User, откройте окружение данных (Data Environment). В списке полей выделите поле FirstName (рис. 4.4). Нажмите левую кнопку мыши и «перетащите» выделенный элемент на форму. В активной области формы указатель мыши превратится в символ текстового поля. Расположение символа поля указывает верхний левый  угол его метки. «Перетащите» текстовое поле в нужное место формы. У вас есть возможность изменить размеры как элемента, так и метки при помощи клавиатуры. Выделите нужный объект и добейтесь необходимых результатов. При помощи клавиатуры такие действия выполняются гораздо точнее, чем при использовании мыши. Используйте для этого сочетание клавиш Shift + стрелка (вверх, вниз, вправо и влево).

 


Для выбора фамилии работника нам понадобится Combo Box (поле со списком). Найдите его на панели Form Controls (элементы управления формы). Она показана на рис. 4.5. Если панель отсутствует на экране – выберите в главном меню Visual FoxPro пункт View, а в открывшемся подменю пункт Toolbars. Откроется окно Toolbars. Сделайте отметку напротив названия панели - Form Controls и щелкните кнопку OK.

 


Выберите на панели значок Combo Box, а в нужном месте активной области формы при помощи левой кнопки мыши отведите место для этого объекта. Теперь можно запустить построитель. Он ускорит нашу работу. Несколько окон, около десятка ответов и мы у цели. Для запуска построителя щелкните по созданному на форме новому объекту правой кнопкой мыши. Появится подменю. Выберите в нем пятый пункт Builder.

На рис. 4.6 показано окно свойств объекта Combo1. Значения этих свойств – результат работы построителя. Впрочем, построитель можно и не запускать. Выполните назначения самостоятельно – результат тот же. На рисунке показаны только измененные свойства. Остальные удалены для наглядности.

 


Если пользователь изменит выбранное в поле значение, то наступит событие InteractiveChange. Немедленно будет запущена процедура (User Procedure). Текст ее приведен ниже:

 

* Определение местоположения фотографий

SET EXACT ON

IF ALLTRIM(SYS(2003))=[\]

   RealDirectory=[]

ELSE

   RealDirectory=[\]

ENDIF     

SET EXACT OFF

* Есть фотография - значение переменной FileName

FileName=DISK+RealDirectory+[PHOTO\]+ALLTRIM(User.File)+[.jpg]

* Нет фотографии - значение переменной NoFileName

NoFileName=DISK+RealDirectory+[PHOTO\]+[NoFoto.jpg]

IF FILE(FileName)

   * Если фотография имеется в папке PHOTO

   * Разместить ее на месте картинки IMAGE1

   THISFORM.IMAGE1.PICTURE=FileName

ELSE

   * Если нет - взять картинку NoFoto.jpg

   THISFORM.IMAGE1.PICTURE=NoFileName

ENDIF  

SCATTER MEMVAR

* Сохраняем фамилию в глобальной переменной на время сеанса

FAMILY=M.LastName

* Расшифровка пароля и занесение его как подсказку

* в демонстрационных целях под полем пароля

THISFORM.LABEL3.CAPTION=UnKod(M.Password)

THISFORM.REFRESH

 

Пароль пользователя хранится в зашифрованном виде в поле PassWord таблицы User. Для его зашифровки используется процедура-функция CrKod, а для расшифровки UnKod. Находятся они в процедурном файле FileProc. Текст файла приведен в приложении.

Последний этап - добавление в форму двух кнопок Вход и Отказ. Найдите на панели Form Controls (элементы управления формы) (рис. 4.5) значок кнопки  Command Button. В нужном месте активной области формы при помощи левой кнопки мыши отведите место для этого объекта. В окне свойств укажите Picture (расположение файла с иконкой), высоту Height, ширину Width (точные размеры в пикселах) и Caption (название кнопки). Понадобится текст для обработки события Click (щелчок по кнопке). Он приведен ниже:

 

*- Кнопка Вход

SCATTER MEMVAR   && Создание переменных памяти

Parol=ALLTRIM(Parol)

IF LEN(ALLTRIM(M.PassWord))=0

   * Если в таблице USER был стерт пароль (Например через ODBC)

   SuperVisor=.F.   && Идентификация не выполнена

   =MESSAGEBOX('Пароль в таблице идентификации '+;

                'отсутствует. Операция сравнения паролей '+;

                'не может быть выполнена. Обратитесь к '+;  

                'администратору! ',48,' Внимание!')

ELSE

   IF LEN(PAROL)=0

      =MESSAGEBOX('Вы забыли ввести пароль.',48,' Внимание!')

      * Установка курсора в поле TEXT5 и возврат в форму

      THISFORM.TEXT5.SetFocus

      RETURN

   ENDIF  

   Parol=CrKod(Parol)            && Зашифровка введенного пароля

   SET EXACT ON                  && Точное соответствие

   IF Parol=  M.PassWord         && Пароль

      SuperVisor=.T.             && Идентификация выполнена

      FAMILY= M.LastName         && Фамилия работника

      * Права доступа к пунктам меню и кнопкам форм

      ChangePicture=  M.Access01 && Смена картинки главного окна

      ChangePassword= M.Access02    && Смена пароля

      SetDeleted=     M.Access03    && Удаленные записи

      CountRecords=   M.Access04    && Заполнение таблиц

      RightAccess=    M.Access05    && Просмотр прав доступа

      SeekBuilding=   M.Access06    && Поиск зданий по параметрам

      AddBuilding=    M.Access07    && Занесение нового здания

      WorkFlats=      M.Access08    && Обработка квартир

      AccountWork=    M.Access09    && Работа с лицевым счетом

      WordExcel=      M.Access10    && Работа с внешними отчетами

      StreetTown=     M.Access11    && Работа с улицами

      DistrictTown=   M.Access12    && Работа с районами

      MaterialWall=   M.Access13    && Материал стен зданий

      Staff=          M.Access14    && Работа с пользователями

      =MESSAGEBOX('Инспектор '+ALLTRIM(FAMILY)+;

           '!  Доступ разрешен.',48,'Результат идентификации')

      * Проверка срока действия пароля (100 - число дней)

      IF DATE()>M.Date_Up+100

         =MESSAGEBOX(' Срок действия пароля истек! '+;

                  'Его необходимо сменить! ',48,' Внимание!')

         DO FORM ChangPas     && Запуск формы смены пароля

      ENDIF

   ELSE

      SuperVisor=.F.   && Идентификация не выполнена

      =MESSAGEBOX('Доступ запрещен.',;

                  48,' Результат идентификации')

   ENDIF

ENDIF

THISFORM.Release   && Закрыть форму LOGIN

CLEAR EVENTS       && Остановить обработчик событий Visual FoxPro

*- Конец процедуры

 

*- Кнопка Отказ

SuperVisor=.F.   && Идентификация не выполнена

THISFORM.Release && Закрыть форму LOGIN

CLEAR EVENTS     && Остановить обработчик событий Visual FoxPro

*- Конец процедуры