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

时间:2015-01-12 12:01:05

标签: javascript ajax angularjs security authentication

现在已经有一段时间了,我正在学习和使用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功能来补充我的应用程序(如控制器,变量绑定等),但忽略和不(如路由)?

我是以错误的方式看待它吗?

2 个答案:

答案 0 :(得分:2)

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

您提出的身份验证解决方案正如您自己已经说过的那样,从安全角度来看是错误的。虽然他/她未经过身份验证,但是向用户提供HTML是一个坏主意。

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

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

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

答案 1 :(得分:2)

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

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

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

3)路由在SPA中的工作方式只发生在客户端上。也没有必要在服务器上也有它。只需重新编写所有返回index.html的请求的url,然后使用angular routing来处理剩下的工作。

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