PostgreSQL : 관계에 대한 권한이 거부되었습니다


14

PostgreSQL에서 권한을 설정하는 것에 약간 혼란 스럽습니다.

나는 다음과 같은 역할을 수행합니다.

                             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}

그리고 데이터베이스 :

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

사용자 myappmyapp_production레코드를 추가 및 삭제 하는 데이터베이스를 쿼리하는 데 아무런 문제가 없습니다 . meltemi같은 데이터베이스를 쿼리 하고 싶습니다 . 그래서 나는 rails데이터베이스를 소유하고 역할 meltemimyapp구성원을 모두 만드는 역할 을 만들었습니다 rails. 그러나 여전히 permission denied for relation오류가 발생합니다. Meltemi스키마를 볼 수는 있지만 DB를 쿼리 할 수는 없습니다.

방금 테이블 소유자 인 ( \dt명령을 사용하여) 알았습니다 myapp.

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

테이블은 ORM (Rails의 ActiveRecord 마이그레이션)을 통해 작성되었습니다.

PostgreSQL에서 권한 부여가 매우 다르다는 것을 알고 있습니다 (MySQL 및 내가 사용한 다른 것과는 대조적 임). 다른 사용자가 액세스 할 수 있도록 데이터베이스를 어떻게 설정해야합니까? 일부는 CRUD 할 수 있어야하지만 다른 일부는 읽기 만 할 수 있습니다 ...

도움을 주셔서 감사합니다. 죄송합니다. 이것이 매우 기본적인 질문이지만 답을 직접 찾지 못했습니다.

답변:


4

방금 postgresql 데이터베이스에 대한 권한 을 ServerFault의 다른 사용자 에게 부여하는 것에 대한 답변에 썼습니다 .

기본적으로 단일 사용자가 있고 다른 사용자에게 동일한 권한을 부여하려는 경우 가장 좋은 솔루션은 해당 사용자를 그룹으로 전환하고 그룹의 구성원 인 원래 사용자와 동일한 이름으로 새 사용자를 작성하는 것입니다. 해당 그룹을 다른 사용자에게도 부여하십시오.

따라서 귀하의 경우 rails이름이으로 바뀌고 myapp_users이름이 rails및 인 새 로그인 역할 (사용자)을 만듭니다 GRANT myapp_users TO rails. 이제 GRANT myapp_users TO meltemi. 새 rails계정과 meltemi사용자 모두 이전 rails계정 의 권한을 갖습니다 .

보다 세밀한 제어를 위해서는 일상적인 로그인 사용자 또는 그룹의 테이블 소유권을 피하는 것이 좋습니다. DDL 및 s 와 같은 권한있는 작업에 대해 완전히 다른 사용자를 NOINHERIT명시 적 SET GROUP으로 사용하거나 더 나은 방법 으로 사용해야 하는 그룹을 통해 액세스 권한을 부여하십시오 GRANT. 유감스럽게도 Rails에서는 작동하지 않습니다. Rails는 필요할 때마다 마이그레이션을 적용하기를 원하고 AFAIK는 다른 권한을 가진 사용자를 지정하여 마이그레이션을 실행할 수있는 기능을 제공하지 않기 때문입니다.


좋아, 당신이 연결 한 게시물을 읽으십시오; 매우 도움이되었습니다! 자, 내가 올바르게 이해하고 있다면 위 myapp대신에 사용하려고 생각했을 것 rails입니까? myapp테이블을 소유하고 있기 때문에 (이를 지정하지 않았 으므로 마이그레이션이 있어야합니다). 어쨌든, 이름 myapp을 바꾼 myapp_group다음 myapprails 앱이 DB에 연결하는 데 사용할 새로운 사용자 를 만들면 다소 의미 가 있습니다. 역할 myapp의 기존 meltemi구성원과 기존 구성원을 모두 만듭니다 myapp_group. 그러나 다음 마이그레이션을 실행하면 어떻게됩니까? myapp다시 문제를 다시 만들어서 소유하지 않습니까?!?
Meltemi

1
PostgreSQL에는 roles버전 8.1부터 만 있음을 이해해야합니다 . 용어 user와는 group역사적인 이유와 호환성을 위해 주변에 보관됩니다. 기본적으로 "그룹"은 로그인 권한이없는 역할입니다. 다른 "사용자"인 경우에도 부여 myapp할 수 있습니다 . 여기서 매뉴얼을 읽으 십시오 . meltemimyapp
Erwin Brandstetter

나는 Postgres 의 rolesvs groupsvs users분리를 이해합니다 . 적어도 나는 생각 합니다. 위의 잘못된 용어를 사용하여 죄송합니다. 그러나 여전히 데이터베이스를 설정하는 방법을 이해하지 못하므로 로그인하지 않는 역할이 데이터베이스와 두 개의 로그인 역할 myappmeltemi소유 하고 모두 액세스 할 수 있습니다. 이러한 역할 중 하나는 필연적 으로 로그인 사용자가 소유 한 새 테이블을 작성 myapp하는 Rails 마이그레이션 을 실행 하는 것 myapp입니다. 그냥 meltemi'회원'을 만들어서해야합니까 myapp? 그러나 그것은 단지 kludgy처럼 보인다. .. 아니?!?
Meltemi

1
@Meltemi : 당신은 모든 권한을 부여 할 경우 myapp에 보유를 meltemi, 그 옳은 일이 될 것입니다. meltemi권한의 하위 집합 만 얻으 려면 그렇지 않습니다. 그런 다음 권한 세트를 보유 할 그룹 역할을 작성하고이를 부여하십시오 meltemi. SO에 관한관련 질문에 관심이있을 것입니다 . 나는 설명에 대답했다DEFAULT PRIVILEGES
Erwin Brandstetter

@Meltemi 예. 일반적인 Rails 마이그레이션으로 인해 그림이 복잡해집니다. Rails는 실제로 다른 사용자 계정을 지정하여 마이그레이션을 실행할 수 있도록해야합니다 . SET ROLE마이그레이션 시작과 RESET ROLE끝에 명령을 추가 할 수는 있지만 Rails가 모든 것을 깔끔하게 순서대로 실행한다고 신뢰하지는 않습니다. 어윈의 권리; 이 경우 가장 좋은 해결 방법은 GRANT첫 번째 사용자를 두 번째 그룹으로 사용하여 사용자 레일이 다른 사용자에게 소유권을 부여하는 것입니다.
Craig Ringer
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.