5

큰 나무가있는 곳에 복잡한 시스템이 있다고 가정 해보십시오. 간단한 생각은 직원/관리자 관계이며, 많은 직원은 한 관리자에게보고합니다. 이제 관리자 이외에 관리자를 대신하여 행동 할 수있는 지원 직원이 관리자의 직원을 조작 할 수 있습니다.보안과 같은 교차 절단 문제를 적용하는 CQRS

CQRS 시스템에서는 행동의 호출자가 지원 직원 인 "편집 직원"이라는 가상의 행동에 대한 메시지를 어떻게 모델링 할 것입니까? 이 작업은 관리자 보안 관계에 따라 직원이 해당 영역의 직원에게 행동하는 경우에만 성공할 수 있습니다.

보안의 확인은 수정중인 사람이 실제로 해당 관리자의 직원 체인 내에 있는지 확인하기 위해 데이터베이스에 쿼리하는 것과 관련됩니다.

이 쿼리는 어디에서 발생합니까? "직원 편집"메시지를 발송하기 전에?

메시지를 생성하기 전에 데이터의 유효성이 확인 된 경우 최종적으로 일관성있는 시스템에서 "직원 편집"메시지가 처리되기 전에 사용자가 "작업 완료"메시지를 완료하지 않은 별도의 작업이 발생했다고 가정합니다. 직원 편집 "작업. 명령 핸들러가 해당 메시지의 보안 문제를 확인하지 않으면 사용자가 더 이상 해당 권한을 실행하지 않아도 메시지는 계속 성공합니다.

이렇게하면 UI 유효성 검사 &과 비슷한 양면 유효성 검사가 서버 측 유효성 검사가 최상의 동작 과정임을 의미하는 것으로 보입니다. 그러나 검증을 완료하는 방법은 마치 CQRS의 주요 교리를 위반하는 것처럼 보입니다.

CQRS를 사용할 때 이러한 교차 절단 문제를 다룰 때 가장 좋은 접근 방법은 무엇입니까?

+1

IMO 일반 응답이 없습니다 ... 나는 항상 명령 처리기 쪽에서 * 적어도 * 및 ** 선택적으로 ** "앞쪽"(대기열에 메시지를 받아들이는 부분에있을 수 있음)) – Yahia

+0

또한 인증, 간단한 승인 (이 사용자는이 유형의 작업을 수행 할 수 있는지 여부)과 같은 비즈니스 크로스 컷 (business cross-cutting) 문제와 특정 항목에 대해 허용되는지 여부를 결정하는 비즈니스 규칙을 구별하는 것이 중요하다고 생각합니다. –

답변

3

전적으로이 도메인에 대해 CQRS를 건너 뛰고 웹 계층에서 DB 계층 (메시징 없음)과 직접 대화 할 수 있습니다. 간단한 낙관적 인 동시성은 발생할 수있는 몇 가지 충돌을 처리해야합니다.

+0

첫 번째 진술의 이유에 대한 생각 과정을 설명 할 수 있습니까? –

+1

그것은 아마도 작동 할 수있는 가장 간단한 해결책이기 때문에. –

+0

가장 확실한 것은 사실이지만, 가장 단순한 것이 항상 최선의 행동 과정이라면 CQRS 패턴이 전혀 존재하지 않을 것입니까? –

5

먼저 일반적인 대답이 없다는 @ Yahia의 의견에 동의합니다. 그 말로는, 내가 어떻게 접근 할 것인가.

우선, 이중 승인이 필요할 것입니다. 한 번 컨트롤러에서 요청을 받았을 때, 그리고 나중에 내 도메인에서 명령을 처리 할 때입니다. 어떤 사람들은 그 점에 동의하지 않을 수도 있지만 오히려 명령이 발행되는 것을 방지하고 사용자가 명령을 통과하는 대신 어떤 행동을 수행 할 수있는 권한이 없다는 것을 사용자에게 즉시 알려주고 오류에 대한 경고 통지를 위해 결과 일관성에 의존합니다 사용자가 작업을 수행 할 수 없다는 사실을 알고

그래서 의사 코드의 관점에서, 여기에 편집 직원에 대한 나의 접근 방식 :

컨트롤러 그래서 여기

[HttpPost] 
ActionResult Edit(Employee emp){ 

    //get employee org information from _employeeRepository 
    //validate if _loggedInUserID is able to edit emp.ID 

    if(isValid) { 
    //construct command 
    _commandService.EnqueueCommand(new EditEmployee(emp.ID, emp.Name, emp.Salary)); 
    } else { 
    return View("PermissionError"); 
    } 

    return Redirect("EmployeeProperties"); 
} 

내 명령 서비스가 명령과 적절한 AR에 경로를 집어 들고 내 도메인에서 Employee가 될 것입니다.

직원 도메인

protected void EditEmployee(userID, employeeID, employeeName, salary){ 
    //get employee org information from _employeeRepository 
    //validate if userID is able to edit employeeID 

    if(isValid) { 
    //apply event 
    ApplyEvent(new EmployeeEdited(userID, employeeID, employeeName, salary)); 
    } 
} 

그래서 모두 내 컨트롤러에 내 도메인에 동일한 보안 검사를 적용됩니다. 아마도 이것을 캡슐화 된 메소드 (아마도 저장소에 전달할 캡슐화 된 기준 클래스)로 사용했을 것입니다.

이렇게 나는이 시나리오에 어떻게 접근 할 것인지에 대해 도움이되기를 바랍니다.질문이있는 경우 알려 주시면 답변에 자세히 설명해 드리겠습니다.

이 정보가 도움이되기를 바랍니다. 행운을 빕니다!

+0

왜 두 수준 모두에서 적용하겠습니까? 도메인 계층은 모든 것이 통과해야하는 지점이 아니므로 보안 및 유효성 검사와 같은 문제가 처리되어야합니다. – Juri