REST复杂资源访问

时间:2019-06-10 10:55:24

标签: c# asp.net rest api

所以在过去的几周中,我遇到了很多东西,这使我对REST有了更好的理解。

在工作中,某些REST API资源访问存在一些复杂的访问问题,所以我想知道是否有人可以帮助我了解我们是否/做错了什么,以及正确的解决方法。 / p>

所以我们面临的问题是,我们有一个获取所有订单的端点。例如/ orders该端点具有分页和过滤器等,此端点将获得订单列表。

我们有两种主要类型的用户(管理员和帐户)。

如果您是管理员,则可以查看所有订单;如果您是帐户用户,则将变得有些棘手,因为帐户用户可以基于一组权限查看订单。

因此,默认情况下,帐户用户可以看到他们下的所有订单。他们还将能够看到他们所拥有的任何订单。 (因此,这里的区别是订单是由用户下达的,但可以是另一个用户下的订单。例如,我可能会为另一个用户下订单)。

由于应用程序的设计方式,用户也可以看到其他分支的订单,其中一个例子就是分支报告程序,它处理所有分支的订单并整理报告等。

因此,所有这些示例如下: 如果您是管理员,则默认情况下会看到所有订单,如果您是帐户用户,并且拥有分支x和y的权限,则将看到x&y的所有订单以及您自己下的任何订单。

这里的域设计是否有问题,是什么使我无法看到可行的解决方案?

我一直在关注用户上下文,因此这可能是一种将某些问题分开的方法。因此,一个示例是不同的用户以不同的方式看到不同的资源。因此,要使一个解决方案不适合所有解决方案(这肯定是),您应该构建3个api。如果这样做,我绝对可以将管理员与帐户分开。但是我不知道如何处理帐户的复杂性。

enter image description here

我怀疑其关键与从数据库中检出这些权限并将其移入权限有关,但是我不确定如何处理动态权限。

很抱歉,如果其中有很多话或这没有道理。任何帮助将不胜感激,即使只是让我走上正确的道路。 就像我说的那样,我一直在尝试了解如何配置REST,同时又忘记了基础数据库,但这是一个棘手的问题,这使我感到困惑。

2 个答案:

答案 0 :(得分:0)

我认为您正在混合两个重要方面,第一个是您希望API遵循的样式,第二个是您要应用的授权逻辑。

REST

如果您要首先构建一致,清晰且可维护的rest API,则需要了解您的域。

那么对您来说,要使用您的API的订单是什么,您的代码库是唯一的吗,或者是否可以拆分以降低复杂性,耦合并提高隔离度?

如果您对订购有一个单一的了解,请保持原样。

授权

授权规则只是业务逻辑的另一个示例,并且随着业务的发展,授权规则经常会发生变化。 我建议您像对待任何其他逻辑一样对待授权,例如在计算订单总数时。 因此,如果您有服务层,请创建一个授权服务,在其中检查允许用户查看的内容。 您也可以在过滤器中执行此操作,以便在返回订单列表之前,应用安全规则,并删除用户不应查看的所有订单。 你不喜欢这种方法吗?然后,您需要将“授权过滤器”向下移动到堆栈中,以便查询本身将其考虑在内。 根据您所说的,执行GetOrderByUserID(x)时需要说明各个方面,如果使用EF,则可以将授权过滤器生成为lambda表达式,然后可以将其添加到where子句中,确保您和必要的联接,以便您可以使用分支机构,帐户等。

结论 这取决于您希望系统如何实现安全性,但是除非您认识到存在多个域对象Order,BranchOrder,DelegatedOrder,AccountOrder等,否则在请求中应该没有任何证据表明将存在安全性。之后应用的唯一问题是,REST请求的授权必须携带足够的详细信息(可能在标头中),以标识谁在请求资源。 还要注意,即使将域对象(订单)细分为更特定的订单类型,您仍然需要应用安全性,因此仍然需要创建和维护安全性规则。

您的问题有点宽泛,只有足够的信息可以提示您,如果您想获得更具体的答案,还需要更新您的问题以使其更加具体。

答案 1 :(得分:0)

如果在“订单”末尾具有代码级访问权限。然后,您可以通过这种方式进行设计。

  1. 在“订单”端将用户ID用作必填项。因此,每当任何用户调用API时,他都应使用用户ID参数来发出请求。
  2. 在“订单”端获得用户ID后,请检查用户的授权,例如用户是否为admin以及用户有权访问哪个分支。
  3. 现在,相应地限制数据响应。

您应在“订单”端进行更改以授权,过滤数据并相应地发送响应。