是否建议将 angularjs 用于基于身份验证的大规模应用程序

Is angularjs recommended for large scale authentication based applications?

本文关键字:身份验证 大规模 应用程序 用于 angularjs 是否      更新时间:2023-09-26
我已经有

一段时间了,我正在学习和使用angularjs框架,尽管它的一些功能确实很棒,但在我看来,它的关键功能对于基于身份验证的应用程序来说有点问题。

让我们看一个例子。假设我有一个具有用户登录名的网站,一旦用户登录,他就可以单击指向他/她的仪表板页面的链接。在仪表板上,用户可以看到一些私人数据。现在,我习惯这样做的方式是在服务器端运行一些脚本,然后如果用户已连接,则返回一些 HTML,如果没有,则将用户重定向到另一个位置。angularjs 鼓励我这样做的方式是使用路由功能,像这样说:

when('/dashboard', {
    templateUrl: 'dashboard.html',
    controller: 'DashboardController'
  })

这样,如果用户没有连接,angularjs 将首先获取模板 HTML,然后控制器将获取一些数据并收到身份验证错误,然后将路由重定向到另一个位置。对我来说,这似乎是一个更糟糕的解决方案,原因不止一个:

1)首先,我的HTML暴露给所有人。虽然这不是毁灭性的,但它似乎是一种糟糕的安全实践(想象一下,你甚至没有Facebook帐户,但你仍然可以看到所有的Facebook页面HTML,更糟糕的是,所有对象和字段,例如user.accessToken)。

2)我会向服务器发出更多的请求,第一个用于获取模板,第二个用于身份验证验证和数据,第三个,可能第四个用于重定向。我假设angularjs缓存模板,所以实际的请求数量可能比我提到的要少,但是,在服务器端处理所有这些只是一个请求 - 并且像angularjs一样,它也不能加载整个页面,而只能加载所需的HTML抛出AJAX。我在这里的情况是有争议的,但仍然有一些事情似乎不对。

3)这对我来说可能是最重要的问题。我在服务器端所做的一切都必须粘贴到客户端。例如,路由功能必须在服务器端和客户端一样清晰 - 以防用户直接进入我的应用程序中的某个内部页面,或通过应用程序链接中的路由。这意味着每次在我的路由配置中更改某些内容时,我都必须在服务器端执行一次,在客户端执行一次 - 在我看来,这也是我的代码的不良做法和模块化。

不建议将 angularjs 用于此类应用程序吗?我是否应该使用 angularjs 功能来补充我的应用程序(如控制器、变量绑定等),但忽略和不忽略的功能(如路由)?

我看错了吗?

你没有以错误的方式看待它,只是从不同的角度。您不习惯开发SPA,所以这是正常的。

1)当然HTML会暴露给所有人,但这只是一个模板。它只包含html模板,而不是与每个人的Facebook个人资料相关的特定数据。服务器控制返回给用户的数据,并且仅返回用户有权查看的数据。实际上,这与非 SPA 没有什么不同,除了来回发送的数据量。

2)对于普通应用程序,您首先必须请求登录页面,然后将数据发布到服务器,然后进行重定向。这是 3 个请求。对于角度,它将是一个用于第一次加载,第二个用于登录视图模板,然后是第三个用于发布登录数据,然后是第四个用于获取主登录视图,第五个用于视图所需的数据。这还只是另外两个。登录之后,如果用户单击注销然后再次登录,则只有两个请求而不是三个请求,或者如果他们关闭选项卡并返回,它将是 3 个请求。换句话说,没有太大的区别。在大多数情况下,缓存后的请求数量相同,如果不是更少的话。

3) SPA 中的路由工作方式是它只发生在客户端上。没有必要在服务器上也拥有它。只需重写所有请求返回索引的 url.html然后角度路由将负责其余的工作。

关于推荐。真的没有这样的建议。这取决于你。两者都有优点和缺点。Angular的大部分缺点都与学习曲线有关。

是的,你确实以错误的方式看待它。您将客户端和服务器端问题混为一谈。

正如您自己已经说过的那样,您提出的身份验证解决方案从安全角度来看是不好的。将HTML交付给用户,尽管他/她没有经过身份验证是一个坏主意。

身份验证始终必须在服务器端完成。永远不要信任客户。这就是为什么当您有一个未经身份验证的用户请求您的限制访问dashboard.html时,您发回了一些 HTTP 错误(通常是 401 或 403,具体取决于用户是未经身份验证还是未授权)。这样,未经身份验证的用户将永远不会看到dashboard.html,并且您的问题 1 和 2 已解决。

你的第3点是另一回事,但也是无效的。客户端和服务器端没有理由具有相同的路由功能。在大多数情况下,路由应由客户端决定。例如,如果你的用户手动输入http:://mydomain.org/subsite,服务器会将他重定向到http:://mydomain.org,AngularJS使用适当的路由。

所以你的观点并不是关于AngularJS对于需要身份验证的应用程序来说是一个问题。事实上,有许多Web应用程序使用AngularJS进行身份验证。结论是:不,你可以像使用任何其他JavaScript技术一样使用AngularJS来验证站点。但是,是否"推荐"(针对您的项目)是另一回事,这取决于更多因素,超出了SO的范围。