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

Javascript angularjs是否建议用于大规模基于身份验证的应用程序?,javascript,ajax,angularjs,security,authentication,Javascript,Ajax,Angularjs,Security,Authentication,我学习和使用angularjs框架已经有一段时间了,尽管它的一些特性确实很棒,但在我看来,它的关键特性对于基于身份验证的应用程序来说似乎有点问题 让我们看一个例子。假设我有一个网站有一个用户登录,一旦用户登录,他就可以点击他/她的仪表板页面的链接。在仪表板上,用户可以看到一些私有数据。现在,我习惯于这样做,在服务器端运行一些脚本,然后如果用户已连接,则返回一些HTML,如果没有,则将用户重定向到另一个位置。angularjs鼓励我这样做的方式是使用route功能,比如: when('/dashb

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

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

when('/dashboard', {
    templateUrl: 'dashboard.html',
    controller: 'DashboardController'
  })
这样,如果用户未连接,angularjs将首先获取模板HTML,然后控制器将获取一些数据并接收身份验证错误,然后将路由重定向到另一个位置。在我看来,这似乎是一个更糟糕的解决方案,原因不止一个:

首先,我的HTML向所有人公开。虽然这并不是毁灭性的,但这似乎是一个糟糕的安全实践想象一下你甚至没有facebook帐户,但你仍然可以看到所有facebook页面HTML,甚至更糟糕的是,所有类似的对象和字段,例如user.accessToken

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

这可能是对我来说最重要的问题。我在服务器端所做的一切都必须粘贴到客户端。例如,路由功能在服务器端必须像在客户端一样清晰,以防用户直接进入我的应用程序中的某个内部页面,或通过应用程序链接中的路由。这意味着,每当路由配置发生变化时,我必须在服务器端和客户端各做一次——在我看来,这也是一种糟糕的做法,而且代码模块化

对于此类应用,不建议使用angularjs吗?我是否应该使用angularjs特性来补充我的应用程序,比如控制器、变量绑定等,但忽略那些不喜欢路由的特性


我看得不对吗?

是的,你看得不对。你混淆了客户端和服务器端的问题

从安全角度来看,您提出的身份验证解决方案是不好的,正如您自己已经说过的。尽管用户没有经过身份验证,但将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的范围。

你没有从错误的角度看待它,只是从不同的角度来看。你不习惯做水疗,所以这很正常

我确信HTML会向所有人公开,但那只是一个模板。它只包含html模板,而不是与每个人的facebook个人资料相关的特定数据。服务器控制返回给用户的数据,并且只返回用户有权查看的数据。实际上,除了来回发送的数据量之外,这与非SPA没有什么不同

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

3 SPA中的路由工作方式是它只发生在客户身上。不需要将它也放在服务器上。只需为返回index.html的所有请求重新编写url,然后angular routing将处理其余部分


关于它被推荐。实际上没有这样的建议。这取决于你。两者都有优点和缺点。Angular的大多数缺点都与学习曲线有关。

我有完全相同的问题,我们如何防止显示该模板?仪表板html@mhadadi这取决于您使用的web服务器。然而,您的web服务器的文档应该包括,如果没有,我相信已经有一个关于这个的问题了,所以,如果您不使用相同的超级奇怪的web服务器,这是很久以前的事了,但回顾起来,我认为这个答案对我帮助最大