如何使用CQS模式创建登录实现?

时间:2018-07-23 22:03:47

标签: authentication cqrs

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

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

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

也许还有其他我看不到的解决方案? 就我而言,我不能使用Azure或Amazon之类的第三方服务进行身份验证和授权。 哪种方法最合适,最安全并能防止暴力攻击?

1 个答案:

答案 0 :(得分:2)

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