angularjs 是否推荐用于基于大规模身份验证的应用程序?

Is angularjs recommended for large scale authentication based applications?

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

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

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

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

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

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

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

angularjs 不推荐用于此类应用程序吗?我是否应该使用 angularjs 功能来补充我的应用程序(如控制器、变量绑定等),而忽略那些没有的功能(如路由)?

我是不是看错了?

是的,你确实看错了。您混淆了客户端和服务器端问题。

正如您自己所说,从安全角度来看,您提议的身份验证解决方案很糟糕。尽管 he/she 未通过身份验证,但将 HTML 交付给用户是个坏主意。

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

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

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

你没有看错,只是角度不同而已。您不习惯开发 SPA,所以这很正常。

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

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

3) 路由在 SPA 中的工作方式是它只发生在客户端上。没有必要在服务器上也有它。只需将所有请求的 url 重写到 return index.html,然后 angular 路由将处理其余部分。

关于推荐。确实没有这样的建议。由你决定。两者各有利弊。 Angular 的大部分缺点都与学习曲线有关。