Версия для печати

Учетные записи пользователя в InterBase/Firebird

Оцените материал
(7 голосов)

Учетные записи пользователя в InterBase/Firebird

Для доступа различных пользователей ко всем базам данных одной машины (обычно сервера) в InterBase/Firebird используется база данных безопасности. Это файл базы данных, хранящийся в корневом каталоге инсталляции сервера базы данных и имеющий имя isc4.gdb для InterBase 6.х и Firebird 1.0.х , admin.ib для InterBase 7.х или security.fdb для Firebird 1.5.

После инсталляции системы база данных безопасности содержит ровно одну учетную запись — пользователь SYSDBA с паролем masterkey . Это особый пользователь системы. Он имеет неограниченный доступ и неограниченные полномочия к любой базе данных, находящейся на серверной машине. Изменить имя этого пользователя или удалить его из базы данных безопасности невозможно, но можно поменять пароль, что весьма рекомендуется сделать сразу после инсталляции системы в промышленно работающей вычислительной сети.

В статье рассматриваются средства работы с учетными записями пользователя.

Только пользователь SYSDBA может отображать, удалять, изменять и создавать любое количество учетных записей для различных категорий пользователей.

Структура учетной записи описана в табл. 1.

Таблица 1. Структура учетных записей пользователей

•  Столбец

•  Описание

•  UserName

•  Имя пользователя. Максимальная длина 31 символ. Имя не чувствительно к регистру.

•  Password

•  Пароль пользователя. Чувствителен к регистру. Максимальное количество символов 32, однако только первые восемь имеют значение.

•  UID

•  Целое число, задающее идентификатор пользователя.

•  GID

•  Целое число, задающее идентификатор группы.

•  FirstName

•  Имя. Может занимать до 17 символов.

•  MiddleName

•  Второе имя. Можем использовать в качестве отчества. До 17 символов.

•  LastName

•  Фамилия. До 17 символов.

Обязательными являются только имя пользователя и пароль.

Внимание. Ни в каком поле учетной записи не пытайтесь использовать буквы кириллицы. Такая запись не будет создана или изменена.

Для работы с учетными записями базы данных безопасности (отображение, добавление, изменение, удаление) используется утилита gsec или какая-либо из программ графического интерфейса.

Просмотр и изменение учетных записей пользователей

Для отображения, создания и изменения учетных записей можно использовать утилиту gsec, входящую в комплект поставки сервера базы данных, и программу графического интерфейса, например, IBExpert или SQLHammer. Кроме того, используя компоненты FIBPlus, мы можем написать собственную программу, выполняющую необходимые действия и имеющую нравящийся нам интерфейс. Рассмотрим все эти варианты.

Использование gsec

Поработаем с учетными записями с использованием утилиты командной строки gsec .

Вызовите окно командной строки. Сделайте текущим диск, где находится установленный сервер базы данных, введя имя диска и двоеточие, например:

c :

После этого войдите в подкаталог \ Bin корневого каталога инсталляции сервера базы данных, например,

cd \Program Files\Firebird\Firebird_1_5\Bin 

Запустите утилиту gsec, введя:

gsec -user sysdba -password masterkey 

Все переключатели, команды, операторы и значения не являются чувствительными к регистру (кроме пароля) — вы можете вводить их как строчными, так и прописными буквами.

Появится подсказка утилиты:

GSEC > 

Отобразите учетные записи, набрав display и нажав Enter .

Если вы не добавляли учетных записей, то будет отображена только учетная запись пользователя SYSDBA. Обратите внимание, что пароль не выводится. Вообще в окне DOS отображение не слишком удобное для восприятия, потому что размер экрана (80 символов) явно маловат для размещения всей строки.

Добавьте новую учетную запись, например, WIZARD и с паролем master. Для этого используется команда ADD. Переключатели этой команды приведены в табл. 2.

Таблица 2. Переключатели команды ADD

•  Переключатель

•  Назначение

•  Нет

•  Первый позиционный параметр. Имя пользователя.

•  -pw

•  Пароль пользователя.

•  -uid

•  Идентификатор пользователя.

•  -gid

•  Идентификатор группы.

•  -fname

•  Имя.

•  -mname

•  Второе имя.

•  -lname

•  Фамилия.

Введите:

GSEC > add wizard - pw master 

Если вы попытаетесь ввести пользователя, который уже существует в базе данных безопасности, то после выдачи сообщения об ошибке программа завершит свою работу.

Отобразите обновленный список пользователей, используя команду display .

Чтобы изменить значение любого поля учетной записи кроме имени, используется команда modify, параметры которой совпадают с командой add. Для удаления значения какого-либо поля в записи нужно указать переключатель и не задавать никакого значения.

Если вы работаете в сети, то, используя утилиту gsec, вы можете с клиентского компьютера работать с базой данных безопасности на серверной машине или на любой другой машине, находящейся в сети. Для этого нужно при запуске утилиты добавить переключатель – database. Например, можно ввести (одной строкой):

gsec -user sysdba -password masterkey –database server:c:\Firebird\security.fdb 

После этого в диалоговом режиме можно отображать, добавлять и изменять учетные записи пользователей на сервере.

Если в именах каталогов, которые включаются в путь к базе данных безопасности, присутствуют пробелы, то все значение переключателя – database должно заключаться в кавычки. Например, необходимо использовать кавычки в следующем случае (это размещение базы данных безопасности Firebird по умолчанию):

"server:c:\Program Files\Firebird\Firebird_1_5\security.fdb" 

Поля UID, GID, fname, mname и lname сервером базы данных в настоящий момент не используются. Вы можете помещать в них любые данные.

Для удаления любой учетной записи пользователя кроме SYSDBA используется команда DELETE:

GSEC > delete wizard 

Пользователя SYSDBA вы никак удалить не сможете. Для завершения работы с утилитой gsec введите:

GSEC > QUIT

и нажмите клавишу Enter. Для выхода из окна командной строки введите exit или закройте окно обычным для Windows способом.

Использование IBExpert

Те же действия можно выполнить при использовании программы IBExpert. Запустите программу IBExpert. Щелкните мышью по элементу меню Tools и в списке выберите User Manager. Появится окно User Manager. В выпадающем списке Server выберите ( local ).

Щелкните по кнопке Connect справа от выпадающего списка Server. Появится окно Server Login.

[Image]

Рис. 1. Диалоговое окно соединения с сервером базы данных

В поле Login уже будет задано имя пользователя SYSDBA. Вам нужно в поле Password ввести пароль masterkey (или другой, если вы изменили значение пароля) и щелкнуть по кнопке ОК. Появится список учетных записей, который будет содержать только одного пользователя SYSDBA.

[Image]

Рис. 2. Окно просмотра и изменения списка пользователей

Щелкните по кнопке Add, в появившемся окне New User введите имя пользователя (имя пользователя вы можете вводить в любом регистре, символы все равно будут появляться в верхнем регистре) и дважды введите пароль в поля Password и в Confirm Password. Щелкните по ОК. В список будет добавлена новая учетная запись пользователя.

[Image]

Рис. 3. Добавление в список нового пользователя

Для изменения существующей записи (изменять можно любое поле кроме имени пользователя) нужно щелкнуть по кнопке Edit или дважды щелкнуть мышью по нужной строке и в появившемся окне изменить желаемые поля.

Для удаления существующей записи щелкните по кнопке Delete и в диалоговом окне подтвердите удаление.

Чтобы изменить имя пользователя, вам нужно удалить старую запись и ввести новую, с другим именем и теми же или другими характеристиками.

Если вы одновременно работаете в IBExpert и используете утилиту gsec или другую программу для добавления или изменения учетных записей, то для того, чтобы увидеть в списке IBExpert новое состояние списка, нужно щелкнуть по кнопке Refresh.

Как и в случае с утилитой gsec вы можете в IBExpert просматривать и корректировать учетные записи пользователей и на других компьютерах сети. Для этого в поле Server нужно набрать имя компьютера в сети и щелкнуть по кнопке Connect. Здесь вы также можете работать и в том случае, когда база данных безопасности располагается на диске с закрытым для других компьютеров доступом.

Аналогичными средствами работы с учетными записями пользователей обладает и программа SQLHammer .

Создание программы для работы с учетными записями пользователей с использованием компонентов FIBPlus

Используя среду разработки Delphi или C ++ Builder и компоненты FIBPlus, вы можете написать собственную программу для работы с учетными записями пользователя. Напишем программу в Delphi и в C ++ Builder .

Запустите Delphi или C ++ Builder, создайте новое приложение. Положите на форму панель, очистив поле Caption и сделав выравнивание по верхнему краю. Это будет панель инструментов. Положите на панель кнопки, которые будут выполнять следующие функции: Refresh для выполнения обновления списка, Add для добавления новой записи, Edit для изменения текущей записи, Delete для удаления текущей записи, Server для выбора компьютера в сети, на котором будет просматриваться база данных безопасности.

Положите на форму компонент главного меню и создайте следующие элементы меню:

[Image]

Рис. 4. Главное меню программы работы с учетными записями пользователей

Положите также контекстное меню и создайте у него два элемента — Edit и Delete .

С закладки Additional положите на форму компонент StringGrid, в котором и будут размещаться все строки списка пользователей. Для компонента задайте выравнивание по всей свободной поверхности формы (Align = alClient ), количество столбцов ColCount = 4, количество фиксированных столбцов FixedCols = 0, количество фиксированных строк Fixed Rows = 1 (здесь будет располагаться заголовок вашей таблицы). Раскройте свойство Options , щелкнув мышью слева от названия свойства по символу +, и установите в True значение подсвойства goRowSelect (будет отмечаться вся выбранная строка, а не отдельные ячейки). Выберите из выпадающего списка PopupMenu имя вашего контекстного меню. Установите в 2 количество строк RowCount , чтобы выводились, по меньшей мере, заголовок и строка пользователя SYSDBA .

Положите на форму компоненты ImageList и ActionList .

С закладки FIBPlusServices положите на форму компонент TpFIBSecurityService. Установите его имя в SecurityService1. В поле UserName введите SYSDBA.

Теперь ваша форма должна выглядеть приблизительно следующим образом:

[Image]

Рис. 5. Программа работы с учетными записями пользователей

Компонент ImageList заполняется пиктограммами, которые будут использоваться в главном и контекстном меню при помощи элементов компонента ActionList. В компоненте ActionList создайте четыре действия ( actions ) для обновления, добавления, редактирования и удаления.

[Image]

Рис. 6. Элементы компонента ActionList

Основная задача — написать обработчики различных событий вашей программы. Но сначала нужно создать три формы, выполняющие соединение с сервером и с базой данных безопасности и осуществляющие добавление и изменение учетных записей.

Вначале две простенькие формы. Первая (FormServer ) позволяет выбрать сервер в сети и используемый протокол:

[Image]

Рис. 7. Форма выбора сервера в локальной сети

Здесь пользователь должен ввести имя сервера в его локальной сети (на самом деле это может быть любой компьютер в сети — не обязательно именно сервер) и из выпадающего списка выбрать используемый протокол: Local , NamedPipe , SPX или TCP.

Вторая форма (FormServerLogin ) дает возможность ввести пароль пользователя SYSDBA (напомним — только этот пользователь имеет право просматривать и корректировать учетные записи пользователей).

[Image]

Рис. 8. Форма задания пароля

Вернемся в главную форму. Вначале создадим процедуру отображения списка пользователей и функцию соединения с базой данных безопасности. В раздел private описания формы нужно поместить их прототипы:

private 
 
procedure ShowUsers ; 
 
function ConnectToDatabase: Boolean; 
 
{ Private declarations }

Функция соединения с базой данных безопасности:

function TFormMain.ConnectToDatabase: Boolean; 
var I: Integer; 
begin 
  Result := True; 
  FormServerLogin.Login.Text := 'SYSDBA'; 
  if (FormServerLogin.ShowModal <> mrOk) then Result := False 
  else begin 
    SecurityService1.Params.Clear; 
    SecurityService1.Params.Add('user_name=sysdba'); 
    SecurityService1.Params.Add('password=' + 
    FormServerLogin.Password.Text); 
    SecurityService1.Password := FormServerLogin.Password.Text; 
    try 
      SecurityService1.Active := True; 
    except 
      Result := False; 
    end; 
  end ; 
  if Result = False then 
  begin 
    ShowMessage('Error by connecting to security database'); 
    StringGrid1.RowCount := 2; 
    StringGrid1.FixedRows := 1; 
    StatusBar1.Panels[1].Text := '0'; 
    StringGrid1.Cells[0, 1] := ''; 
    StringGrid1.Cells[1, 1] := ''; 
    StringGrid1.Cells[2, 1] := ''; 
    StringGrid1.Cells[3, 1] := ''; 
    for I := 0 to ActionList1.ActionCount - 1 do 
      (ActionList1.Actions[I] as TAction).Enabled := False; 
  end 
  else begin 
    for I := 0 to ActionList1.ActionCount - 1 do 
      (ActionList1.Actions[I] as TAction).Enabled := True; 
      SecurityService1.Active := False; 
  end; 
end;

В блоке try делается попытка соединиться с базой данных безопасности. При этом появляется окно запроса на ввод пароля пользователя. Если возникли ошибки (например, неверный пароль), то выдается сообщение, действиям списка присваивается недоступное состояние, что переводит соответствующие кнопки и элементы меню в недоступное состояние, а функция возвращает False . При удачном соединении функция возвращает True .

Процедура ShowUsers отображает список пользователей в сетке StringGrid.

procedure TFormMain.ShowUsers; 
var i: Integer; 
begin 
SecurityService1.Active := True; 
SecurityService1.DisplayUsers; 
StringGrid1.RowCount := 2; 
StringGrid1.FixedRows := 1; 
for i := 0 to SecurityService1.UserInfoCount - 1 do 
begin 
StringGrid1.Cells[0, i + 1] := 
SecurityService1.UserInfo[i].UserName; 
StringGrid1.Cells[1, i + 1] := 
SecurityService1.UserInfo[i].FirstName; 
StringGrid1.Cells[2, i + 1] := 
SecurityService1.UserInfo[i].MiddleName; 
StringGrid1.Cells[3, i + 1] := 
SecurityService1.UserInfo[i].LastName; 
StringGrid1.RowCount := StringGrid1.RowCount + 1; 
end; 
StringGrid1.RowCount := StringGrid1.RowCount - 1; 
SecurityService1.Active := False; 
StatusBar1.Panels[1].Text := IntToStr(StringGrid1.RowCount - 1); 
end;

Для отображения списка пользователей нужно вызвать метод DisplayUsers компонента SecurityService. Данные о пользователях помещаются в список UserInfo. Количество элементов в списке содержится в свойстве UserInfoCount .

Нужно написать следующий обработчик события появления формы (FormShow ):

procedure TFormMain.FormShow(Sender: TObject); 
begin 
StringGrid1.Cells[0,0] := 'User Name'; 
StringGrid1.Cells[1,0] := 'First Name'; 
StringGrid1.Cells[2,0] := 'Middle Name'; 
StringGrid1.Cells[3,0] := 'Last Name'; 
StatusBar1.Panels[1].Text := '0'; 
end;

Основную функциональность программы реализуем через компонент ActionList. Мы создали в нем четыре элемента. Необходимо связать элементы обоих меню и кнопки быстрого доступа с соответствующими действиями. Напишем программный код.

Обработчик обновления выглядит совсем просто:

procedure TFormMain.ARefreshExecute(Sender: TObject); 
begin 
ShowUsers ; 
end;

Для выполнения добавления нового пользователя в список и изменения данных существующего пользователя нужно создать новую форму FormAddUser. Разместите на форме метки, поля редактирования и две кнопки — OK и Cancel .

[Image]

Рис. 9. Форма для добавления/изменения записи пользователя

В описании формы в Delphi в разделе public опишите переменную:

public 
ActionKind : Integer ; 

Вызывающий модуль будет присваивать этой переменной значение 0, если форма используется для добавления новой записи, и 1, если для изменения существующей.

Напишите следующий обработчик события OnShow:

procedure

TFormAddUser.FormShow(Sender: TObject); 
begin 
if ActionKind = 0 then // Add new user 
begin 
Caption := 'New user'; 
UserName.Enabled := True; 
UserName.SetFocus; 
BOK.Enabled := False; 
end 
else // Edit existing user 
begin 
Caption := 'Edit user'; 
UserName.Enabled := False; 
Password.SetFocus; 
BOK.Enabled := True; 
end; 
end

Если требуется добавление нового пользователя, то поле ввода имени делается доступным, на него устанавливается фокус ввода, а кнопка ОК делается недоступной. В случае же редактирования существующей записи поле имени делается недоступным для изменения, фокус ввода устанавливается на поле ввода пароля.

Вернитесь в главный модуль и напишите код для выполнения добавления нового пользователя:

procedure TFormMain.AAddExecute(Sender: TObject); 
begin 
FormAddUser.UserName.Text := ''; 
FormAddUser.Password.Text := ''; 
FormAddUser.ConfirmPassword.Text := ''; 
FormAddUser.FirstName.Text := ''; 
FormAddUser.MiddleName.Text := ''; 
FormAddUser.LastName.Text := ''; 
FormAddUser.ActionKind := 0; 
if FormAddUser.ShowModal = mrOk then 
begin 
SecurityService1.Active := True; 
SecurityService1.UserName := Trim(FormAddUser.UserName.Text); 
SecurityService1.Password := FormAddUser.Password.Text; 
SecurityService1.FirstName := FormAddUser.FirstName.Text; 
SecurityService1.MiddleName := FormAddUser.MiddleName.Text; 
SecurityService1.LastName := FormAddUser.LastName.Text; 
try 
SecurityService1.AddUser; 
except 
ShowMessage('Error by adding new user'); 
end ; 
SecurityService1.Active := False; 
ShowUsers; 
end ; 
end ;

В начале полям ввода присваиваются пустые значения. Затем происходит обращение к форме FormAddUser . Если пользователь вышел из этой формы при щелчке по кнопке ОК, то возвращаемым значением будет mrOk . В этом случае формируются значения полей записи пользователя, добавляется новая запись (метод AddUser ) и заново отображается весь список.

Аналогичным образом выполняется изменение данных текущего пользователя:

procedure TFormMain.AEditExecute(Sender: TObject); 
begin 
FormAddUser.UserName.Text := StringGrid1.Cells[0, StringGrid1.Row]; 
FormAddUser.Password.Text := ''; 
FormAddUser.ConfirmPassword.Text := ''; 
FormAddUser.FirstName.Text := StringGrid1.Cells[1, StringGrid1.Row]; 
FormAddUser.MiddleName.Text := StringGrid1.Cells[2, StringGrid1.Row]; 
FormAddUser.LastName.Text := StringGrid1.Cells[3, StringGrid1.Row]; 
FormAddUser.ActionKind := 1; 
if FormAddUser.ShowModal = mrOk then 
begin 
SecurityService1.Active := True; 
SecurityService1.UserName := FormAddUser.UserName.Text; 
if Trim(FormAddUser.Password.Text) <> '' then 
SecurityService1.Password := FormAddUser.Password.Text; 
SecurityService1.FirstName := FormAddUser.FirstName.Text; 
SecurityService1.MiddleName := FormAddUser.MiddleName.Text; 
SecurityService1.LastName := FormAddUser.LastName.Text; 
try 
SecurityService1.ModifyUser; 
except 
ShowMessage('Error by modifying user'); 
end ; 
SecurityService1.Active := False; 
ShowUsers; 
end ; 
end ;

Для изменения данных пользователя используется метод ModifyUser компонента SecurityService. С этим обработчиком свяжите также событие OnDblClick (двойной щелчок мышью) компонента StringGrid .

Для удаления текущего элемента списка напишите следующий код:

procedure TFormMain.ADeleteExecute(Sender: TObject); 
begin 
if StringGrid1.Cells[0, StringGrid1.Row] = 'SYSDBA' then 
begin 
Application.MessageBox('You cannot delete SYSDBA user!', 
'Error', MB_OK + MB_ICONEXCLAMATION); 
exit; 
end ; 
if Application.MessageBox(PAnsiChar('Delete user account ' + 
StringGrid1.Cells[0, StringGrid1.Row] + '?'), 
'Confirmation', MB_OKCANCEL + MB_ICONQUESTION) = mrOk then 
begin 
SecurityService1.Active := True; 
SecurityService1.UserName := StringGrid1.Cells[0, StringGrid1.Row]; 
try 
SecurityService1.DeleteUser; 
except 
ShowMessage('Error by deleting user'); 
end ; 
SecurityService1.Active := False; 
ShowUsers; 
end; 
end;

В начале проверяется, не является ли текущий элемент пользователем SYSDBA. Затем после подтверждения удаления в свойство UserName компонента SecurityService помещается имя пользователя и вызывается метод DeleteUser для удаления пользователя с этим именем.

Наконец напишите обработчик щелчка по кнопке Server и свяжите с этим обработчиком соответствующий элемент меню.

procedure TFormMain.BServerClick(Sender: TObject); 
var Server: String ; 
begin 
if FormServer.ShowModal = mrOk then 
begin 
Server := Trim(FormServer.CBServer.Text); 
if (Server <> '') then 
begin 
SecurityService1.ServerName := Server; 
case FormServer.CBProtocol.ItemIndex of 
0: SecurityService1.Protocol := Local; 
1: SecurityService1.Protocol := NamedPipe; 
2: SecurityService1.Protocol := SPX; 
3: SecurityService1.Protocol := TCP; 
end ; 
end 
else 
begin 
SecurityService1.Protocol := Local; 
end ; 
if ConnectToDatabase then 
begin 
ShowUsers; 
StringGrid 1. Row := 1; 
end; 
end; 
end;

При запуске программы на выполнение все кнопки и элементы меню, кроме элементов Server, будут иметь недоступное состояние. После успешного выбора сервера все элементы управления программой становятся доступными для пользователя (в методе ConnectToDatabase ). Если при обращении к серверу произошли ошибки, эти элементы останутся недоступными.

Запустите программу на выполнение. Убедитесь в ее полной функциональности. Если у вас есть под руками подходящая локальная сеть, поэкспериментируйте с разными компьютерами в сети, проверьте, какие протоколы поддерживаются.

Если сети нет, можно эмулировать сеть на одном компьютере. Для этого нужно при выборе сервера ввести имя localhost .

Заключение

Существует множество инструментов для работы с учетными записями пользователя. Кроме того, вы можете написать собственную программу отображения и изменения учетных записей.

Можно работать с базой данных безопасности не только на локальном компьютере, но и на любом компьютере в локальной сети.

Ни в каком поле учетной записи не используйте букв кириллицы.

Создав нового пользователя в базе данных безопасности, вы можете от его имени создавать и изменять базы данных на этом компьютере. Но это уже совсем другая история. См. статью на нашем сайте «Создание и изменение базы данных в InterBase/ Firebird ».

Прочитано 23805 раз