права пользователя & вылет клиента при обрыве связи

ЧАстые Вопросы и Ответы

Модераторы: kdv, CyberMax

Konstantin_
Сообщения: 25
Зарегистрирован: 15 апр 2005, 13:45

права пользователя & вылет клиента при обрыве связи

Сообщение Konstantin_ » 15 апр 2005, 14:20

Пишу бд на fb 1.5 и клиент под неё на delphi7.
Возникли следующие вопросы:
1. Как можно вытянуть из базы
права которыми обладает подключившийся пользователь для доступа к бд( вариант реализации на клиенте или на сервере значения не имеет ).

2. При работе клиента с бд, в случае краха сервера fb и повторном его включении доступа к бд нет.
При попытке закрыть клиента он вылетает с ошибкой. Как можно это обойти.
Прибывал вариант с повторным залогиниванием к бд(с предварительным отключением
компонентов ibdb.forceclose и т.п.), но в лучшем случае компонент
ibdatabase переходит в состояние true, но sql запросы не проходят и доступа к БД нет.
(компоненты:IBDatabase1,DataSource1,IBQuery1,IBTransaction1, IBStoredProc1)

MuirsheenDurkin
Сообщения: 44
Зарегистрирован: 21 янв 2005, 10:18

Re: права пользователя & вылет клиента при обрыве связи

Сообщение MuirsheenDurkin » 15 апр 2005, 14:58

1. Это грубейшее нарушение правил безопасности. Пользователь не должен занть свои права, права должен знать тот, кто их проверяет. Тут тебе не гнилая американская демократия.

2. А транзакции?

Konstantin_
Сообщения: 25
Зарегистрирован: 15 апр 2005, 13:45

Сообщение Konstantin_ » 15 апр 2005, 15:08

1. Права пользователя нужны чтобы заблокировать или наоборот,разблокировать функции для доступа/редактирования данных на клиенте.

2. Все транзакции rollback или commite и в итоге све равно крах.

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 15 апр 2005, 15:20

Konstantin_ писал(а):1. Права пользователя нужны чтобы заблокировать или наоборот,разблокировать функции для доступа/редактирования данных на клиенте.
Глянь на всякий пожарный компонентики на Interbase Admin на эту тему. Сам не пользую, посему не уверен, но чем чёрт не шутит. Если нет - в LangRef, System Tables And Views, вокруг таблицы rdb$user_privelegies.
Konstantin_ писал(а): 2. Все транзакции rollback или commite и в итоге све равно крах.
Ну не умеет IBX корректно обрабаывать обрыв, не-у-ме-ет. На сайте где мы с тобой прямо щас балаболим, есть пара статей с вариантами обучения его этому, про обе автор IBX невнятно бурчал, что они не полностью корректны. Но у него вообще все программы, кроме евонных - суксь. Я так в таких случаях просто включаю дурочку, то бишь игнорирование всех exceptions и Application.Terminate, благо в локалке это явление редкое, а удалённые АРМ у меня работают через application server.

MuirsheenDurkin
Сообщения: 44
Зарегистрирован: 21 янв 2005, 10:18

Сообщение MuirsheenDurkin » 15 апр 2005, 15:20

Konstantin_ писал(а):Права пользователя нужны чтобы ... на клиенте.
Неправильный ответ. Права не нужны на клиенте. Это не мое мнение, это так надо.
Konstantin_ писал(а): Все транзакции rollback или commite и в итоге све равно крах.
Что это значит?
Я имел в виду, что стартовать надо транзакии после восстановления соединения, и только потом запросы открывать.

MuirsheenDurkin
Сообщения: 44
Зарегистрирован: 21 янв 2005, 10:18

Сообщение MuirsheenDurkin » 15 апр 2005, 15:33

Уважаемый Merlin!

По моим данным после выдачи любого гранта на rdb$user_privelegies все остальные болт получат из этой таблицы. Да и идейно неправильно это.

И насчет обрыва. Дело не в IBX, по-моему. В общем, у меня все восстанавливается нормально.

Konstantin_
Сообщения: 25
Зарегистрирован: 15 апр 2005, 13:45

Сообщение Konstantin_ » 15 апр 2005, 15:51

1. Написав
=>Права пользователя нужны чтобы ... на клиенте.<=
я хотел узнать какие операции может выполнять подключившийся пользователь в бд, и исходя из этого заблокировать лишние функции в клиенте и т.п.

2. В случае повторного подключения после краха и старта транзакций,
удается получить доступ к первой таблице, но к остальным таблицам достцпа так и нет. КАК БЫТЬ !

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 15 апр 2005, 16:01

MuirsheenDurkin писал(а):Уважаемый Merlin!
По моим данным после выдачи любого гранта на rdb$user_privelegies все остальные болт получат из этой таблицы. Да и идейно неправильно это.
Уважаемый MuirsheenDurkin!

А по моим данным выдача грантов на системные таблицы в FB является наивным хаком, с успехом ликвидируемым путём backup-restore. По нутру же самого сервера доступ к системным таблицам регулируется правилами не SQL, а GDML, то бишь - что не запрещено, то разрешено. В чём идейная неправильность дизабледения-енаблядения конопучек на формах на основании данных из означенной таблицы, я тоже не очень отчётливо. Имена таблиц как и так в программе фигурируют. Другое дело, что при достаточно сложной структуре объектов и прав это становится неээффективным делом, но это проблема вопрошающего. Кстати, упомянутый перевод доступа к системным таблицам на SQL-рельсы насильственным хакерским способом тоже быстродействия не добавляет. И при наличии достаточного количества объектов в базе и достаточного количества юзеров очень и очень не добавляет.
MuirsheenDurkin писал(а): И насчет обрыва. Дело не в IBX, по-моему. В общем, у меня все восстанавливается нормально.
Возможно у нас разные в этом плане IBX. Может Джефф чего и довёл до ума в последних, я от его дерева довольно давно свой отросток пустил и к нему с тех пор не заглядываю.

Konstantin_
Сообщения: 25
Зарегистрирован: 15 апр 2005, 13:45

Сообщение Konstantin_ » 15 апр 2005, 16:10

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

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 15 апр 2005, 16:22

Konstantin_ писал(а):По последним двум постам я так и не понял как мне решить проблему с правами и вылетом клиента.
Здесь код за вопрошающих не пишут, здесь пинают в нужную сторону и только. С правами. Читать Language Reference с целью изучения как права лежат в упомянутой таблице и сочинить достающий их оттуда запрос. С результатами его обращаться по вкусу. С вылетом. Иди на www.ibase.ru , в раздел Статьи, искать на тему методов восстановления коннекта в IBX. Или освежить IBX, если MuirsheenDurkin прав.

Konstantin_
Сообщения: 25
Зарегистрирован: 15 апр 2005, 13:45

Сообщение Konstantin_ » 15 апр 2005, 16:29

Код писать никто не просил. Мне просто нужен был совет по текущим проблемам.

MuirsheenDurkin
Сообщения: 44
Зарегистрирован: 21 янв 2005, 10:18

Сообщение MuirsheenDurkin » 15 апр 2005, 16:31

Константину.
Насчет прав - делай select из RDB$USER_PRIVILEGES, Merlin разрешил. Начет обрыва - забей и в случае обрыва закрывай приложение. Источники те же.

Merlin'у:
С Вашими аргументами согласен, но имею предложить свои. То, что пользователь узнает о правах, данных не ему - чистая дырка в безопасности, это, я надеюсь понятно. Просто потому, что сам факт выдачи какого-либо права может являться секретом. А располагая механикой получения всех своих прав он сможет думать о том, как ему все это по кривой объехать. А так у него лишних мыслей не возникает. Что всегда хорошо.
Насчет IBX. В случае обрыва коннекта я закрываю все датасеты (close), прибиваю все IBSQL, Rollback всем TTransaction, Start всем транзакциям, open всем dataset'ам. Все работает, в смысле, жалоб нет. Хотя ситуация досточно редкая, может, по статистике повезло. IBX ныне действующий.

Konstantin_
Сообщения: 25
Зарегистрирован: 15 апр 2005, 13:45

Сообщение Konstantin_ » 15 апр 2005, 16:34

За советы всем спасыбо.

SAMZ
Сообщения: 128
Зарегистрирован: 21 мар 2005, 08:17

Re: права пользователя & вылет клиента при обрыве связи

Сообщение SAMZ » 18 апр 2005, 05:53

Konstantin_ писал(а):Пишу бд на fb 1.5 и клиент под неё на delphi7.
Возникли следующие вопросы:
1. Как можно вытянуть из базы
права которыми обладает подключившийся пользователь для доступа к бд( вариант реализации на клиенте или на сервере значения не имеет ).

2. При работе клиента с бд, в случае краха сервера fb и повторном его включении доступа к бд нет.
При попытке закрыть клиента он вылетает с ошибкой. Как можно это обойти.
Прибывал вариант с повторным залогиниванием к бд(с предварительным отключением
компонентов ibdb.forceclose и т.п.), но в лучшем случае компонент
ibdatabase переходит в состояние true, но sql запросы не проходят и доступа к БД нет.
(компоненты:IBDatabase1,DataSource1,IBQuery1,IBTransaction1, IBStoredProc1)
По второму вопросу, посмотри компоненнты FIBPlus. Там есть компоненты, способные пережевать событие Lost Cinnect

Konstantin_
Сообщения: 25
Зарегистрирован: 15 апр 2005, 13:45

Сообщение Konstantin_ » 19 апр 2005, 07:31

В случае разрыва соединения с сервером пробывал вариант с полным пересозданием вcех компонентов связанных с работой БД( ibdb.free, и т.д. затем их создание + переопределение связей между ними через дин.созд.об ). Объекты создаются успешно, запросы работают, но при разрыве связи с сервером все равно вылетает ошибка потери соединения.

Кто знает как можно по нормальному обработать разрыв с сервером кроме как переход на FIBPLUS////

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 19 апр 2005, 10:45

что ты хочешь-то от разрыва соединения? если оно произошло, восстановить контекст уже нельзя. сеть чини, чтобы не было обрывов.

Konstantin_
Сообщения: 25
Зарегистрирован: 15 апр 2005, 13:45

Сообщение Konstantin_ » 19 апр 2005, 11:19

С починкой сети все понятно, но соединение после разрыва можно восстановить (как вариант проблемы - остановка сервера fb и повторный запуск при работе на локальной машине). Вот здесь и проблема с обращением к БД после разрыва связи.
Как восстановить связь клиента с БД если соединение восстановилось(LAN) а клиентское приложение например пытается выполнить запрос и т.п.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 19 апр 2005, 11:55

но соединение после разрыва можно восстановить (как вариант проблемы - остановка сервера fb и повторный запуск при работе на локальной машине). Вот здесь и проблема с обращением к БД после разрыва связи.
нельзя ничего восстановить! клиент работает с сервером В КОНТЕКСТЕ tcp (или другого) соединения. И когда соединение оборвано операционной системой, этот контекст восстановить НЕЛЬЗЯ.
Рассматривайте это как обрыв при закачке файла с сервера, который не поддерживает докачку.
Как восстановить связь клиента с БД если соединение восстановилось(LAN) а клиентское приложение например пытается выполнить запрос и т.п.
никак, уже ведь сказали. Все способы реконнекта для IBX и в FIBPlus это повторный коннект. Это не восстановление соединения. Это осуществление соединения ЗАНОВО.

что касается самого транспорта, например tcp, то за восстановление отвечает операционная система (стек tcp), и если на этом уровне соединение восстановить ей не удалось, то для сервера это 100% обрыв связи.

Konstantin_
Сообщения: 25
Зарегистрирован: 15 апр 2005, 13:45

Сообщение Konstantin_ » 19 апр 2005, 12:14

За разъяснения спасибо, но у меня встречный вопрос:
почему не удается установить НОВОЕ соединение, если я выполняю удаление всех компонентов, а затем их создаю заново, + устанавливаю связи между ними. В итоге если связь с сервером есть то при динамическом пересоздании объектов, клиент прекрасно работает, но если ручками остановить сервис FB и снова выполнить пересоздание объектов + выполнить элементарный запрос к БД, то идет ошибка потери соединения. С чего бы ЭТО если со старым соединением связи уже нет?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 19 апр 2005, 13:03

потому что при потере соединения базовый IBX не в состоянии корректно обработать эту ситуацию. И поэтому на сайте есть соотв методы (две штуки) доработки IBX. А в FIBPlus долго и мучительно писали соответствующий код.
Но - обрыв соединения считается нештатной ситуацией. То есть, после него надо закрывать программу и открывать по новой. Потому что закрытие TIBDatabase и его переоткрытие - это фактически то же самое, что и перезапуск приложения.

Ответить