authentication - 如何使用 CQS 模式创建登录实现?
问题描述
在 CQS 模式中,查询只负责读取数据库而不修改状态。要在数据库中创建、更新或删除对象,我们使用命令。如果我想尝试登录用户,我需要将登录名和密码发送到服务器端。如果凭据可以作为响应,我希望得到一些 userDto 对象。在客户端输入正确的登录名但密码错误的情况下,我需要修改用户对象的状态并增加失败的登录尝试次数。
理论上,最好的选择是只向数据库发送一个请求,例如 GetUserDataQuery 但如果查询会修改用户实体的状态,则意味着我们违反了 CQS 分离规则。
我看到的另一个选项是先发送一个命令,例如 TryToLoginCommand,如果 HTTP 响应为 200,那么我可以发送一个 GetUserDataQuery。在这种情况下,我们发送 2 个请求而不是 1 个。但是这种方式是 100% 安全的吗?
也许还有其他一些我看不到的解决方案?不,就我而言,我不能使用 Azure 或 Amazon 等第三方服务进行身份验证和授权。哪种方式是正确的,最安全并可以防止暴力攻击?
解决方案
不必为响应用户输入而生成命令。您在服务器上提交用户名/密码以进行验证(我希望您不会将用户密码发送回前端进行验证)。该请求的控制器发出验证用户所需的查询。如果用户有效,则控制器创建并执行命令以更新必要的内容,然后向 UI 返回成功消息。如果登录失败,则再次执行命令来更新必要的内容,并返回失败的登录次数。它只是来自 UI 的一个请求,但在服务器端运行查询和命令。
推荐阅读
- ruby - 迭代器这部分的 Ruby 术语是什么?
- python-3.x - 我可以将 scipy.optimize 与 numpy.where 一起使用吗?
- ldap - 冗余负载平衡 LDAP 组的 Freeradius 问题
- c++ - 将 Eigen::MatrixXd(m,n) 与 1x1 矩阵相乘
- java - Appium - 无法访问 hideKeyboard() 方法
- nuxt.js - 为什么它显示请求失败,状态码为 401?
- excel - 负数和正数的绝对值
- ruby-on-rails - 如何在 Sequel 中获取验证错误键?
- spring-boot - Spring boot-Azure功能可以使用什么api文档工具?
- azure - 哪个 X.509 证书用于 NodeMCU SSL 连接?