Arrow
21 июля 2018 г. 23:25

Получение прав пользователей на таблицу базы данных

Qt, database

Добрый день!
Возник вопрос: Как можно получить права пользователя на таблицу базы данных в Qt?
База данных PostgreSQL.
У меня в базе на сервере пользователи:
1. Несколько с правами:  SELECT, UPDATE, DELETE, INSERT (просмотр, редактирование, создание и удаление записей) - для примера user
2. Несколько с правами: INSERT (только запись, без просмотра - организована отдельная форма в программе) - им просматривать данные запрещено в целях безопасности - для примера editor.
3. Несколько с правами: SELECT (только чтение) - для примера guest.
Права давал так:

GRANT SELECT, INSERT, UPDATE, DELETE ON main_table to "user"
GRANT SELECT ON main_table to "guest"
GRANT INSERT ON main_table to "editor"
В программе хочу сделать фильтрацию по правам пользователя и в зависимости от них показывать свое окно для каждого из пользователей.
У admin и guest окно с таблицей (отображение через QQsqlRelationTableModel и QTableView). У guest отключена возможность редактирования данных в ячейках таблицы и скрыти кнопки добавления, редактирования и удаления записей.
У editor - отдельное окно с QLineEdit, QComboBox и QToolButton - он видит только то что сейчас вносит.
Уже выполнил:
ALTER TABLE main_table DISABLE ROW LEVEL SECURITY
так что данные отображаются в программе корректно.

Как возможно такое реализовать средствами Qt или SQL?

2

Вам это нравится? Поделитесь в социальных сетях!

4
Evgenii Legotckoi
  • 23 июля 2018 г. 1:05
Добрый день!
Вы же задавали чистыми запросами права доступа к таблицам и полям, но в данном случае здесь вопрос не на сам Qt, а скорее на сырые SQL запросы.
Например,

ALTER TABLE main_table DISABLE ROW LEVEL SECURITY

Это уже и есть SQL Запрос, так что думаю, что Вам нужно внимательно ознакомиться с конкретным функционалом PostgreSQL, и выполнять через сырые запросы необходимые настройки в базе данных из вашего Qt приложения.
то есть, я бы попробовал использовать QSqlQuery и проверять на ошибки, ну и пройтись по документации PostgreSQL, чтобы понять как устанавливать и проверять права, в этом моменте я плаваю...





    Arrow
    • 23 июля 2018 г. 14:50
    • Ответ был помечен как решение.
    Нашел такое решение:

    SELECT privilege_type
    FROM information_schema.role_table_grants
    WHERE grantee = 'user' AND table_name = 'main_table'
      Evgenii Legotckoi
      • 23 июля 2018 г. 14:53

      Что-то такое мне попадалось с этими priviledge_type

        Arrow
        • 23 июля 2018 г. 14:56
        • (ред.)
        Да, только самый основной прикол в том что для возможности редактирования таблицы пользователю одних прав на таблицу мало, нужны еще и на последовательность:

        GRANT USAGE ON SEQUENCE main_table_id_seq TO user

          Комментарии

          Только авторизованные пользователи могут публиковать комментарии.
          Пожалуйста, авторизуйтесь или зарегистрируйтесь
          • Последние комментарии
          • IscanderChe
            12 апреля 2025 г. 17:12
            Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
          • AK
            1 апреля 2025 г. 11:41
            Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
          • Evgenii Legotckoi
            9 марта 2025 г. 21:02
            К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
          • VP
            9 марта 2025 г. 16:14
            Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…
          • ИМ
            22 ноября 2024 г. 21:51
            Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…