永远不会有单独的登录路线

永远不会有单独的登录路线

在 Web 应用程序中,保护屏幕以进行身份​​验证时有两种选择:

  1. 如果用户未通过身份验证,则重定向到 /登入 路线:

2. 如果用户未通过身份验证,请在尝试页面的 URL 处显示登录表单,而不进行重定向,并且没有单独的路由:

前一种方法在早期的 Web 中使用,因为当时页面是不可变的,并且仅仅因为它有一个表单而不是其他内容,就有一个单独的页面 URL 感觉很自然。

要设置此类重定向,您需要在没有身份验证检查的情况下创建页面,并将该检查提取到在路由阶段调用的某种保护。他们确保仅在用户通过身份验证时才显示目标页面。

/sign-in 路由的问题

1.没有语义的页面

一个经验法则是,如果人们想要添加书签、重新访问和共享某个页面,那么就拥有一个带有 URL 的页面。谁愿意分享 /登入 网址?

2.需要重定向回来

用户通过身份验证后,必须将他们重定向到他们想要的页面。这意味着此类 URL 必须以以下形式传递到登录页面 ?back=/个人资料

这增加了许多错误或缺少返回 URL 的管理和特殊情况。

它在地址栏中看起来很乱。

3. 浏览器历史记录中的一个条目

如果用户点击了 /轮廓 链接,被重定向到 /登入?… 然后回到 /轮廓 ,这是浏览器历史记录中的三个条目。

如果他们点击“返回”,他们希望进入他们点击个人资料链接的页面。相反,他们回到 /登入?… 将它们再次重定向到 /轮廓 只是因为它们经过身份验证。

2000 年代初期的用户被训练双击“返回”按钮来逃避那些恶意的登录重定向,但这并不是我们希望人们养成的有用习惯。

4. 仍然是匿名查看路线的案例

在现代 Web 应用程序中,您在内存中的前端有一堆页面。您可能有以下堆栈:

/ /轮廓 /个人资料/编辑

现在想象用户在 /个人资料/编辑 通过超时。

您可以将它们重定向到 /登入 ,但你仍然有 /轮廓 在堆栈中。该页面处于非活动状态并且不会重建,但它仍然有一些状态,可能有延迟代码执行,并且会在前台页面弹出时显示。无论如何,必须设计小部件,以便可以随时任意频繁地进行重建。

您可以设置弹出所有需要身份验证的页面的警卫,但这会损害用户体验。如果他们再次登录,他们的页面堆栈将丢失。

因此,即使您设置了一些访问保护来提取一些身份验证检查,您也无法让您的页面完全摆脱这些检查。

设置就地登录表单

因此,您不应该有专用的登录 URL。相反,您会在任何需要身份验证的 URL 上显示登录表单。

您设置它的方式取决于您的框架。

对于后端应用程序,通常有某种服务器重定向不会导致实际的 HTTP 重定向,而只会在内部将请求路由到另一个处理程序。

对于 Flutter 应用程序,我通常会执行以下操作:

  1. 设置一个块或任何其他业务逻辑对象,作为应用程序中身份验证状态的真实来源。
  2. 做一些 AuthenticatedOrNotWidget 有两个构建器:一个用于经过身份验证的案例,一个用于未经过身份验证的案例。此小部件侦听身份验证块并在身份验证数据更改时重建。如果用户退出,则堆栈中每个屏幕的未经身份验证的构建器将接管。如果用户重新登录,将再次回调经过身份验证的构建器。作为奖励,如果用户配置文件中的某些内容发生了变化,这个小部件会自动重建。
  3. 如果屏幕由块或更改通知器支持,则让它们继承一些知道身份验证的超类,并且只有在身份验证正常时才调用它们的业务方法。此架构是特定于应用程序的。

这是我的一个项目中的小部件:

这是第一个之上的一个更方便的小部件,只有目标页面的构建器:

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明

本文链接:https://www.qanswer.top/38050/10222011

posted @ 2022-09-20 11:10  哈哈哈来了啊啊啊  阅读(5)  评论(0编辑  收藏  举报