2013-05-01 3 views

답변

4

절은, 그에 대한 액세스 권한을 부여 곳에 적절한 함께 테이블에보기를 만듭니다

create view students_view as 
select col1, col2, col3 -- limit column access here 
from mytable 
where <whatever>; -- limit row access here 

-- limit what he can do here 
grant update, select to student_role; 

BTW 그것은 당신이보기를 업데이트 할 수 없습니다 일반적으로 열린 오해이며, 뷰가 조인 또는 유사하게 복잡한 쿼리 일 경우에만 해당됩니다.

+0

아주 최근의 Pg 버전까지는보기를 업데이트 할 수 있도록 명시 적 트리거 또는 규칙이 필요했기 때문에 사실이었다. –

+0

삽입은 어떻게됩니까? 필터 기준이 foo = "bar"라고 말하십시오. 사용자가 students_view (foo) 값 ("bar")에 삽입하면 어떻게됩니까? 또는 심지어 업데이트 students_view set foo = "bar"; 그들은 그것을 할 수있을 것인가? 어쨌든 이러한 유형의 행동을 제한 할 수 있습니까? –

+0

@chris 내 마음에, foo = bar *가있는 새로운/업데이트 된 행이 표시되어야합니다. 그게 좋지 않다면 필터를 더 좁게 만들거나 id를 사용하여 id의 특정 화이트리스트를 필터링하십시오 ... 여기서 id는 (1,3,5,8 등)' – Bohemian

4

PostgreSQL에는 행 수준의 선언적 보안이 없습니다 (아직 진행중인 작업이 있습니다). 따라서보기를 만들 수 없다면 -이 액세스가 필요한 사람들이 많이 있습니다 - 아마도 SECURITY DEFINER helper function 또는 트리거가 필요합니다.

  • 그들을 UPDATE, DELETE, TRUNCATEINSERT 권한을 취소 만 허용을 변경하고 SELECT에 테이블에 대한 액세스를 제한 할 수있는 SECURITY DEFINER 함수를 작성 :

    당신은 몇 가지 옵션이있어 ; 또는

  • 사용자가 원하지 않는 변경을 제한하려는 트리거를 작성하고 GRANT이 테이블에 대한 쓰기 권한을 작성하십시오. 기능에 대한 search_path을 설정, 동적 SQL (EXECUTE를) 피와 함께 - 두, 기능과 제한된 권리 접근 방식의

너무 오래 당신이 SECURITY DEFINER 보안 코딩 가이드 라인은 위의 설정에 따라 지금까지 가장 안전한 옵션으로 입니다 문자열 대체 등

current_user으로 필터링하는보기 인 경우 위의보기 접근 방식은 매우 잘 작동 할 수 있습니다. 새로운 SECURITY BARRIER 개의보기를보고 싶을 수도 있습니다. 이에 대한 유용한 토론은 this post을 참조하십시오.

관련 문제