Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Firebird, Interbase > FBierd 2.0 смена логина и пароля


Автор: sith 18.10.2007, 09:02
... вообщем то хочу разобраться в таком деле...

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

... и хотелось бы понять...
SYSDBA
masterkey
это логин пароль БД или самого СУБД...?

... и как мне сделать пароль и логин непосредственно на базуданных... ?

Автор: Anark1 18.10.2007, 10:31
sith, 
1. С IBExpert не работал, но думаю можно.
2. SYSDBA - зарезервированное имя, masterkey - пароль по умолчанию. Пароль ставится не на БД, а на сервер. То есть для всех БД, обслуживаемых одним сервером сохраняется один и тот же список пользователей.
3. Непосредственно на БД нужно писать самому. Создаешь таблицу USERS, в ней LOGIN, PASS. И вручную обрабатываешь соединение.

Автор: sith 18.10.2007, 21:22
3. Непосредственно на БД нужно писать самому. Создаешь таблицу USERS, в ней LOGIN, PASS. И вручную обрабатываешь соединение.


... а как это делаеться...?

Автор: Anark1 18.10.2007, 21:39
Код

CREATE TABLE USERS (
  ID    INTEGER NOT NULL,
  LOGIN VARCHAR(30),
  PASS  VARCHAR(30),
  RID   INTEGER NOT NULL
);

SQL запрос создающий таблицу. Скопировал кусок из проекта, для твоей задачи поле RID, думаю не обязательно.
Дальше на приложении клиенте две поля - для логина и пароля. И кнопочку коннект. Обработчик события OnClick этой кнопки может выглядеть например так :
Код

void __fastcall TLogin::bttnConnectClick(TObject *Sender)
{
int rcount;
AnsiString pw_text, login_text, SQL_str, role_str, dept_name;
if (edit_login->Text.Length() != 0 )
        {
        if (edit_pw->Text.Length() !=0 )
        {
        Main->IBDatabase1->Params->Append("user_name=ESTAB");
        Main->IBDatabase1->Params->Append("password=estab");
        Main->IBDatabase1->Params->Append("sql_role_name="+ROLE);
        Main->IBDatabase1->Params->Append("lc_ctype=WIN1251");
        Main->IBDatabase1->Connected = true;
        Main->IBLogin->SelectSQL->Clear();
        SQL_str = "SELECT count (*) AS rcount FROM USERS WHERE (LOGIN='";
        pw_text = edit_pw->Text;
        login_text = edit_login->Text;
        SQL_str = SQL_str + login_text + "') AND (PASS = '" + pw_text + "')";
        Main->IBLogin->SelectSQL->Add(SQL_str);
        Main->IBLogin->Open();
        rcount = Main->IBLogin->FieldByName("rcount")->AsInteger;
        if (rcount == 0)
        {
                ShowMessage("Error, user not found");
                Main->IBDatabase1->Connected = false;
        }
        else
        { 
         // запуск некоторой формы для пользователя, успешно прошедшего проверку.
         }

Код C++ Builder \ InterBase \ InterBase Express
Я ответил на вопрос ?

Автор: sith 18.10.2007, 23:43
ну почти... если бы ты написал код на Java:)
... может просто алгоритм опишешь... по подробнее...?

Автор: Anark1 19.10.2007, 20:08
sith, интересный ты человек  smile обычно когда говорят алгоритм, просят привести пример кода. Ты наоборот.
на Java, к сожалению, не пишу.
Могу описать алгоритм. Идея заключается в том, чтобы найти запись с данными логином и паролем.
1. Формируем строку запроса вида 
Код

SELECT count (*) AS rcount FROM USERS WHERE (LOGIN = 'IVANOV') AND (PASS = '123')

2. В поле rcount нам вернется количество записей. При этом поля Login и Pass должны быть основой для уникального составного индекса. Это для того, чтобы связка логин+пароль не повторялась.
3. Таким образом значение поля может быть 1 - если такой пользователь есть. И 0 - если таких пользователей нет.
4. А затем соответственно выполняется дальнейшая часть кода, или выкидывается сообщение типа "User not found".

Автор: sith 19.10.2007, 22:55
... фух... сложновато... но в любом случае... все это дело не прописываеться в мета данные самой базы данных... я в своем коде делаю все эти проверки и установки... то есть... любой пользователь может написать свой код и работать с моей базой данных как того возжелает...? или не так?

Автор: Anark1 20.10.2007, 14:36
sith, любой пользователь, который знает связку login - password для сервера может выполнять все разрешенные данному аккаунту операции над твоей БД. По этому то и следует меня пароль для SYSDBA. 
Я ответил, как мне кажется, довольно полно. Все вроде бы понятно написал. Если даже тут возникают вопросы, то стоит что нибудь почитать.
И ничего сложного в этом нет.
Если создается многопользовательское приложение, содержащее очень много пользователей, при этом каждый пользователь имеет свои уникальные настройки, то целесообразно хранить пользователей именно в таблице БД. 
Хотя с помощью средств InterBase Express, выполнив соединение под SYSDBA, можно добавлять удалять пользователей. Именно на уровне сервера, а не как запись в нашей таблице USERS.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)