为什么要将登录页面与单个页面应用程序分开?


28

我想知道为什么将SPA的登录页面作为单独的页面而不是SPA的页面(如在加载和通过ajax请求发送数据中)的页面似乎很流行?

我唯一能想到的就是安全性,但是我无法想到特定的安全性原因。我的意思是,唯一想到的是,如果您的登录页面是SPA的一部分,它将通过ajax发送用户名/密码,而Firebug或网络检查器之类的工具也可以看到该用户名/密码,即使您以普通方式发送该用户名/密码POST请求,还有其他可以轻松捕获此数据的工具(例如fiddler,httpscoop等)。

我有什么想念的吗?


2
在这种情况下,我认为没有理由或需要理由。我会争辩,为什么不呢?
史蒂文·埃弗斯

1
我反对这样做的理由是,将登录页面作为单独的html页面,而应用程序的其余部分是SPA架构,这似乎很奇怪,没有任何实际好处(尽管msanford提出的观点确实值得)。
ryanzec 2012年

@ryanzec谢谢。我添加了一个示例,以试图说明确实有好处。首先,在其他地方推迟资产加载所带来的节省是微不足道的,尤其是在登录失败(或帐户被暂停等)的情况下。其次,它的实现要比更复杂的基于异步依赖项的模块系统快得多,并且开发生命周期是一个重要的考虑因素(请参阅Opbeat的办公室口头禅*(包含庸俗性))。
桑福德,2012年

“即使将其作为普通的POST请求发送,也有其他工具可以轻松捕获此数据”。确定您的登录表单受HTTPS保护吗?
ajlane 2012年

@ajlane是的,我的登录名(实际上是整个应用程序)将在HTTPS后面运行
ryanzec 2012年

Answers:


18

大概是为了节省大量仅应用程序所需的客户端资产(例如沉重的JavaScript框架,图像)的加载。

有多种实现类似性能目标的复杂方法(请参阅“ Malte Ubl和John Hjelmstad:一种新颖,高效的JavaScript加载方法-JSConf EU 2012 ”),但这实现起来非常快,而且可以说同样高效,尤其是当您的网络应用仍然会使用几乎所有资产。

您可以在http://infogr.am beta 这样的网站中随意查看:

  1. http://infogr.am/login/加载 jquery raphael,自定义js和3个CSS文件。
  2. http://infogr.am/beta/(应用程序的主要SPI页面)可加载10个javascript框架,5个外部css文件和大约60张图像。

更新:在2016年使用angular2前端和JBoss后端,出于同样的原因,我们仍然这样做。
桑福德,2016年

18

我认为有一些合理的理由支持或反对,我想说技术在决定中也起着作用。

有人可能会说拥有单独的登录“页面”可以使用“目录安全性”。通常,任何人都可以看到登录“页面”,但是只有经过身份验证的用户才能查看应用程序“页面”及其“目录”。路由也可以被锁定,其中/ Account /与/ App /不同,并且每个都有自己的安全“配置文件”。

另外,如果您使用的是SPA方法,并且将身份验证与应用程序体验混合在一起,则逻辑可能会令人费解。不必假设用户“因为他们在这里而已登录”,而是必须不断检查其身份验证状态并询问“此用户应在这里”。

另外,登录页面通常位于面向消费者的网站上。您访问www.yourapp.com,其中包含有关信息,联系方式,支持等信息。以及登录页面。身份验证,您可以重定向到整个目标主机。

我保留一个单独的登录页面的原因,以及为什么我针对“面向消费者”的网站实际上拥有完全不同的应用程序的原因是,因为我无法向未经身份验证的人公开很少的内容。偶然地,一个笨蛋开始在我的登录页面上敲打,我不希望那会影响应用程序方面的事情..即使登录仅执行简单的身份验证..它也可以帮助我防止bozo的影响用户体验..最坏的情况是,我的用户站点关闭,没有人可以登录,但是至少登录的用户不知道,他们的体验也不会开始变慢。.我并不是说那是防弹的选择..但至少我已将风险隔离到未经身份验证的区域。


1
安全通常是一个重要原因。
JustinC 2012年

1
@JustinC:在另一个页面上向我解释一下,以便更安全地登录吗?
ryanzec 2012年

不一定通过文件系统属性(但是如果情况如此就可以),但是Web应用程序容器/ Servlet软件/运行时通过对特定资源或资源组应用选择性身份验证/授权方法的应用整体上(实际上是目录):对于登录页面和特定的静态资源(图像,样式表,错误页面),匿名访问通常就足够了;对于其他页面,可能需要更特定的身份验证/授权。
JustinC 2012年

2
在应用程序外部进行身份验证可以使身份验证与应用程序无关。实际的安全性将取决于实施和技术
hanzolo 2012年

2017年更新:IdentityServer
hanzolo

10

这样做的原因之一是因为您随后可以使用基于Cookie的常规会话。用户登录,响应发送cookie和初始主页...,然后所有后续的ajax调用将cookie发送回服务器。


6

我看到这样做的一些理由:

  1. 我可以在web.xml中使用基于路径的常规访问控制规则。
  2. 我永远无法确定自己已经正确保护了整个Ajax应用程序,并且我需要进行大量测试才能确信。
  3. 我可以将身份验证委派给框架(如Spring Security),第三方应用程序或SSO解决方案(如CAS或JOSSO)。
  4. 我可以让浏览器缓存用户名和用户密码(可选)。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.