首页 > 解决方案 > 如何使用 CQS 模式创建登录实现?

问题描述

在 CQS 模式中,查询只负责读取数据库而不修改状态。要在数据库中创建、更新或删除对象,我们使用命令。如果我想尝试登录用户,我需要将登录名和密码发送到服务器端。如果凭据可以作为响应,我希望得到一些 userDto 对象。在客户端输入正确的登录名但密码错误的情况下,我需要修改用户对象的状态并增加失败的登录尝试次数。

理论上,最好的选择是只向数据库发送一个请求,例如 GetUserDataQuery 但如果查询会修改用户实体的状态,则意味着我们违反了 CQS 分离规则。

我看到的另一个选项是先发送一个命令,例如 TryToLoginCommand,如果 HTTP 响应为 200,那么我可以发送一个 GetUserDataQuery。在这种情况下,我们发送 2 个请求而不是 1 个。但是这种方式是 100% 安全的吗?

也许还有其他一些我看不到的解决方案?不,就我而言,我不能使用 Azure 或 Amazon 等第三方服务进行身份验证和授权。哪种方式是正确的,最安全并可以防止暴力攻击?

标签: authenticationcqrs

解决方案


不必为响应用户输入而生成命令。您在服务器上提交用户名/密码以进行验证(我希望您不会将用户密码发送回前端进行验证)。该请求的控制器发出验证用户所需的查询。如果用户有效,则控制器创建并执行命令以更新必要的内容,然后向 UI 返回成功消息。如果登录失败,则再次执行命令来更新必要的内容,并返回失败的登录次数。它只是来自 UI 的一个请求,但在服务器端运行查询和命令。


推荐阅读