PostgreSQL: ilişki için izin verilmedi


14

PostgreSQL'de izinleri ayarlama konusunda biraz kafam karıştı.

Bu rollere sahibim:

                             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}

ve veritabanları:

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

kullanıcı kayıt ekleme ve silme veritabanını myappsorgulamakta sorun yok myapp_production. meltemiAynı veritabanını da sorgulayabilmek istiyorum . Yani, bir rol yarattı railsveritabanı sahibi ve hem yapılmış meltemive myappüyelerini rails. Ama yine de permission denied for relationhata alıyorum . Meltemişemayı görüntüleyebilir ancak DB'yi sorgulayamaz.

Ben sadece ( \dtkomut ile) myapptabloların sahibi olduğunu fark ettim :

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

Tablolar bir ORM (Rails ActiveRecord geçişleri) ile oluşturulmuştur.

PostgreSQL'de yetkilendirmenin çok farklı olduğunu biliyorum (MySQL ve kullandığım diğerlerinin aksine). Veritabanımı farklı kullanıcıların erişebilmesi için nasıl ayarlamalıyım? Bazıları CRUD yapabilmeli, bazıları ise sadece Okuyabilir vs.

Herhangi bir yardım için teşekkürler. Üzgünüm, bunun çok basit bir soru olduğunu biliyorum ama cevabı kendim bulamadım.

Yanıtlar:


4

Ben sadece ServerFault üzerinde başka bir kullanıcıya postgresql veritabanı hakları verme cevabımda yazdı .

Temel olarak, tek bir kullanıcınız olduğunda ve diğer kullanıcılara aynı hakları vermek istediğinizde en iyi çözüm, bu kullanıcıyı bir gruba dönüştürmek, grubun üyesi olan orijinal adla aynı ada sahip yeni bir kullanıcı oluşturmak ve bu grubu diğer kullanıcılara da verin.

Yani sizin durumunuzda, railssöylenecek şekilde yeniden adlandırılır myapp_users, sonra railsve adlı yeni bir giriş rolü (kullanıcı) oluşturursunuz GRANT myapp_users TO rails. Şimdi sen GRANT myapp_users TO meltemi. Hem yeni railshesap hem de meltemikullanıcı artık eski railshesabın haklarına sahiptir .

Daha hassas bir kontrol için günlük giriş kullanıcılarına veya gruplarına tabloların sahipliğini vermekten kaçınmanızı tavsiye ederim. DDL ve s gibi ayrıcalıklı işlemler için tamamen farklı bir kullanıcı kullanmaları veya daha iyi kullanmaları NOINHERITgereken bir grup aracılığıyla onlara erişim izni verin . Ne yazık ki bu Rails ile çalışmaz, çünkü Rails geçişleri istediğiniz gibi uygulamayı sever ve AFAIK size geçişleri çalıştırmak için farklı, daha ayrıcalıklı bir kullanıcı belirleme olanağı vermez.SET GROUPGRANT


Tamam, bağlandığınız yayını okuyun; çok yararlı! Şimdi, bir şeyleri doğru anlarsam, sanırım yukarıdakini kullanmak myappyerine kullanmak isteyebilirsiniz rails? Çünkü myapptablolar sahibi (ben belirtti asla, göç olması gerekir). Ben adını Neyse, bu mantıklı sorta olur myappüzere myapp_groupve daha sonra yeni bir kullanıcı yapılmış myappDB bağlanmak için kullanacağı app raylar. Make myappve mevcut meltemiait, iki üye myapp_grouprolü. Ama bir sonraki geçişi çalıştırdığımda ne olacak. o mülkiyetinde olmayacak myappyeniden oluşturma baştan sorunu?!?
Meltemi

1
PostgreSQL'in sadece roles(sürüm 8.1'den beri) olduğunu anlamalısınız . Şartlar userve grouptarihi nedenler ve uyumluluk nedeniyle saklanır. Temel olarak bir "grup", oturum açma ayrıcalığı olmayan bir roldür. Sen verebilir myappiçin meltemibile myappsadece başka "kullanıcı" dir. Buradaki kılavuzu okuyarak başlayın .
Erwin Brandstetter

Postgres rolesvs groupsvs usersayrımı anlıyorum , en azından ben düşünüyorum . Yukarıdaki yanlış (ve kafa karıştırıcı) terminolojiyi kullandığım için üzgünüm. Ancak yine de veritabanımı nasıl ayarlayacağımı anlamıyorum, böylece girişsiz bir rol veritabanı ve iki giriş rolü OWNS myappve meltemiher ikisi de tam erişime sahip olabilir. Bu rollerden biri , kaçınılmaz olarak? Bir kez daha bir giriş kullanıcısının sahip olduğu yeni tablolar oluşturacak olan Rails geçişlerinimyapp çalıştırıyor olacak . Sadece 'üye' yapmalı mıyım? Ama bu kludgy gibi görünüyor ... hayır?!? myappmeltemimyapp
Meltemi

1
@Meltemi: Eğer tüm ayrıcalıklara myappsahip meltemiolmak istiyorsanız, o zaman doğru olan bu olacaktır. meltemiSadece bir ayrıcalık alt kümesi almak istiyorsanız , olmazdı. Ardından, ayrıcalık kümesini tutmak için bir grup rolü oluşturun ve bunu verin meltemi. Muhtemelen SO ile ilgili bu soru ile ilgileneceksiniz . Açıklamayı cevapladımDEFAULT PRIVILEGES
Erwin Brandstetter

@Meltemi Evet, her zamanki gibi Rails geçişleri resmi karmaşıklaştırır. Rails, taşıma işlemlerini farklı bir kullanıcı hesabı olarak belirlemenize izin vermelidir . Muhtemelen SET ROLEtaşıma işlemlerinizin başlangıcına ve RESET ROLEsonuna bir komut ekleyebilirsiniz , ancak Rayları her şeyi düzgün bir şekilde çalıştırmak için güvenmem. Erwin haklı; bu durumda GRANTkullanıcı rayları için en iyi çözüm , 1. kullanıcıyı ikinci grup olarak kullanarak diğer kullanıcıya sahiplik verir.
Craig Ringer
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.