Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在数据库表中存储访问权限是常见做法吗? 问题:_Java_Rest_Authorization_Jax Rs_Access Control - Fatal编程技术网

Java 在数据库表中存储访问权限是常见做法吗? 问题:

Java 在数据库表中存储访问权限是常见做法吗? 问题:,java,rest,authorization,jax-rs,access-control,Java,Rest,Authorization,Jax Rs,Access Control,对于基于角色的RESTful API访问,将访问权限存储在数据库表中是否是常见做法(并且被认为是安全的)?我说的是访问权限,用于限制用户对某些端点、HTTP方法(GET、POST、PUT、DELETE)的访问,或限制查询中接受/返回的字段 或者访问权限通常存储在应用程序代码中(即编译到API本身的基于角色的逻辑)?更一般地说,为RESTful API处理自定义访问权限的推荐方法是什么 我不是指基于API本身的用户身份验证或基于OAuth的授权,这将通过标准的基于令牌的机制来处理 背景 我们正在J

对于基于角色的RESTful API访问,将访问权限存储在数据库表中是否是常见做法(并且被认为是安全的)?我说的是访问权限,用于限制用户对某些端点、HTTP方法(GET、POST、PUT、DELETE)的访问,或限制查询中接受/返回的字段

或者访问权限通常存储在应用程序代码中(即编译到API本身的基于角色的逻辑)?更一般地说,为RESTful API处理自定义访问权限的推荐方法是什么

我不是指基于API本身的用户身份验证或基于OAuth的授权,这将通过标准的基于令牌的机制来处理

背景 我们正在JavaEE7中构建一个RESTfulAPI,其中包括一个基于角色的访问控制机制,用于确定在查询中接受/返回哪些端点、HTTP方法和字段。在我们的初始设计中,我们使用由on-endpoint方法读取的自定义注释来根据用户的角色确定用户的权限,并在(反)序列化期间使用s来过滤特定的实体字段

这个系统可以工作,但我们觉得它变得过于复杂,难以维护。我们已经讨论过将此授权信息移动到几个数据库表中,最重要的是存储表和列访问权限的表(PK和FK列摘录)

每个角色(未显示的表)都可能引用此
AccessPermissions
表中的许多行,因此可以通过询问用户是否有允许请求访问的查询表条目和列名来实现端点方法访问和(反)序列化


例如,带有
{“field1”:“value”,“field2”:23}
POST/endpoint1
要求为用户分配一个角色,该角色在
AccessPermissions
中有任何行,其中
TableName='endpoint1'
HasCreate=true
,请求主体中的JSON将只反序列化所述行中的命名列。因此,如果与此用户角色对应的
AccessPermissions
中唯一一行是
('endpoint1','field1',true,false,false,false)
,则允许
POST
,但JSON主体的一部分不会被反序列化(即
field2
)。(此外,该用户可以
POST/endpoint1
,但不能
[GET | PUT | DELETE]/endpoint1

通常,您希望尽可能多地将功能彼此分离。就像您不会在API/应用程序代码中紧密耦合(或重新实现)身份验证或日志一样,您希望保持授权解耦

实际上有一个名称:外部化授权。Gartner称之为外部化授权管理(EAM)。有几种方法可以实现这一点。首先,您的开发框架可能为您提供了在API上定义授权的方法。Spring Security、.NET声明就是这样的例子

除此之外,您还有授权模型:

  • RBAC(基于角色的访问控制):在RBAC中,您拥有分配给资源的用户、角色和权限(有时称为权限)。例如,用户Alice可能具有角色管理器。该角色管理器将viewEndPoint1作为权限授予她。在某种程度上,它与你的建议非常相似。您的REST框架应该能够为您提供实现这一点的工具,例如通过注释。有一篇很好的文章你可以
  • ABAC(基于属性的访问控制):在ABAC中,您可以从应用程序完全外部化授权。这是我每天都在做的事情,所以我可能有点偏见。在ABAC中,您有策略决策点(PDP)和策略实施点(PEP)的概念。后者是位于API前面的拦截器/API网关/代理。PEP截获所有进出的通信量,并询问PDP呼叫是否被授权。PDP配置了一组基于属性的策略,用于说明可以发生什么和不可以发生什么。这使您可以使用细粒度的基于策略的授权方法。您不再需要创建自定义RBAC数据库模式
假设您的API是关于保险合同和索赔的:

  • /acme/合同
  • /acme/contracts/{contractId}
  • /acme/索赔
  • /acme/claims/{claimId}
  • /acme/客户
  • /acme/customers/{custId}/合同
  • /acme/customers/{custId}/claims
等等。。。您的政策可以说明:

  • 保险销售代表可以查看与其相关的客户的合同
  • 索赔处理人可以编辑其所在地区客户的索赔
  • 客户可以查看其所有合同和索赔
  • 客户可以查看他们作为监护人的其他客户的合同
如您所见,该策略定义了高级权利。这些数据来源于商业应用程序的元数据(您已经拥有),例如合同ID、合同价值、合同区域、合同客户;索赔ID,索赔区域;客户指定的销售代表

有几个框架实现了这种方法。我使用最多的是XACML(可扩展访问控制标记语言)

它给API安全带来的一些关键好处是:

  • 细粒度访问:您可以使用风险、上下文和关系
  • 完全与应用程序逻辑分离-摆脱自定义代码和db模式
  • 可扩展:您可以在需要时添加新方案。因此,如果将来有一个新的API,只需添加一个新策略即可
  • 可审核性和责任:您可以比编写代码更轻松地审核策略;你可以证明是谁(试图)
       AccessPermissions
    ========================
    |  Column    |  Type   |
    ========================
    | TableName  | varchar |
    | ColumnName | varchar |
    | HasCreate  | bit     |
    | HasRead    | bit     |
    | HasUpdate  | bit     |
    | HasDelete  | bit     |