CanActivate 在 Angular2 中如何工作?

How does CanActivate work in Angular2?

TL;DR CanActivate 是如何工作的?

长版 这是我第一次看到client-side 访问控制的实现。

在我目前使用的所有身份验证系统中(例如 PHP 或其他服务器端编程语言),总是有一个检查用户是否已经登录的函数,如果这样的函数 returns true 服务器可以传送页面,否则用户将被重定向到登录页面。

在这种情况下,客户端无法访问服务器代码,只能发出请求,等待服务器合成页面,然后呈现。

相反,Angular 的工作方式不同。它是一个使用JavaScript的client-side框架,它的代码是所有人都可以看到的。私有页面没有安全地放置在服务器内部,唯一的服务器任务是交付 SPA,但它不能接受进一步的请求。

尽管如此,该框架还是将功能实现为 CanActivate,并且运行良好。 所以我想知道是什么禁止我注入一些 JavaScript 代码并访问私人页面,即使我没有权利,或者更一般地说,这个系统是如何工作的。在 Internet 上我没有找到足够的信息,也没有足够的技能来理解源代码。你能帮我澄清一下我的想法吗?

我可以直接问标题中的问题,但我更愿意把我知道的都告诉你,所以如果有什么不对的地方可以指正。谢谢

CanActivate 不防范愚蠢的and/or不安全的编程

TL;DR 即使在 SPA 中,敏感数据也受到服务器的保护,并且只有在随请求一起传递正确的身份验证令牌时才会 returned。像 CanActivate 这样的包装器或装饰器,只是方便管理视图,没有真实数据的视图只是空壳!

长版

您的问题不是特定于 CanActivate,而是关于客户端身份验证 IMO 的概念。您假设如果任何敏感数据已被推送到 SPA,而这些数据不应未经适当的身份验证,那么您是正确的,那么无论有无客户端身份验证,都可以访问它。 然而,这不是客户端身份验证的重点。

CanActivate 装饰器或任何其他 JavaScript/Mobile 令牌身份验证系统的工作方式是,它向服务器发出身份验证请求,服务器 return 提供身份验证令牌。

现在 SPA 在其后续请求中预计会将身份验证令牌传递回服务器,并且在这些请求中,服务器发回 真实 数据,如果身份验证令牌有效。

SPA 现在获取此数据并将其编译成用户视图。因此,虽然 SPA 在概念上是浏览器中的应用程序,但它应该(并且在理智的情况下)依赖于来自服务器的敏感数据,这些数据受到身份验证保护。

对于来自更传统的基于会话的身份验证系统的人来说,这个概念应该没有太大的不同。在会话的情况下,身份验证 cookie 与后续请求一起发送,在 SAPs 的情况下,令牌被发回。在身份验证方面,这是唯一的区别。

至于数据 returned,对于 SPA,服务器通常只有 return data 而对于经典的服务器端应用程序,服务器编译 查看 + 数据 和 return 就可以了。

希望有道理并有所帮助!