【发布时间】:2018-09-14 21:37:49
【问题描述】:
我有两个限界上下文(学生注册、课程)。 Studentenrollment 包含所有学生的课程 ID 和作业。 课程的管理部分包含与课程相关的所有信息。 当学生想要获取课程信息时,它会点击发送 jwt 令牌的端点 (/courses/ID)。在课程上下文中,我获取学生 ID、课程 ID 并创建它在公共汽车中调度的查询。在从课程 ID 获取课程信息之前的查询处理程序中,我想验证学生 ID 是否存在并且该学生是否拥有该课程。为此,我必须调用另一个上下文有界的学生注册。所以,我一直在寻找如何在互联网上处理它,我发现了这个: https://medium.com/@martinezdelariva/authentication-and-authorization-in-ddd-671f7a5596ac
class findByCourseIdAndStudentIdQueryHandler()
{
public function handle($findByCourseIdAndStudentIdQuery)
{
$courseId = $findByCourseIdAndStudentIdQuery->courseId();
$studentId = $findByCourseIdAndStudentIdQuery->studentId();
$student = $this->collaboratorService->studentFrom(
$courseId,
$studentId
);
$this->courseRepository->findByCourseId($courseId);
}
}
class collaboratorService()
{
public function studentFrom($courseId, $studentId)
{
$student = $this->studentEnrollmentClient->getStudentFrom($courseId, $studentId);
if (!$student) {
throw new InvalidStudentException();
}
return $student;
}
}
你怎么看?
更新
namespace App\Context\Course\Module\Course\UI\Controller;
class GetCourseController extends Controller
{
public function getAction($request) {
$this->ask(new FindByCourseIdQueryHandler($request->get('course_id'));
}
}
namespace App\Context\Course\Module\Course\Infrastracture\Query;
class AuthorizedQueryDispatcher extends QueryDispatcher
{
//In this case $query would be FindByCourseIdQueryHandler
public function handle($query)
{
$authUser = $this->oauthService->getAuthUser();
//it can be student or teacher
$role = $authUser->getRole();
$userId = $authUser->getUserId();
//it will return FindByCourseIdAndStudentIdAuthorizedQueryHandler
$authorizedQuery = $this->inflector->getAuthorizedQueryName->from($userId, $role, $query);
$this->dispatch($authorizedQuery);
$this->queryDispatch->dispatch($query);
}
}
namespace App\Context\Course\Module\Course\Application\Query;
class FindByCourseIdAndStudentIdAuthorizedQueryHandler
{
public function handle($findByCourseIdAndStudentIdQuery)
{
$student = $this->studentEnrollmentClient->getStudentFrom($findByCourseIdAndStudentIdQuery->courseId, $findByCourseIdAndStudentIdQuery->studentId);
if (!$student) {
throw new InvalidStudentException();
}
}
}
namespace App\Context\Course\Module\Course\Application\Query;
class findByCourseIdAndStudentIdQueryHandler()
{
public function handle($findByCourseIdQueryHandler)
{
$courseId = $findByCourseIdQueryHandler->courseId();
$this->courseRepository->findByCourseId($courseId);
}
}
【问题讨论】:
-
那么,您有一个授权建模问题,对吗?
-
不是,我正在使用 LexikJWTAuthenticationBundle 处理授权。在执行控制器之前,它有一些侦听器从标头中恢复令牌并从令牌创建 userAuth。然后在控制器中,我从 userAuth 获取学生 ID 并将其设置在查询中。我的问题是:如果使用 collaboratorService 来检索属于另一个有界上下文的学生是否很好。因为我理解的是 collaboratorService 是为了授权。但就我而言,我用它来检索学生。
-
授权不是认证,它们不一样。
-
我想看看你有什么样的问题,所以我可以给你一个正确的答案
-
我的问题是我需要知道那个学生是否有课程才能让他获得课程的信息。但是学生和课程之间的关系是在另一个有限的上下文中(学生注册)。所以我把逻辑放在 collaboratorService 里面。