2012-11-27 3 views
0

이 시나리오를 처리하는 더 좋은 방법이 있는지 궁금합니다. 조회수를 간단히 유지하면서도 조회수를 줄이기 위해 노력하고 있습니다.사용자에게 권한이있는 경우에만 결과를 반환합니다.

나는 Books의 목록이 있습니다. 이 책에 할당 된 사용자 만 도서 및 기타 콘텐츠를 볼 수 있습니다. 기본적으로 API 호출입니다. /Books/, /Books/Chapters/, /Books/Chapters/Pages/ 등입니다. 사용 권한은 데이터베이스의 Books 항목에 첨부됩니다.

Books '챕터 , 페이지'등은 모두 다른 테이블에 있습니다. 사용자 권한은 다른 테이블에 저장됩니다. 테이블은 이런 식입니다.

UserID, BookID 
    -------------- 
    101  1 
    102  1 
    102  2 
    ... 

사용자 정보는 API 호출 자체 (기본 인증)에서 가져옵니다. 요청한 Book이 있지만 해당 사용자에게 Book에 대한 권한이없는 경우 API는 401 Unauthorized을 반환해야합니다. 요청한 '도서 does not exist, then it should return 404 찾을 수 없음'.

일반적으로 해당 사용자와 요청한 Book에 대한 권한을 쿼리로 확인해야합니다. 해당 사용자에 대한 사용자 권한 테이블에 레코드가있는 경우 다른 쿼리를 실행하여 Book, 'Chapter` 등을 가져 오십시오.

현재이 두 쿼리를'WHERE EXISTS condition that checks for the existence of the record for this user for the requested Book 권한 테이블에서. 따라서 레코드는 사용자 권한 테이블에 레코드가있는 경우에만 리턴됩니다.

Book이 없거나 사용자에게 권한이없는 경우이 사실을 알 수 없습니다. 사용자 권한을 별도로 확인하기 위해 데이터베이스 호출을 하나 줄일 수 있습니다. 그리고 이것으로 저는 401404을 구분할 수 없습니다.

단일 쿼리로 401404을 구별 할 수있는 반면이 작업을 수행하는 더 좋은 방법이 있습니까? 두 가지 데이터베이스 호출을 수행하는 것이 더 좋습니다.

의견이 있으십니까?

답변

1

다음과 같은 하위 쿼리를 포함 시키십시오.

SELECT 
    (SELECT 
     1 
    FROM 
     permissions 
    WHERE 
     permissions.user_id=<user ID> AND permissions.book_id=<book ID>) 
    ) AS Permission, 
    * 
FROM 
    books 
WHERE 
    books.id=<book ID> 

"Permission"이라는 새 열이 있습니다.이 열은 사용자에게 권한이있는 경우 1, 사용자에게 권한이없는 경우 NULL입니다.

EDIT : "1"또는 "NULL"중 하나를 반환하여 하위 쿼리를 단순화했습니다.

+0

그러면 사용자 권한과 함께 쿼리 결과가 반환됩니까? 사용자가 권한이없는 경우에도 결과를 반환합니다 (존재하는 경우). 하지만 1 대신 null 만 반환합니까? –

+1

@ 케빈 : 맞습니다. 책에 대한 결과 (있는 경우)는 항상 리턴됩니다. 사용자 액세스의 결정은 새 사용 권한 열의 값 (1 또는 NULL)을 기반으로합니다. –

0

데이터베이스의 다양한 엔티티에 권한을 할당 할 수있는 방법으로 응용 프로그램 ACL (액세스 제어 목록)이 있어야합니다. 살펴 보시길 this question

관련 문제