Vấn đề với quyền cho người dùng


7

Xin chào, tôi đang cố gắng tạo vai trò đăng nhập (người dùng) với khả năng sửa đổi cơ sở dữ liệu khá tối thiểu. Họ sẽ có thể chọn, xóa, tạo các kích hoạt, chèn và cập nhật. Sau đó, tôi muốn có nhiều tài khoản là thành viên của người dùng để họ có cùng quyền nhưng tôi có thể đăng nhập các chỉnh sửa cho từng người dùng.

Tôi đang sử dụng pgadmin cho thiết kế cơ sở dữ liệu của mình và chương trình của tôi truy cập điều này với QtQuery.

Thông báo lỗi tôi nhận được bị Qt bắt gặp khi cố gắng chọn một số dữ liệu làm bài kiểm tra. Khi tôi chạy mã giống như chủ sở hữu cơ sở dữ liệu và siêu người dùng, tôi không gặp vấn đề gì.

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;");

LRI: quyền bị từ chối cho các liên hệ quan hệ QPSQL: Không thể tạo truy vấn

Cho đến nay tôi đã tạo ra vai trò (người dùng).

-- 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';

Như điều này đã cho các vấn đề trước đó. Tôi đã thử thêm quyền cho công khai cho cơ sở dữ liệu nhưng điều này cũng không hoạt động.

Bây giờ tôi không biết tìm giải pháp ở đâu. Bất kỳ sự giúp đỡ nào cũng được đánh giá cao. Cảm ơn.


Thêm quyền cho publiccơ sở dữ liệu là không cần thiết (như publicconnect, temporarytheo mặc định) và sẽ không dẫn đến một khoản trợ cấp đệ quy để schemas hoặc bảng trong những schemas. Xem postgresql.org/docs/current/static/sql-grant.htmlpostgresql.org/docs/current/static/...
Craig Ringer

Câu trả lời:


9

GRANTing ALLquyền cho công chúng vào cơ sở dữ liệu chủ yếu là dư thừa (như công có kết nối, tạm thời theo mặc định, vì vậy bạn sẽ chỉ được bổ sung CREATEmà có thể bạn không muốn làm). Bạn có thể mong đợi một GRANT ALLcơ sở dữ liệu sẽ dẫn đến một GRANT ALLlược đồ và bảng chứa đệ quy . GRANTkhông được đệ quy , vì vậy điều này không xảy ra; a GRANT ALLtrên cơ sở dữ liệu chỉ cấp CONNECTTEMPORARYquyền cho cơ sở dữ liệu, không ảnh hưởng đến các lược đồ và bảng chứa.

Các mặc định GRANTlà, từ các tài liệu trên GRANT :

PostgreSQL cấp các đặc quyền mặc định cho một số loại đối tượng cho PUBLIC. Không có đặc quyền nào được cấp cho PUBLIC theo mặc định trên các bảng, cột, lược đồ hoặc không gian bảng. Đối với các loại khác, các đặc quyền mặc định được cấp cho PUBLIC như sau: CONNECT và CREATE TEMP TABLE cho cơ sở dữ liệu; EXECUTE đặc quyền cho các chức năng; và đặc quyền SỬ DỤNG cho các ngôn ngữ. Tất nhiên, chủ sở hữu đối tượng có thể REVOKE cả các đặc quyền mặc định và được cấp rõ ràng. .

Vì vậy, bạn có thể thấy bạn không cần GRANTbất cứ thứ gì trên cơ sở dữ liệu trừ khi bạn muốn người dùng có thể tạo các lược đồ, v.v. Bạn cần phải:

  • GRANT USAGE ON SCHEMA myschema TO theuser;cho bất kỳ lược đồ nào khác public. CREATEcó thể được cấp nếu bạn muốn người dùng có thể tạo bảng, dạng xem, v.v.
  • GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE sometable TO theuser;cho các bảng. Tôi đã bỏ qua TRUNATE, REFERENCESTRIGGERquyền như bạn có lẽ không muốn cấp cho họ.
  • GRANT USAGE ON SEQUENCE sometable_somecolumn_seq TO theuser;cho bất kỳ chuỗi nào được sử dụng trong mặc định của bảng, rõ ràng hoặc thông qua một SERIALhoặc BIGSERIALcột.

... vv Xem hướng dẫn sử dụng để GRANTliên kết ở trên để biết định nghĩa đầy đủ về những gì đặc quyền làm, có sẵn trên đối tượng nào, v.v. Hãy lưu ý đến ký tự đại diện ALL TABLESALL SEQUENCEScác tùy chọn.

Nếu điều này có vẻ như quá nhiều rắc rối để làm cho mỗi bảng, khung nhìn, lược đồ, trình tự, v.v., bạn có thể sử dụng PG 9.1 trở lên ALTER DEFAULT PRIVILEGESđể thay đổi GRANTs mặc định trên các đối tượng mới.


6

Có vẻ như bạn cần một cái gì đó như thế này:

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

Nhân tiện, tôi hy vọng "user"không phải là tên người dùng thực tế bạn đã chọn. Nó không chỉ không truyền tải nhiều về ngữ nghĩa của vai trò, mà bạn sẽ cần trích dẫn nó ở khắp mọi nơi, điều này có thể gây phiền toái và dẫn đến nhầm lẫn khi có vấn đề. Nếu bạn chọn một tên cho vai trò không phải là một từ khóa và cho biết vai trò đó là gì, có lẽ bạn sẽ hạnh phúc hơn với kết quả.

Tôi không chắc chắn rằng việc đưa lớp QtQuery vào câu hỏi sẽ giúp mọi người hiểu được vấn đề. Nếu bạn có thể hiển thị vấn đề trong một phiên, psqlbạn có thể thu hút nhiều câu trả lời hơn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.