【问题标题】:SPA: Separating backend administration from client sideSPA:将后端管理与客户端分离
【发布时间】:2014-07-25 22:07:54
【问题描述】:

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

我们正在尝试找出托管后端的位置。

  1. 如果我们将其保留在 app 子域中,我们只需向现有应用程序添加一个新角色(管理员),但这将允许普通用户登录到后端不知何故泄露了。

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

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

【问题讨论】:

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


    【解决方案1】:

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

    我创建了一个名为 durandal-multisite 的小型 GitHub 存储库,以详细说明您将如何进行。

    总体思路是:

    1. 保持相同的视图模型/视图
    2. 提取业务逻辑(无论如何都应该遵循正确的 SoC)
    3. 创建 2 个 main.js 实现(前端/后端)
    4. 各自的 main.js 设置一个 RequireJS 映射到您的视图模型请求的别名 然后提供具体的模块实现

    【讨论】:

      【解决方案2】:

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

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

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

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

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

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

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

      接下来您需要了解的是您的应用程序如何根据角色进行更改:

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

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

        -

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

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

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

      【讨论】:

        【解决方案3】:

        这是我当前的应用结构:

        • /_css/
        • /_img/
        • /_js/
          • /app/
          • /lib/
        • index.html

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

        • /_css/
        • /_img/
        • /_js/
          • /app/
          • /backend/
          • /lib/
        • index-app.html
        • index-backend.html

        这样可以更轻松地在应用程序之间进行管理和切换。我不必担心保持 css、图像和库同步或为后端创建新的 git 存储库。

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

        我应该更具体地回答我的问题,并说明我的问题更多在于如何在本地而不是在服务器上管理这两个应用程序。

        感谢您的回答!

        【讨论】:

          猜你喜欢
          • 2019-02-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-12-15
          • 1970-01-01
          • 2018-10-10
          相关资源
          最近更新 更多