Problem mit Berechtigungen für Benutzer

7

Hallo, ich versuche, eine Anmelderolle (Benutzer) mit einer relativ geringen Fähigkeit zum Ändern der Datenbank zu erstellen. Sie sollten in der Lage sein, Trigger auszuwählen, zu löschen, zu erstellen, einzufügen und zu aktualisieren. Ich möchte dann mehrere Konten haben, die Mitglieder des Benutzers sind, damit sie die gleichen Berechtigungen haben, aber ich kann Änderungen für einzelne Benutzer protokollieren.

Ich verwende pgadmin für mein Datenbankdesign und mein Programm greift mit QtSQL darauf zu.

Die Fehlermeldung, die ich erhalte, wird von Qt abgefangen, wenn versucht wird, einige Daten als Test auszuwählen. Wenn ich denselben Code wie der Datenbankbesitzer und der Superuser ausführe, habe ich keine Probleme.

bool run_query(const QString & q){
    QSqlDatabase db = QSqlDatabase::database("default");
    QSqlQuery query(db);

    query.exec(q);

    if (!query.isActive()){
        QMessageBox::warning(0, QObject::tr("Database Error"),
                             query.lastError().text());
        return false;
    }

    while (query.next()){
        QString title = query.value(0).toString();
        std::cerr << qPrintable(title) << std::endl;
    }
    return true;
}

run_query("Select forename from contacts;");

FEHLER: Berechtigung für Beziehungskontakte verweigert QPSQL: Abfrage kann nicht erstellt werden

Bisher habe ich die Rolle (Benutzer) erstellt.

-- Role: user

-- DROP ROLE "user";

CREATE ROLE "user" LOGIN
  ENCRYPTED PASSWORD 'md54d45974e13472b5a0be3533de4666414'
  NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION;
COMMENT ON ROLE "user" IS 'Low level user';

Da dies die vorherigen Probleme gab. Ich habe versucht, öffentliche Berechtigungen für die Datenbank hinzuzufügen, aber dies hat auch nicht funktioniert.

Jetzt habe ich keine Ahnung, wo ich nach einer Lösung suchen soll. Jede Hilfe wird sehr geschätzt. Vielen Dank.

wookie1
quelle
Hinzufügen von Berechtigungen für publicauf die Datenbank redundant (wie publichat connect, temporarystandardmäßig) und wird nicht zu einem rekursiven Zuschuss Schemata oder Tabellen in diesen Schemata. Siehe postgresql.org/docs/current/static/sql-grant.html und postgresql.org/docs/current/static/…
Craig Ringer

Antworten:

9

GRANTDie ALLBerechtigung der Öffentlichkeit für die Datenbank ist größtenteils redundant (da die Öffentlichkeit eine Verbindung hat, die standardmäßig temporär ist, würden Sie nur das hinzufügen, CREATEwas Sie wahrscheinlich nicht möchten). Sie haben wahrscheinlich erwartet GRANT ALL, dass ein Eintrag GRANT ALLin der Datenbank zu einer Rekursion in enthaltene Schemas und Tabellen führt. GRANTist nicht rekursiv , also passiert dies nicht; a GRANT ALLin einer Datenbank gewährt der Datenbank nur Rechte CONNECTund TEMPORARYRechte, ohne Auswirkungen auf enthaltene Schemas und Tabellen.

Die Standardeinstellungen GRANTsind aus den Dokumenten zu GRANT :

PostgreSQL gewährt PUBLIC Standardberechtigungen für einige Objekttypen. PUBLIC werden standardmäßig keine Berechtigungen für Tabellen, Spalten, Schemas oder Tabellenbereiche gewährt. Für andere Typen lauten die für PUBLIC gewährten Standardberechtigungen wie folgt: CONNECT und CREATE TEMP TABLE für Datenbanken; EXECUTE-Berechtigung für Funktionen; und USAGE Privileg für Sprachen. Der Objektbesitzer kann natürlich sowohl Standard- als auch ausdrücklich gewährte Berechtigungen widerrufen. (Um maximale Sicherheit zu gewährleisten, geben Sie REVOKE in derselben Transaktion aus, in der das Objekt erstellt wurde. Dann gibt es kein Fenster, in dem ein anderer Benutzer das Objekt verwenden kann.) Außerdem können diese anfänglichen Standardberechtigungseinstellungen mit dem Befehl ALTER DEFAULT PRIVILEGES geändert werden.

Sie können also sehen, dass Sie GRANTnichts in der Datenbank benötigen, es sei denn, Sie möchten, dass der Benutzer Schemas usw. erstellen kann. Sie müssen:

  • GRANT USAGE ON SCHEMA myschema TO theuser;für jedes andere Schema als public. CREATEkann gewährt werden, wenn der Benutzer Tabellen, Ansichten usw. erstellen kann.
  • GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE sometable TO theuser;für Tabellen. Ich habe das und die Rechte weggelassen TRUNATE, da Sie sie wahrscheinlich nicht gewähren möchten.REFERENCESTRIGGER
  • GRANT USAGE ON SEQUENCE sometable_somecolumn_seq TO theuser;für alle Sequenzen, die in Tabellenstandards verwendet werden, entweder explizit oder über eine SERIALoder- BIGSERIALSpalte.

... usw. Im GRANToben verlinkten Handbuch finden Sie vollständige Definitionen der Berechtigungen, die für welche Objekte verfügbar sind usw. Beachten Sie den Platzhalter ALL TABLESund die ALL SEQUENCESOptionen.

Wenn dies für jede Tabelle, Ansicht, jedes Schema, jede Sequenz usw. zu aufwändig erscheint, können Sie in Seite 9.1 und höher ALTER DEFAULT PRIVILEGESdie Standardeinstellungen GRANTfür neue Objekte ändern .

Craig Ringer
quelle
6

Es sieht so aus, als ob Sie so etwas brauchen:

GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE contacts TO "user";

Ich hoffe übrigens, dass "user"es sich nicht um einen tatsächlichen Benutzernamen handelt, den Sie gewählt haben. Es vermittelt nicht nur nicht viel über die Semantik der Rolle, sondern Sie müssen sie auch überall zitieren, was etwas störend sein und bei Problemen zu Verwirrung führen kann. Wenn Sie einen Namen für die Rolle auswählen, der kein Schlüsselwort ist und angibt, wofür die Rolle bestimmt ist, sind Sie wahrscheinlich mit den Ergebnissen zufriedener.

Ich bin mir nicht sicher, ob das Einbeziehen der QtSQL-Schicht in die Frage jemandem hilft, das Problem zu verstehen. Wenn Sie das Problem in einer Sitzung in psqlanzeigen können, erhalten Sie möglicherweise mehr Antworten.

kgrittn
quelle