PostgreSQL DB에서 일부 역할을 만들고 액세스 권한을 부여하려고합니다.postgresql 테이블에서 지정된 행을 업데이트하거나 선택하는 방법은 무엇입니까?
나는 학생 역할을 가지고 있고이 사용자 유형을 부여 할 : 만 편집 학생 테이블에서 한판 승부 그를/그녀를 기록하고 내가 그것을 할 수있는 방법을 다른 행
을 편집 할 수 있습니다?감사
PostgreSQL DB에서 일부 역할을 만들고 액세스 권한을 부여하려고합니다.postgresql 테이블에서 지정된 행을 업데이트하거나 선택하는 방법은 무엇입니까?
나는 학생 역할을 가지고 있고이 사용자 유형을 부여 할 : 만 편집 학생 테이블에서 한판 승부 그를/그녀를 기록하고 내가 그것을 할 수있는 방법을 다른 행
을 편집 할 수 있습니다?감사
절은, 그에 대한 액세스 권한을 부여 곳에 적절한 함께 테이블에보기를 만듭니다
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 그것은 당신이보기를 업데이트 할 수 없습니다 일반적으로 열린 오해이며, 뷰가 조인 또는 유사하게 복잡한 쿼리 일 경우에만 해당됩니다.
PostgreSQL에는 행 수준의 선언적 보안이 없습니다 (아직 진행중인 작업이 있습니다). 따라서보기를 만들 수 없다면 -이 액세스가 필요한 사람들이 많이 있습니다 - 아마도 SECURITY DEFINER
helper function 또는 트리거가 필요합니다.
UPDATE
, DELETE
, TRUNCATE
및 INSERT
권한을 취소 만 허용을 변경하고 SELECT
에 테이블에 대한 액세스를 제한 할 수있는 SECURITY DEFINER
함수를 작성 : 당신은 몇 가지 옵션이있어 ; 또는
GRANT
이 테이블에 대한 쓰기 권한을 작성하십시오. 기능에 대한 search_path
을 설정, 동적 SQL (EXECUTE
를) 피와 함께 - 두, 기능과 제한된 권리 접근 방식의너무 오래 당신이 SECURITY DEFINER
보안 코딩 가이드 라인은 위의 설정에 따라 지금까지 가장 안전한 옵션으로 입니다 문자열 대체 등
current_user
으로 필터링하는보기 인 경우 위의보기 접근 방식은 매우 잘 작동 할 수 있습니다. 새로운 SECURITY BARRIER
개의보기를보고 싶을 수도 있습니다. 이에 대한 유용한 토론은 this post을 참조하십시오.
아주 최근의 Pg 버전까지는보기를 업데이트 할 수 있도록 명시 적 트리거 또는 규칙이 필요했기 때문에 사실이었다. –
삽입은 어떻게됩니까? 필터 기준이 foo = "bar"라고 말하십시오. 사용자가 students_view (foo) 값 ("bar")에 삽입하면 어떻게됩니까? 또는 심지어 업데이트 students_view set foo = "bar"; 그들은 그것을 할 수있을 것인가? 어쨌든 이러한 유형의 행동을 제한 할 수 있습니까? –
@chris 내 마음에, foo = bar *가있는 새로운/업데이트 된 행이 표시되어야합니다. 그게 좋지 않다면 필터를 더 좁게 만들거나 id를 사용하여 id의 특정 화이트리스트를 필터링하십시오 ... 여기서 id는 (1,3,5,8 등)' – Bohemian