2009-07-16 4 views
2

MVC의 어느 계층 (모델, 뷰, 컨트롤러)에서 허가 로직을 처리해야합니까?MVC에서 권한을 적용해야하는 계층은 무엇입니까?

조금 명확하게 설명해 드리겠습니다. 분명히 UI (보기 및 컨트롤러)는 구성 요소를 표시하거나 숨기고 권한이 거부 된 시나리오를 처리 할 수있는 권한에 액세스 할 수 있어야합니다. Model 레이어에 의해 사용 권한이 데이터베이스에 유지되어야한다는 것도 분명해 보입니다.

하지만 "복잡한"권한 규칙은 어떻게됩니까?
내가 개발하고있는 wiki/CMS 시스템에서 각 사용자는 페이지 당 권한 (보기, 편집, 이름 바꾸기 등)을 가지고 있습니다. 기존 페이지의 경우 이러한 사용 권한은 데이터베이스에서 검색됩니다. 새 페이지의 경우 사용자는 가능한 모든 권한을 가지고 있다고 가정합니다 (작성/편집 할 때).

또 다른 예는 페이지 목록입니다.
현재 사용자는 페이지 목록에서보기 권한이있는 페이지 만 볼 수 있습니다.

컨트롤러가이 논리를 처리해야합니까? 또는 컨트롤러가 GetPermissions() 메서드 (또는 GetPageList)를 호출 할 책임 만 있고 해당 모델을 채우는 모든 논리가 모델에서 처리되어야합니까?

답변

5

문제 도메인 엔티티에 대한 액세스 제어가 모델에 속합니다. (1) 도메인 엔티티에 대한 액세스 제어가 엔티티 자체와 밀접하게 연결되어 있고 (2) 두 컨트롤러가 동일한 객체에 대해 서로 다른 액세스 정책을 허용 할 수 없도록 보장 할 수있는 곳이기 때문에 적절한 장소입니다. 컨트롤러 계층에서, 예를 들어, -

  1. 인증
  2. 일부 도구 및 데모 쉽게 액세스 제어를 적용하는 데 사용할 수있는 컨트롤러 레벨에서 발생

    다음과 같은 요소

    는 약간의 혼동을 추가 this, this 또는 that.

여전히 모델에 속합니다.

1

모델에는 로그인 한 사용자의 허용/거부 된 사용 권한에 대한 정보가 있어야합니다. 그런 다음 컨트롤러는 모델에 따라 작업을 허용/차단해야합니다. 동시에보기는 사용자가 실행할 수있는 작업에 해당하는 링크 만 그려야합니다. 뷰는 모델을 묻는 특정 링크를 칠할 것인지 아닌지를 알 수 있습니다 (다시 한번).

방어 프로그래밍을 사용해야합니다. 컨트롤러에서 작업에 대한 액세스를 제어하지 않고 특정 사용자에 대한 링크를 페인팅하지 않으면 해당 사용자가 여전히 작업을 실행할 수 있습니다. 반면에, 컨트롤러에 대한 사용 권한 만 확인하는 경우 사용자를 괴롭 히게되는 충돌 링크를 페인팅합니다.

관련 문제