it-swarm-eu.dev

PostgreSQL: povolení odepřeno pro vztah

Jsem trochu zmatený z nastavení oprávnění v PostgreSQL.

Mám tyto role:

                             List of roles
 Role name |                   Attributes                   | Member of 
-----------+------------------------------------------------+-----------
 admin     | Superuser, Create role, Create DB, Replication | {}
 meltemi   | Create role, Create DB                         | {Rails}
 Rails     | Create DB, Cannot login                        | {}
 myapp     |                                                | {Rails}

a databáze:

                                    List of databases
        Name         | Owner  | Encoding |   Collate   |    Ctype    | Access privileges 
---------------------+--------+----------+-------------+-------------+-------------------
 myapp_production    | Rails  | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 ...

uživatel myapp nemá problém s dotazováním myapp_production databáze přidávání a mazání záznamů. Chtěl bych, aby meltemi také mohl dotazovat stejnou databázi. Vytvořil jsem tedy roli Rails, která vlastní databázi a udělala členy meltemi a myapp členy Rails. Ale pořád dostanu permission denied for relation chyby. Meltemi může zobrazit schéma, ale nemůže dotazovat DB.

Jen jsem si všiml (s \dt příkaz), že myapp je vlastníkem tabulek:

             List of relations
 Schema |       Name        | Type  | Owner 
--------+-------------------+-------+-------
 public | events            | table | myapp
 public | schema_migrations | table | myapp
 ...
 public | users             | table | myapp
 ...

Tabulky byly vytvořeny pomocí ORM (Rails 'ActiveRecord migrations).

Vím, že autorizace se v PostgreSQL velmi liší (na rozdíl od MySQL a dalších, které jsem použil). Jak mám nastavovat svou databázi, aby k ní měli přístup různí uživatelé. Někteří by měli být schopni CRUD, ale jiní mohou být schopni číst, atd ...

Díky za pomoc. Lituji, vím, že se jedná o velmi základní otázku, ale sám odpověď jsem nenašel.

14
Meltemi

Právě jsem o tom napsal v odpovědi na dělení práv na databázi postgresql jinému uživateli na ServerFault.

V zásadě je nejlepším řešením, když máte jednoho uživatele a chcete ostatním uživatelům udělit stejná práva, proměnit tohoto uživatele ve skupinu, vytvořit nového uživatele se stejným jménem jako původní uživatel, který je členem skupiny, a udělit tuto skupinu dalším uživatelům.

Takže ve vašem případě se Rails přejmenuje na myapp_users, Pak vytvoříte novou přihlašovací roli (user) s názvem Rails a GRANT myapp_users TO Rails. Nyní jste GRANT myapp_users TO meltemi. Nový účet Rails i uživatel meltemi mají nyní práva starého účtu Railsaccount.

Pro podrobnější ovládání vám obvykle doporučuji, abyste se vyhnuli tomu, abyste každodenním přihlašovacím uživatelům nebo jejich skupinám vlastnili tabulky. Umožněte jim přístup prostřednictvím skupiny NOINHERIT, kterou musí explicitně SET GROUP Použít, nebo lépe, použít zcela jiného uživatele pro privilegované operace jako DDL a GRANTs. Bohužel to nefunguje s Rails, protože Rails ráda aplikuje migrace, kdykoli se vám to líbí a AFAIK vám nedává možnost určit jiného, ​​více privilegovaného uživatele pro spuštění migrace jako.

4
Craig Ringer