Форум » LetoDB, HbNetio. » Система авторизации » Ответить

Система авторизации

ZAlex: Проконсультируйте по системе авторизации в LetoDb. С помощью консольной утилиты console.exe создал пользователя Admin c паролем и права у него YYY. На сервере создался файлик leto_users в котором вижу пользователя Admin, закодированный пароль, права. (Предварительно в letodb.ini прописал параметр Pass_File = "Leto_users"). Остановил службу сервера LetoDb. Далее в letodb.ini прописал параметр Pass_for_Login = 1, чтобы включить авторизацию пользователя для соединения с сервером. Запустил службу сервера LetoDb. В своей задаче пытаюсь соединиться с сервером //LETO_CONNECT( cAddress, [ cUserName ], [ cPassword ], [ nTimeOut ], [ nBufRefreshTime ] ) IF leto_Connect( _Server, "Admin" ) == -1 nRes := leto_Connect_Err() IF nRes == LETO_ERR_LOGIN cErrText := "Login failed" ELSEIF nRes == LETO_ERR_RECV cErrText := "Recv Error" ELSEIF nRes == LETO_ERR_SEND cErrText := "Send Error" ELSE cErrText := "Нет соединения с сервером... Запустите сервер!" ENDIF MsgAlert( cErrText , "Предупреждение!" ) Return nil EndIf _Server указан правильно. При соединении пишет Login failed. Теперь и из консольной утилиты не могу подсоединиться к серверу и из manage.exe. Пишет Login failed. Если отключить систему авторизации - все работает нормально. Что я делаю не правильно? LetoDb-2.17-b3.

Ответов - 21, стр: 1 2 All

Pasha: При вызове leto_Connect надо указывать еще и пароль, т.е. IF leto_Connect( _Server, "Admin", <cPassw> ) == -1 ... регистр существенен.

ZAlex: Пробую: IF leto_Connect( _Server, "Admin", 123456789 ) == -1 ... При соединении пишет Login failed IF leto_Connect( _Server, "Admin", "123456789" ) == -1 ... При соединении пишет Login failed Пробовал вместо пароля вставлять из Leto_users значение - результат тот-же.

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

ZAlex: Странно все как-то... Все начинаю с нуля, теперь еще не создается файл с пользователями. Вот мой файл настроек: letodb.ini [MAIN] DataPath = d:\LetoDb\DB\ Pass_for_Login = 1 Pass_File = "leto_users" EnableFileFunc = 1 Debug = 10 Вот логи сервера: letodb.log 02/15/17 17:25:10: Leto DB Server has been started. Leto DB Server v.2.17b3 ! INIT: DataPath=d:\LetoDb\DB, ShareTables=0, MaxUsers=500, MaxTables=5000, CacheRecords=10 02/15/17 17:25:10: D:\LetoDb\letoudf.hrb has been loaded. DEBUG! new connect 127.0.0.1 (0 : 1 : 1) DEBUG! close connect 127.0.0.1 ееееееееее console.exe users=(0 : 1 : 1), tables=(0 : 0) DEBUG! close connect (null) (null) (null) users=(0 : 0 : 1), tables=(0 : 0) DEBUG! new connect 127.0.0.1 (0 : 0 : 1) DEBUG! close connect 127.0.0.1 ееееееееее console.exe users=(0 : 0 : 1), tables=(0 : 0) DEBUG! close connect (null) (null) (null) users=(0 : 65535 : 1), tables=(0 : 0) DEBUG! new connect 127.0.0.1 (0 : 65535 : 1) DEBUG! close connect 127.0.0.1 ееееееееее console.exe users=(0 : 65535 : 1), tables=(0 : 0) DEBUG! close connect (null) (null) (null) users=(0 : 65534 : 1), tables=(0 : 0) DEBUG! new connect 127.0.0.1 (0 : 65534 : 1) DEBUG! close connect 127.0.0.1 ееееееееее manage.exe users=(0 : 65534 : 1), tables=(0 : 0) DEBUG! close connect (null) (null) (null) users=(0 : 65533 : 1), tables=(0 : 0) letodb_0.log 127.0.0.1 intro;2.17b3;ееееееееее;console.exe;;;EN;mm/dd/yy;F mgmt;00; admin;uadd;user;9496E301679D4D81D0C96F6EA75D660A;YYY; intro;2.17b3;ееееееееее;console.exe;;;EN;mm/dd/yy;F mgmt;00; intro;2.17b3;ееееееееее;console.exe;;;EN;mm/dd/yy;F intro;2.17b3;ееееееееее;console.exe;user;75677BD6B1AD8E84B59C59E7CBEFC355;EN;mm/dd/yy;F intro;2.17b3;ееееееееее;console.exe;user;2CC3B305C0510AD5111BD8A4B7FF5DA4;EN;mm/dd/yy;F intro;2.17b3;ееееееееее;manage.exe;user;2796E4DFA96D58FCDCC83A7EC48ABA31;EN;mm/dd/yy;F Пробовал с серверами как Daemon_mode так и Service_mode (Bin файлы с сайта Kresin.ru). Пользователи создаются, но затем не могу соединиться с сервером с созданным пользователем. Пользователей создаю console.exe. Где хранятся имена и пароли пользователей? В файле из параметра Pass_File = ?

SergKis: ZAlex пишет Где хранятся имена и пароли пользователей? В своем модуле (без manage.exe) 1. нет файла leto_users на сервере (в нем через ; хранятся user;password_кодированный;YYYNNNNNN; CRLF ...) 2. Pass_for_Login = 0 3. leto_connect("//127.0.0.1:2812/temp/") // соединились 4. leto_useradd("user1", "12345") 5. leto_useradd("user2", "aaaaa") 6. leto_useradd("user3", "bbbbb") файла leto_users на сервере не будет, пока не остановим сервер или не дадим 7. leto_userflush(), т.е. работать можно и без файла, подгружая пользователей leto_useradd(...) повторно (если есть уже) он не введется. 8. теперь, остановив сервер, можем изменить Pass_for_Login = 1 и запустить сервер снова 9. leto_connect("//127.0.0.1:2812/temp/", "user2", "aaaaa") При неверном user или password получаем nRes := leto_Connect_Err() ELSEIF nRes == LETO_ERR_LOGIN ; cErr += "Login failed" // 2 как то так работает.

SergKis: PS Если добавляем новых пользователей, в файле leto_users их не будет (обработка при коннекте есть) до команды leto_userflush()

SergKis: Авторизация работает, но не хватает при connect из internet управления переменными в соединении (для защиты данных) EnableFileFunc = 0\1 и EnableUDF = 0\1\2, т.е. для соединения поставить EnableFileFunc = 0 и EnableUDF = 0 или 1 другому. Сейчас ставим для таких соединений старую двухпоточную версию без hrb и EnableFileFunc = 0 и сервера в режиме Share_Tables = 1

ZAlex: Спасибо за участие! По такому же сценарию и делаю: 1. сервер остановлен. 2. Устанавливаю Pass_for_Login = 0 3. В программе пишу IF leto_Connect( _Server ) == -1 .... LETO_USERADD( "user1", "1111" , "YYY" ) LETO_USERADD( "user2", "2222" , "YYY") LETO_USERADD( "user3", "3333" , "YYY") LETO_USERFLUSH() 4. Запускаю сервер. 5. Запускаю программу 6. В letodb_0.log вижу iintro;2.17b3;xxxxxxxxxxx;BPK.exe;;;RU1251;DD.MM.YYYY;T admin;uadd;user1;75766973BBF1FC91;YYY; admin;uadd;user2;6A3A289AA6060C5B;YYY; admin;uadd;user3;E75025DF4454C1C6;YYY; admin;flush; . . значит пользователи добавились. 7. Останавливаю сервер. 8. Устанавливаю параметр Pass_for_Login = 1 9. В программе пишу IF leto_Connect( _Server, "user1", "1111" ) == -1 ... 10. Запускаю сервер 11. Запускаю программу - пишет "Login failed" 12. В letodb_0.log вижу intro;2.17b3;xxxxxxxxxxxxx;BPK.exe;user1;ECB53BE723F1E421;RU1251;DD.MM.YYYY;T Почему пароль для user1 при создании и затем при выполнении модуля не совпадают? Или это не то? Сервер и клиента запускаю на Windows 7, машины в доменной сети. Буду пробовать дома, может дело в правах пользователя. На Win7 вхожу не под админской учетной записью.

SergKis: У нас сервера работают не как сервис, а как DAEMON изначально. Запуск letodb.exe test и останов letodb.exe stop. На чужих компах нормально с сервисами не дают работать админы. Может старт\стоп сервиса не перечитывает ini ?

Dima: ZAlex А если пробнуть по простому без L:P ? В 2013 году я пробовал перевести с Clipper на Harbour + Leto и работало нормально , правда остался на Harbour + Ads

ZAlex: Пробовал сервер как DAEMON - результат тот-же. Менял переменные EnableFileFunc 0\1 , EnableUDF 0\1\2 в разных сочетаниях - не помогает. Дома запускал под административной учеткой в разных вариантах DAEMON SERVICE - результат тот-же. Что еще предпринять? Без авторизации все отлично работает, но по политике безопасности фирмы требуется авторизация. А что с логами - это правильно закодированные пароли? Почему не совпадают? В исходниках сервера не смотрел, но это подозрительно.

ZAlex: Dima А если пробнуть по простому без L:P ? Не понял. Т.е. без LetoDb?

Dima: ZAlex пишет: Не понял. Без логина и пароля Я когда тестил , подключался примерно так и все работало без всяких отдельных прог [pre2] iniret:=IniLeto() if hb_HHasKey(iniret,'Home') aHeader := iniret['Home'] pathleto:="//"+aHeader['IP adress']+":"+aHeader['Port']+"/"+aHeader['Path'] ipleto:="//"+aHeader['IP adress']+":"+aHeader['Port']+"/" endif if LETO_CONNECT(pathleto)==-1 nRes := leto_Connect_Err() IF nRes == LETO_ERR_LOGIN msg({"Login failed",""},,"Ошибка") ELSEIF nRes == LETO_ERR_RECV msg({"Recv Error",""},,"Ошибка") ELSEIF nRes == LETO_ERR_SEND msg({"Send Error",""},,"Ошибка") ELSE msg({"No connection",""},,"Ошибка") ENDIF quit return nil endif [/pre2]

ZAlex: Без логина и пароля все работает отлично, но желательно иметь авторизацию. Если сервер LetoDb имеет возможность такую возможность, почему бы не воспользоваться? А желательно иметь сквозную авторизацию: залогинился на компьютер с доменной учеткой и ее использовать для соединения с сервером.

ZAlex: Версии компилятора и линковщика могут как-то влиять? У меня такие инструменты: Компилятор Harbour Version: 3.2.0dev (r1607181832) Built on: Jul 20 2016 Линковщик Embarcadero C++ 7.00 for Win32 Copyright (c) 1993-2015 Embarcadero Technologies, Inc. Библиотека клиента и сервер Leto DB Server v.2.17b3. Все-же меня смущает, что закодированный пароль(сохраненный) и используемый для авторизации в логах разные. Где искать причину?

Pasha: Авторизацию делал не я, вот сижу разбираю, как она работает. Почему у Вас не работает - непонятно, у меня при тех же вводных все получилось. Даже имя и пароль сделал такие же - "user1" и "1111". Пароль при добавлении пользователя и при авторизации передается в зашифрованном виде. Ключ для шифровки каждый раз используется разный, поэтому и в логе зашифрованный пароль получается разный. Сеансовый ключ генерируется сервером при коннекте пользователя, и затем используется во время сеанса. Конечно, алгоритм его получения очень простой. Не все мне в этом алгоритме понятно, если Александр заглянет в эту тему, может быть он прояснит. Дополню: Клиент передает на сервер зашифрованный сеансовым ключем пароль при добавлении пользователя и его авторизации. Сервер расшифровывает этот пароль тем же сеансовым ключем, а в файл leto_users записывает пароль, зашифрованный стандартным ключем, ну и при считывании этого файла расшифровывает его тем же стандартным ключем. Неясен для меня такой момент: почему в файле leto_users и в команде uadd зашифрованный пароль получается одинаковым, ведь он шифруется разным ключем.

ZAlex: По файлу leto_users - почему-то он не создается, когда добавляю пользователя командой LETO_USERADD( ...) и LETO_USERFLUSH() . Первый раз (когда создавал пользователя console.exe) этот файлик создался. После этого даже пустой не создается. Такое впечатление, что где-то в какой-то переменной хранится отметка о его создании. Компьютер полностью выключал и по новому запускал сервер. Может где-то здесь собака зарыта. Переносил сервер на другой комп - безрезультатно. Или дело в клиенте?

Pasha: Для службы letodb этот файл может быть создан в папке c:\windows\system32. Для демона он конечно будет в папке letodb.

ZAlex: Методом проб и ошибок пришел к такому результату: - если в файле настроек letodb.ini параметр Pass_File с начальным пробелом - то файл с пользователями создается, корректируется и читается, если без пробела не читается и не создается. - а вот параметр DataPath д.б. без начальных пробелов. При таких условиях у меня начала работать авторизация. Чудно немного, но...

Pasha: Задавать параметр Pass_File в letodb.ini необязательно, по умолчанию у него и так значение leto_users. Наверное, дело в неточности примера задания этого параметра в readme.txt: Pass_File = "leto_users" кавычки здесь лишние, иначе они попадают в имя файла. Правильно будет так: Pass_File = leto_users



полная версия страницы