【问题标题】:MVC frameworks, API layers, and Authentication/PermissionsMVC 框架、API 层和身份验证/权限
【发布时间】:2011-07-03 03:55:30
【问题描述】:

我之前问过question,但它可能过于模糊或宽泛,无法保证回答。从那以后,我重新考虑了我的方法和我的问题。

我正在开发一个考虑特定应用程序的框架,但显然我将可重用性放在首位。该框架的关键元素是公开一个 API 层,用于 JSON 驱动的远程交互。

我在计划这个问题时遇到了身份验证/权限如果我在设计时考虑到了 MVC 风格的架构,但又想允许通过 API 层使用,那么应该在哪里进行身份验证/权限检查?

Web 访问层本质上与 API 层相同,唯一的区别是输出方法(HTML 与 JSON),所以我认为两者的通用业务逻辑层是有意义的。请求将被规范化为数据结构,并发送到业务逻辑。业务逻辑最终踢出一个结果数据结构(查询结果、失败、成功等),该结构要么馈送到模板引擎,要么序列化为 JSON。

在我看来,权限检查需要在公共业务逻辑层中执行,但有没有更好的地方将其合并到 MVC/API 框架中?

目前我不知道在哪里可以详细说明,所以请随时询问更多详细信息,我会在想出时提供。

【问题讨论】:

    标签: php model-view-controller api authentication permissions


    【解决方案1】:

    您打算如何允许用户访问 API?

    以下是我如何进行基于角色的授权:

    • 每个控制器通常都有多个前端可访问的操作(方法),例如
      • function action_get($id)
      • function action_delete($id)
    • 每个控制器都有一个类属性,用于指定每个操作所需的角色,例如
      protected $access = array(
          'get' => NULL,  // everybody can access; this line isnt necessary though
          'delete' => array('admin')  // only admins can access
      )
    • 在执行操作之前会触发before() 方法。它根据 $access 列表进行授权检查。
    • 每个操作都负责确定要输出的内容,例如
    public function action_get($id) {
          // Business logic... build data structure
          # ...
    
          if (Request::is_ajax()) {
              // Output JSON
          }
          else {
              // Output HTML
          }
      }

    该系统可以轻松扩展以允许 API 调用。扩展方法的输出部分,检测它是否是 API 请求,或者简单地为 API 调用创建另一个操作。如果您选择后一种方法并希望保持代码 DRY,请将数据结构的业务逻辑移动到辅助方法(例如 protected function _get())。可能还有更好的方法来提供对 API 的访问和处理。这实际上取决于您希望如何允许访问以及您希望使其变得多灵活/干燥。

    【讨论】:

    • 谢谢simshaun;这似乎是一个合适的解决方案。您建议的基于角色的权限似乎适合我的情况。我可以从 Controller 中移除输出格式的责任,因为生成的数据结构对于模板插入或 JSON 序列化都应该是格式良好的。 API 层的原因是应用程序和相关站点都可以获取、修改或同步数据。我不愿意接受,只是因为我很快会在我的问题中详细说明其他几点。
    【解决方案2】:

    通常,身份验证在控制器级别执行(通常在控制器类的构造函数中,因此该控制器中的每个方法都会调用它)。您当然会在模型中拥有一些用户/角色数据,但是控制器会将请求与权限等进行比较,并且允许或不允许该方法(然后该方法将决定输出 html、json、或其他)。

    【讨论】:

    • controller级别为业务级别。
    • 感谢您的快速回复Jordan Lev;我明白你在说什么。我认为我在理解如何实现这一点时遇到的问题是,我在几个层面上偏离了 MVC 概念,而我还没有详细介绍。嗯,我会在白板后详细说明。
    猜你喜欢
    • 2010-09-27
    • 2019-10-24
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多