2016-06-24 3 views
0

[Authorize(Roles=...)]을 사용하여 전체 컨트롤러 작업 액세스를 제한 할 수 있습니다. 그러나 예를 들어 사용자가 자신의 부서에있는 다른 사용자의 데이터를 볼 수있게하려면 어떻게해야합니까? 만).내 데이터베이스의 하위 집합에 대한 제한된 액세스를 구현하는 방법

는 특히 내가 사용자에게 다른 사용자의 세부 사항을 줄 때입니다 무엇을 의미하는지의 URL은 다음과 같이 될 것입니다 : myapp.com/user/details/45

그리고 그들은 아주 쉽게 단지 그들이 원하는대로 될하기 위해 45을 편집 할 수 있습니다. 요청한 사용자가 자신의 회사에 속하지 않은 경우 액세스를 제한하고 싶습니다. (회사는 현재 세션 중이지만 변경할 수 있습니다.)

이 작업을 수행하는 데는 몇 가지 방법이 있지만 실제로 사용할 수 있습니다. 모든 사람의 취향이 경험에 근거한 것인지 궁금합니다. 다음은 몇 가지 옵션입니다.

1. 라우팅을 편집하여 액세스가 변경됩니다. myapp.com/Company/4/User/4' where 4 is a psudoID which references an actual ID internally. 2. myapp.com/OurCompany/User/4 '< 일반적으로 회사 대신 ourcompany 컨트롤러를 사용합니다. 3. 요청 된 사용자가 동일한 회사에 있는지 확인하여 내부적으로 확인하십시오 : myapp.com/User/42345. 내 문제는 각 종류의 요청 (사용자, 제품, 관련 회사)에 맞게 사용자 지정해야한다는 것입니다. 그러나 이것은 내가 지금보고있는 것입니다.

EntityFramework는 실제로 로그인 할 때 회사 항목을 가져 와서 세션에 저장하기 때문에 현재 사용자의 회사 회원을 참조 할 권한이 있습니다. SessionHandler.UserSession.CompanyTable.UserTable.Where(e=> e.UserID == id).FirstOrDefault();

이 EF 모르는 사람들에게 이상하게 보이지만, 기본적으로 서브 테이블 UserTable가의 외래 키가 참조하는 모든 사용자의 하위 집합입니다 :이 때문에 같은 회사의 회원에 쉽게 액세스 할 수 CompanyTable은 실제로 올바른 엔터티 집합을 반환합니다. 이 문제는이 방법으로 항목을 업데이트하면 SESSION의 항목을 실제로 업데이트하지만 DATABASE는 실제로 바자입니다. 로그인 한 사용자가 겉보기에 데이터베이스를 변경할 수는 있지만 실제로는 변경된 사항 일 뿐이므로 세션에 저장됩니다. (변경 사항을 확인한 데이터베이스 Whist를보고 로그 아웃하고 아무 것도 로그인하지 않았지만 db.SaveChanges()이 올바르게 호출되었으므로 변경하지 않아도 됨)

답변

1

먼저 모든 항목을 좋아하고 거룩한, 그 세션에서 퍼팅을 중지하십시오. 세션은 관계없이 사용하지 말아야하며 최악의 코드 냄새가 있습니다.

당신이 말하는 것은 객체 수준의 사용 권한입니다. 올바른 방법은 현재 로그인 한 사용자의 식별 요소를 사용하여 쿼리를 제한하는 것입니다. 엔티티는이 작업에 "소유권"개념을 필요로합니다. 즉, 특정 인스턴스를 "소유"하는 다른 엔터티에 대한 외래 키가 필요합니다. 여기에서 부서별로 제한하려는 경우 모든 사용자가 부서에서 소유해야 함을 의미합니다. 그런 다음,이 같은 상황에 대해 당신이 뭔가를 할 수 있습니다 user 여기에 현재 로그인 한 사용자의 인스턴스

db.Users.Where(m => m.DepartmentId == user.DepartmentId) 

. 이 방법으로 쿼리하면 사용자가 사용할 수있는 엔터티의 하위 집합이 사용자 자체에 의해 제한됩니다. 즉, 해당 집합 외부의 ID를 사용하여 URL에 액세스하려고하면 당연히 404가됩니다. 404 기반 인증은 권한 기반이더라도 403을 반환하면 무언가가 있음을 알 수 있기 때문에 사실상 가장 좋은 방법입니다. 그것을 액세스하지 마십시오. 해커의 경우, 이런 종류의 정보는 전투의 절반입니다. 404가 리턴되면 정보가 0이됩니다.존재하지 않거나 에 제공되지 않을 수 있습니다.

관련 문제