[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()
이 올바르게 호출되었으므로 변경하지 않아도 됨)