2017-11-24 19 views
0

멀티 테넌트 시스템을 만들고 지금까지 모든 것을 저장하는 데 문제가 없습니다. 따라서이 서비스는 MVC 컨트롤러에서 호출 ASP.NET 코어의 멀티 테넌트 시스템에서 테넌트가 자원을 소유하고 있는지 확인

public interface EmployeeService : IEmployeeService 
{ 
    private IEmployeeRepository _employeeRepository; 

    public EmployeeService(IEmployeeRepository employeeRepository) 
    { 
     _employeeRepository= employeeRepository; 
    } 

    public Employee GetById(int employeeId) 
    { 
     return _employeeRepository.GetById(employeeId); 
    } 
} 

이 ID를 가진 직원을 검색 :하지만 이전, 나는 문제에, 나는이 서비스를 비틀 거렸다. 문제는 호출 중에 전달 된 employeeId가 호출하는 임차인이 소유하고 있는지 여부를 확인할 수 있어야합니다. 그렇지 않으면 ID를 입력하고 다른 사람을 검색 할 수 있습니다. 내가 생각할 수있는

가장 쉬운 해결책은 tenantId 포함하는 서명을 변화 :

public Employee GetById(int tenantId, int employeeId) 

을하지만 더 나은 방법이 있다면 나는 생각했다. GetById 메서드에는 매개 변수가 하나만 있어야한다고 생각합니다. 어쩌면 나는 그것을 overthinking 오전, 잘 모르겠습니다.

또 다른 방법은 EmployeeService가 인스턴스화 될 때 TenantId가 채워지고 GetById 호출이 사용중인 employeeId를 소유하고 있는지 확인하기 전에 TenantId라는 멤버가 있다고 생각할 수 있습니다. 그러나 ConfigureService의 Startup 중에 EmployeeService가 생성되고 누군가가 성공적으로 로그인하면 TenantId 만 알 수 있기 때문에이 작업을 수행 할 수 없습니다.

답변

0

DBContext 내에서 tenantId를 동적으로 필터링해야합니다. 여기에 유용한 게시물이 있습니다.

https://blogs.msdn.microsoft.com/mvpawardprogram/2016/02/09/row-level-security-in-entityframework-6-ef6/

당신은 ITenantEntity 같은 인터페이스를 만들 수 있습니다 그것은 TenantId이 다른 기업에 구현 할 수 있습니다. 당신의 DbContext 수준에서

public interface ITenantEntity 
{ 
    public int TenantId { get; set; } 
} 

, 당신은 ITenantFilter를 사용하여 임대를 가지고있는 기관을 결정하고 당신은 동적으로 필터링 할 수 있습니다.

또한 관리하기가 어려우므로 수동으로 TenantId 필터를 메서드에 전달하면 안됩니다. TenantId를 ClaimsPrincipal으로 저장할 수 있습니다. 사용자 인증 후 TenantId를 설정해야하며 모든 요청에 ​​대해 TenantId를 동적으로 요청할 수 있습니다. 그리고 우리는 프로젝트에서 멀티 테넌시를 관리하기 위해 동일한 방법을 사용하고 있습니다. 사실, 완벽한 솔루션입니다.