【问题标题】:Conditional field visibility for Spring MVC Rest ResourceSpring MVC Rest Resource 的条件字段可见性
【发布时间】:2013-12-30 15:42:11
【问题描述】:

首先我想稍微提一下架构。

我们有一个 UI 应用程序,它对所有操作和用例使用 REST api。 UI 应用程序使用凭据来调用 REST api,因为还有其他非 UI 应用程序使用相同的服务。

我们使用 Spring Security 对 REST api 应用程序进行身份验证和授权。实际上整个应用程序从上到下都使用了 Spring 组合。

对于 UI 应用程序上的操作的身份验证和授权,我们还使用 Spring Security。我们保护 url 并仅显示当前登录的用户被授权执行的操作。

这是新的要求:一些已登录的用户会看到有限制的资源。这意味着相同的资源会显示更少的字段或更少的可更新字段。

四处探索,我们缩小到两种方法:

  • 对每个受限访问使用不同的表示。基于一些 HTTP 标头集并为客户端所知。
  • 为每个受限访问使用不同的资源。

如果资源表示组合太多,不同的资源对象可能难以维护。可以实现基于 HTTP 标头的自动限制器方面。客户端还提供了一些标头,这给客户端增加了一些复杂性。

如果组合不是太多,则会为每个受限访问创建一个新资源。客户必须在正确的时间打电话给正确的人。这种方法可以揭示隐藏的领域概念,因为新资源和设计可能看起来更干净。

你的想法是什么?你会采取哪种方法?

【问题讨论】:

    标签: rest spring-mvc


    【解决方案1】:

    从您的架构来看,我猜您已经设置了安全过滤器(我相信它在 Spring 中称为 OncePerRequestFilter?)。我过去处理这个问题的方法是使用我的安全过滤器来获取客户端的“角色”(假设您可以为每个客户端分配角色,这些角色映射到每个资源对象的特定权限/限制)。现在基于“角色”,我有自定义 JSON 序列化器/反序列化器策略(我将 GSON 用于此包含/排除类型适配器。您可以阅读更多 here (Gson custom seralizer for one variable (of many) in an object using TypeAdapter) )将处理应该/不应该填充哪些资源字段/序列化。这样,您将继续为每个资源对象使用相同的资源对象和 TypeAdapter,这将根据客户端的角色确定资源对象的序列化/反序列化。

    我想到的另一个想法是方法拦截器(Spring AOP)。尽管我从未尝试过使用方法拦截器,但我认为它仍然可以工作,因为您将在方法返回之前(以及在业务逻辑完成之后)拦截方法并查看发出请求的客户端的角色。基于该角色,您可以在将其转换为 json(或任何您的返回类型)并将其发送到客户

    我希望这会有所帮助。

    【讨论】:

    • 好吧,我用 Spring AOP 拦截器试过了。我什至创建了一个单独的库,其中包含拦截器和公共注释库,以将字段标记为某些角色的受限字段。我不确定的是,从其他 api 的角度来看,身份验证和授权基于其他应用程序(我的 UI 应用程序或其他系统),但从我的 UI 应用程序的角度来看,安全性基于从中检索的用户和角色登录时的 api(用户、经理、超级用户等)。以某种 HTTP 头的方式将 UI 的安全概念引入 REST api 是否正确?
    • 一个很好的问题,我个人认为这取决于实现。我之前处理它的方式是每个客户都有一个角色或某种标识符来说明它们的来源。例如,您的 UI APP 客户端可以具有“TRUSTED_CLIENT”角色,这意味着将需要基于任何人试图通过该 UI APP 客户端访问您的 api 的“角色”的进一步授权(基于他们的登录,如你提到的,他们可以是超级用户、经理、用户等)
    • 其他系统(其他客户端),您可以拥有“TRUSTED_THIRD_PARTY_CLIENT”角色,这意味着您将查看此客户端有权访问的“范围”,而不是更深入一步尝试通过此第三方客户端进行此 api 调用的用户具有什么细粒度的角色。我的观点是,根据拨打电话的客户类型,您似乎需要 2 级授权。这必须在您的安全过滤器层本身进行处理。
    • 用很简单的话来说,if(TRUSTED_CLIENT), DO ROLE CHECK, ELSE IF(TRUSTED_THIRD_PARTY_CLIENT), DO SCOPE CHECK, ELSE RETURN 401。
    • 感谢您的详细描述。影响决策的另一个方面是:Restful 幂等性和缓存、此基础架构的可读性以及我的 TRUSTED_THIRD_PARTY_CLIENT 可能是一个移动应用程序,并且还需要根据该应用程序中的登录用户以受限的方式显示信息。对于上面提到的这些因素和资源-角色组合因素,您如何看待决定是使用多资源还是 http 标头方法?
    猜你喜欢
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    • 2017-08-26
    • 2016-08-06
    • 2012-04-22
    • 1970-01-01
    • 2015-11-19
    • 2010-09-23
    相关资源
    最近更新 更多