Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Авторизация в клиентском приложении


Автор: BaLaBaXa 22.12.2007, 12:50
Здравствуйте!

Я создал некую БД в MS SQL Server 2005 и несколько пользователей с определёнными привилегиями на эту БД. Написал клиентское приложение на Delphi, связанное с этой базой через ADO компоненты. После запуска этого приложения выскакивает форма с полями для логина и пароля и кнопкой.

Какой код в методе Click данной кнопки необходимо мне прописать, чтобы данные с полей сравнивались с данными о пользователях на сервере и в случае успешной аутентификации произошёл вход в клиентское приложение. И какие при этом компоненты необходимо использовать?

P.S.: Ничего толкового в поиске не нашёл по этому поводу.

Автор: ТоляМБА 22.12.2007, 13:18
Цитата(BaLaBaXa @  22.12.2007,  14:50 Найти цитируемый пост)
После запуска этого приложения выскакивает форма с полями для логина и пароля и кнопкой.
Если ты имеешь ввиду табличку "Database Login", то в Object Inspector поставь у ADOConnection свойство LoginPrompt в False или в рантайме перед активацией соединения пропиши
Код
ADOConnection1.LoginPrompt:=false;
И табличка выскакивать не будет.

Нижесказанное ИМХО:
Цитата(BaLaBaXa @  22.12.2007,  14:50 Найти цитируемый пост)
чтобы данные с полей сравнивались с данными о пользователях на сервере и в случае успешной аутентификации произошёл вход в клиентское приложение
А вот юзерам серверные пароли (пусть даже на ReadOnly) я бы не советовал давать в целях безопасности не только целостности но и конфиденциальности данных. Ставь пароли на доступ юзера к программе, но ни как не к базе данных.

Автор: BaLaBaXa 22.12.2007, 13:32
Цитата(ТоляМБА @  22.12.2007,  13:18 Найти цитируемый пост)
Если ты имеешь ввиду табличку "Database Login", то в Object Inspector поставь у ADOConnection свойство LoginPrompt в False

Нет, я не это имею ввиду. Наоборот, я сам создаю форму, на которой, соответствующие поля и кнопка. Хочу, чтобы вход был по логину и паролю.  smile 

Цитата(ТоляМБА @  22.12.2007,  13:18 Найти цитируемый пост)
А вот юзерам серверные пароли (пусть даже на ReadOnly) я бы не советовал давать в целях безопасности не только целостности но и конфиденциальности данных. Ставь пароли на доступ юзера к программе, но ни как не к базе данных.

Это конечно правильно. Но у меня не такая серьёзная работа. Я курсовую делаю, так что главное чтобы работало.  smile 

Автор: Exai1e 22.12.2007, 14:19
Юзер вводит логин пароль. Создаеш запрос к базе
Код

select UserName, UserPassword from Users Where (UserName = '' + edit1.text + '') and (UserPassword = '' + edit2.text + '');

если кол-во возвращенных записей не равно 0 то пускаеш, иначе не пускаеш smile

p.s. это так примерно smile но думаю что должно работать smile

Автор: BaLaBaXa 22.12.2007, 15:32
Цитата(Exai1e @  22.12.2007,  14:19 Найти цитируемый пост)
если кол-во возвращенных записей не равно 0 то пускаеш, иначе не пускаеш

А как в этом случае посчитать кол-во возвращённых записей?  smile 
Цикл что ли делать и заводить новую переменную? Или как-то по другому можно?

Можно поподробнее?  smile 

Автор: Anark1 22.12.2007, 19:21
Код

SQL_Str = 'select COUNT(*) as rcount from Users Where (UserName = ' + edit1.text + ') and (UserPassword = ' + edit2.text + ');'
ADOQuery1.SQL.Add(SQL_Str);
ADOQuery1.Open();
ADOQuery1.FieldByName("rcount")



или


Код

SQL_Str := 'select UserName, UserPassword from Users Where (UserName = ' + edit1.text + ') and (UserPassword = ' + edit2.text + ')';
ADOQuery1.SQL.Add(SQL_Str);
ADOQuery1.Open();
ADOQuery1.RecordCount;


Автор: kobra 23.12.2007, 18:58
рас задача состоит в том чтобы юзер конектился к базе по своему логину, метод предложенный Exai1e-ом не подоидет. так как чтобы запустить запрос, нужно быть уже залогиненним.
задача решается двумя способами:
1. включить LoginPrompt и система при конекте сама позаботится осталном.
2. сделать аналог первого варианта в ручную. для этого перед конектом на основе введеннои клиентом олгина и пароля составить строку соединения и передать его в соответствуишее своиство компонента, который обеспечивает соедение и открыть соеденение. 

Автор: Anark1 23.12.2007, 19:50
kobra, прав только в том случае если речь идет об юзерах на уровне сервера. А если имеем дело с юзерами представленными в бд записями, то Exai1e прав. Соответственно мой пост выше относится ко второму случаю.

Автор: BaLaBaXa 23.12.2007, 20:31
Цитата(kobra @  23.12.2007,  18:58 Найти цитируемый пост)
1. включить LoginPrompt и система при конекте сама позаботится осталном.

Нет, у меня LoginPrompt специально отключено...так как использую Windows-аутентификацию. Нет необходимости каждый раз вводить имя и пароль для доступа к серверу.

Цитата(Anark1 @  23.12.2007,  19:50 Найти цитируемый пост)
kobra, прав только в том случае если речь идет об юзерах на уровне сервера. А если имеем дело с юзерами представленными в бд записями, то Exai1e прав. Соответственно мой пост выше относится ко второму случаю. 

В смысле "с юзерами представленными в бд записями"? У меня юзеры создаются в разделе Security/Logins на сервере и у каждого свои привилегии на определённые БД. Точнее моё приложение работает только с одной БД.
Как тогда мне лучше в этом случае сделать авторизацию? По способу, что предложил kobra или Exai1e и Anark1?

Добавлено через 8 минут
Попробовал включить LoginPrompt! Теперь коннектится при абсолютно любых логинах и паролях!  smile  Ввожу любые данные и всё равно всё успешно...открывается моё приложение!  smile 

Автор: Anark1 23.12.2007, 22:01
BaLaBaXa, каким образом ты будешь выполнять запросы к системным таблицам ? Я думал у тебя пользователи представлены в виде записей некоторой таблицы. Естественно, так как у тебя придется формировать строку подключения. Под каждого юзера+првиелегию своя строка будет получаться.

Автор: BaLaBaXa 23.12.2007, 22:26
Цитата(Anark1 @  23.12.2007,  22:01 Найти цитируемый пост)
BaLaBaXa, каким образом ты будешь выполнять запросы к системным таблицам ? 

После запуска приложения коннект к серверу проиходит автоматически (LoginPrompt отключен), а уже после этого на форме, где поля для логина и пароля, по нажатию кнопки делать запросы. Или это не получится?

Цитата(Anark1 @  22.12.2007,  19:21 Найти цитируемый пост)
SQL_Str := 'select UserName, UserPassword from Users Where (UserName = ' + edit1.text + ') and (UserPassword = ' + edit2.text + ')';

А что тут подразумевается под Users? Типа моя собственная таблица с юзерами? У меня её нет...и заводить не хочу. Все юзеры созданы на сервере. Как же быть? smile 

Автор: kobra 24.12.2007, 08:40
есть два варианта авторизации
1. по винде
так как у тебя авторизация по винде, подклучатся будеш в лубом случае. так как сервер смотрит какои юзер логинится по учетнои записи винды. в таком случае не нужно вводить не логин не парол. веть юзер это уже сделал при входе в винду.
2. по учетке на сервере.
вот в этом случае нужно вводить логин и парол.

Автор: BaLaBaXa 24.12.2007, 16:42
kobra, я это всё прекрасно знаю!  smile 
Ещё раз опишу проблему...подробно. У меня стоит MS SQL Server. Вход в него происходит посредством Windows-аутентификации. На сервере есть БД и 3 созданных мною юзера с определёнными привилегиями на эту БД. Также есть клиентское приложение, работающее только с этой БД. У ADOConnection1 свойство LoginPromрt равно False...чтобы не выскакивало каждый раз окошко для ввода логина и пароля.
Я хочу, чтобы после запуска этого приложения сначала надо было авторизоваться, чтобы работать в нём. Причём авторизоваться по логину и паролю тех 3-х пользователей, что создал на сервере (которые хранятся в: "Имя сервера"/Security/Logins...ну или в: ("Имя сервера"/Databases/"Имя базы"/Security/Users). Т.е. хранятся не в созданной мною специальной таблице с юзерами.
Как же всё-таки это мне сделать? Ничего не получается... :(

Автор: Anark1 24.12.2007, 17:00
BaLaBaXa, во первых. Тогда не понятно зачем LoginPrompt = false. Пусть бы юзер сам вводил свои логин и пароль.
Второе. Можно делать это всё вручную (не знаю зачем, но вдруг). Вручную формируется свойство TADOConnection->ConnectionString.
Код

ADOConnection1->ConnectionString = "...Password=123;Persist Security Info=True;User ID=1231..."

Соответственно USER ID и Password можно брать из эдитов.

Автор: BaLaBaXa 25.12.2007, 14:41
Цитата(Anark1 @  24.12.2007,  17:00 Найти цитируемый пост)
BaLaBaXa, во первых. Тогда не понятно зачем LoginPrompt = false. Пусть бы юзер сам вводил свои логин и пароль.

Потому что, когда оно True, можно войти в прогу с любым логином и паролем. Даже которых в принципе не существует.
Ещё раз. Изначально может ошибка? В свойстве ADOConnection1 настроил свойства: ConnectionString => нажал кнопку Build, выбрал Поставщика данных - Microsoft OLE DB Provider for SQL Server. Затем выбрал имя сервера. Для входа в сервер я использовал: "учетные сведения Windows NT", была ещё строка для выбора: "следующие имя и пароль пользователя", но тогда вход был бы всегда только по этим логину и паролю...а мне нужно всегда под разными заходить. LoginPrompt = False, Connected =  True.
Что не так? Неужели это такая сложная проблема, что мы не можем никак в ней разобраться?  smile 

Автор: kobra 25.12.2007, 16:39
Цитата(BaLaBaXa @  25.12.2007,  14:41 Найти цитируемый пост)
Что не так? Неужели это такая сложная проблема, что мы не можем никак в ней разобраться?
нет, проблемы нет. просто почемуто мы друг друга не понемаем, к сажалению.
постараюс по пунктам:
1. после запуска программы появляется окошко требующая логин и парол.
2. после ввода и клика на ок, программа формирует строку соедения.
3. вот эта строка и записывается в ADOConnection1.ConnectionString.
4. открывается ADOConnection1.

Автор: Anark1 25.12.2007, 16:53
Цитата(BaLaBaXa @ 25.12.2007,  14:41)
любым логином и паролем. Даже которых в принципе не существует.

Это почему ? 

Автор: BaLaBaXa 25.12.2007, 17:08
Цитата(kobra @  25.12.2007,  16:39 Найти цитируемый пост)
нет, проблемы нет. просто почемуто мы друг друга не понемаем, к сажалению.
постараюс по пунктам:
1. после запуска программы появляется окошко требующая логин и парол.
2. после ввода и клика на ок, программа формирует строку соедения.
3. вот эта строка и записывается в ADOConnection1.ConnectionString.
4. открывается ADOConnection1.

Хорошо, я попробую сформировать эту строку без ошибок на основе введённых данных (логин и пароль). Пока не получается...

Цитата(Anark1 @  25.12.2007,  16:53 Найти цитируемый пост)
Это почему ?  

Вот не знаю. Скорее всего, потому что у меня выбрано: "учетные сведения Windows NT" (как я уже писал выше). Видимо чтобы мы не ввели, коннект всё равно происходит по Windows-аутентификации. Поэтому так и получается.

Автор: BaLaBaXa 26.12.2007, 17:09
Ребята! Всем спасибо за хорошие советы!  smile 
Я разобрался с проблемой, теперь всё работает!  smile 
Тема закрыта.

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