授权逻辑应该在基于api的应用程序中的哪个位置?

时间:2017-06-06 17:54:07

标签: ruby-on-rails api security authorization abac

我有一个全新的基于Rails api的应用程序,我需要实现授权。

整体架构:

React frontend -> Rails API layer -> Rails model/server layer

在探索不同的方法时,我感到很困惑。

  1. 我们应该将授权逻辑放在API层还是服务层?
  2. API层方法:我们将构建一些位于我们的前端和API层之间的授权中间件,我们所有的api调用将通过授权中间件进行路由,以检查用户是否被允许称那个parituclar api。
  3. 服务层:所有授权检查都将转到服务层,如果允许用户,我们将在每次数据库操作之前进行检查。 (使用cancancan / pundit)并且如果不允许用户将错误消息抛出到API层。
  4. 如果有人可以根据他们的经验提出建议,那将是一个很大的帮助。

1 个答案:

答案 0 :(得分:1)

TL;博士

在应用程序之外 - 始终外部授权。将授权逻辑与业务逻辑分离。

更长的答案

自SOA(面向服务的体系结构),API体系结构和现在的微服务开始以来,趋势是打破应用程序孤岛并以可重用常用功能的方式设计系统。例如,您使用中央身份验证服务(我不希望实现您自己的身份验证方案)和中央日志记录机制。

同样适用于授权。有一种叫做externalized authorization的东西可以促进:

  • 从应用程序中解耦授权逻辑。许多开发框架已经做到了(Spring Security,Microsoft Claims,Ruby CanCanCan ......)
  • 将授权逻辑集中到单一管理点。
  • 将授权逻辑表示为人类可读的政策。这意味着您可以编写诸如此类的策略
    • 医生可以查看与他们有关系的患者的医疗记录
  • 使用属性定义这些策略:这称为基于属性的访问控制(ABAC)。它是新应用程序开发(例如API)的de factor授权模型。 NIST在2013年就该主题发布了excellent report

建筑

ABAC推广以下架构和流程(更多details here

  • 政策执行点
  • 政策决策点
  • 政策信息点
  • 政策管理点

XACML & ABAC Architecture - Axiomatics

ABAC实施:XACML& ALFA

通用方法

今天有2个标准实施ABAC。 XACML提供语言和架构(见上文)。 ALFA提供language

Ruby中的ABAC

查看此项目:CanCanCan