SPA:从客户端分离后端管理

时间:2014-07-24 16:13:52

标签: javascript single-page-application durandal durandal-2.0

我正在开发使用DurandalJS构建的SPA,它在app.example.com上托管。 API托管在api.example.com上。我们现在正计划为自己添加后端管理,以忽略我们的客户。我们每个人都有一个帐户,我们将能够管理我们的客户。

我们想要弄清楚的是在哪里托管后端。

  1. 如果我们将其保留在app子域名中,我们只需要向现有应用程序添加新角色(admin),但这将允许常规用户登录如果我们的凭据以某种方式泄露,则后端。

  2. 如果我们将现有应用程序克隆到admin.example.com,我们总是要担心代码同步,但它会更安全,因为admin子域名将会对公众开放,管理员登录需要一组不同的api和私钥。

  3. 我们该如何处理?如果我们选择#2,是否有更好的方法在两个应用程序之间共享代码而没有额外的麻烦?

3 个答案:

答案 0 :(得分:2)

我个人喜欢使用不同子域的第二种方法。 复制代码库并不是必需的,因为您可以利用RequireJS提供的很酷的功能来将别名映射到您的模块。这里的重要性在于,通过将业务逻辑提取到模块中,您可以提供不同的实现。

我创建了一个名为durandal-multisite的小型GitHub Repo来详细说明如何继续。

一般的想法是:

  1. 保持相同的viewmodels / views
  2. 提取businesslogic(无论如何应该遵循正确的SoC)
  3. 创建2个main.js实现(前端/后端)
  4. 各个main.js将RequireJS映射设置为viewmodel请求的别名 然后提供具体的模块实现

答案 1 :(得分:1)

我认为您需要区分创建指向同一应用程序的子域或创建两个单独的应用程序。

我认为,为了给出完整的答案,我们需要首先确定您应用的一些重要方面:

  • 您的身份验证和身份验证是如何实现的?它是SPA的一部分吗?是在加载SPA之前吗?

  • 应用程序的代码是否与管理应用程序100%相同?保持同步是什么意思?

做出一些假设我可以给你一些答案,它可能不准确,但可以帮助你:

子域名很酷,您可以预先获得一些信息(用户尝试访问的子域名),这样您就可以轻松地限定请求并在实际访问应用程序服务器之前确定一些内容。但是,我不认为您的问题在于应用程序应该存在于哪个子域中。

您需要回答的第一件事是如何使用户成为管理员和普通用户。显然你不应该依赖子域来这样做。可能这个逻辑会基于某些数据(可能来自数据库)存在于登录过程中。

您需要知道的下一件事是您的应用程序如何根据角色而变化:

  • 如果您的应用程序将100%相同(相同的代码)并且会根据记录的角色动态做出反应,那么您真的不需要任何特殊的东西。您所需要的只是确保您的应用程序足够安全,不允许普通用户执行管理员工作。

    • 您可以使用子域和一些额外的逻辑,因此只有管理员可以使用子域。然而,这只是一些"糖"安全性进行一些分离。应用程序需要仍然需要一致地管理角色和权限。

    -

  • 如果您的应用程序未使用相同的代码库,则需要在Web应用程序的日志记录过程中确定登录哪个角色以及应将哪个SPA应用程序发送到浏览器。为此,您需要一个单独的日志记录页面或具有可以动态加载模块的模块化SPA。

    • 可能您希望在应用程序(管理员和面向用户的应用程序)之间重用一些代码。重新使用部分代码库会遇到一些挑战。
    • 您不必担心用户应用程序中的权限和角色,但您需要安全的日志记录过程。

(只是提醒)无论如何,SPA应该包含管理角色和权限的逻辑,以保持一致性并避免用户混淆。主要的安全管理在您的API中。任何具有身份验证和授权的SPA的目标都是拥有安全的API。

答案 2 :(得分:0)

这是我目前的应用结构:

  • / _ CSS /
  • / _ IMG /
  • / _ JS /
    • /应用/
    • / LIB /
  • 的index.html

在阅读完两个答案后,我最终将应用程序分开,同时将它们保持在同一屋檐下。

  • / _ CSS /
  • / _ IMG /
  • / _ JS /
    • /应用/
    • /后端/
    • / LIB /
  • 索引app.html
  • 索引backend.html

这样可以更轻松地管理和切换应用。我不必担心保持css,图像和库同步或为后端创建新的git repo。

我还更新了我的Gruntfile.js,为应用和后端添加了单独的构建过程。因此,本地应用程序将位于相同的/_js文件夹下,但在服务器上,它们将位于不同的域中。

我应该对我的问题更加具体,并且包括这样一个事实:我的问题更多的是如何在本地管理这两个应用程序,而不是在服务器上。

感谢您的回答!