Arrow
July 21, 2018, 11:25 p.m.

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

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

Do you like it? Share on social networks!

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

ALTER TABLE main_table DISABLE ROW LEVEL SECURITY

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





    Arrow
    • July 23, 2018, 2:50 p.m.
    • The answer was marked as a solution.
    Нашел такое решение:

    SELECT privilege_type
    FROM information_schema.role_table_grants
    WHERE grantee = 'user' AND table_name = 'main_table'
      Evgenii Legotckoi
      • July 23, 2018, 2:53 p.m.

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

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

        GRANT USAGE ON SEQUENCE main_table_id_seq TO user

          Comments

          Only authorized users can post comments.
          Please, Log in or Sign up
          • Last comments
          • Evgenii Legotckoi
            April 16, 2025, 5:08 p.m.
            Благодарю за отзыв. И вам желаю всяческих успехов!
          • IscanderChe
            April 12, 2025, 5:12 p.m.
            Добрый день. Спасибо Вам за этот проект и отдельно за ответы на форуме, которые мне очень помогли в некоммерческих пет-проектах. Профессиональным программистом я так и не стал, но узнал мно…
          • AK
            April 1, 2025, 11:41 a.m.
            Добрый день. В данный момент работаю над проектом, где необходимо выводить звук из программы в определенное аудиоустройство (колонки, наушники, виртуальный кабель и т.д). Пишу на Qt5.12.12 поско…
          • Evgenii Legotckoi
            March 9, 2025, 9:02 p.m.
            К сожалению, я этого подсказать не могу, поскольку у меня нет необходимости в обходе блокировок и т.д. Поэтому я и не задавался решением этой проблемы. Ну выглядит так, что вам действитель…
          • VP
            March 9, 2025, 4:14 p.m.
            Здравствуйте! Я устанавливал Qt6 из исходников а также Qt Creator по отдельности. Все компоненты, связанные с разработкой для Android, установлены. Кроме одного... Когда пытаюсь скомпилиров…