我的团队在JAX-RS中设计RESTful API,我们需要根据已认证的“Operator”(我们称之为用户)的ID来限制数据库中某些行的可用性。换句话说,操作员只能访问其管辖范围内的实体。在每个请求开始时,我们对发出请求的操作员进行身份验证,这允许我们基于操作员的角色和ID提供安全功能。
授权端点、端点方法,甚至实体内容(序列化的内容)都相对容易,但是行级授权似乎非常复杂。
请注意,我们不使用Spring,也没有在项目中使用Spring Security的计划。
我们想出了一些潜在的解决方案,但我们不确定哪种最好。也很可能有一种我们还没有考虑的解决方案;我现在对任何事情都持开放态度。以下是我们目前的解决方案:
1. 数据库级别实现(如此帖子中所讨论的)。这可能涉及在每个请求上使用请求的安全上下文将操作员的ID传递给数据库。我不清楚实施此方法的具体细节,因此如果这是执行行级安全性的最佳方法,我会感激进一步的建议。例如,对于实体检索,这是有意义的,但是我们如何修改新创建或更新实体的行级权限呢?
2. JPA级别实现(如2008年此帖子中所讨论的)。这可能涉及生成一个参数化的Hibernate过滤器,其中我们将提供发出请求的操作员的ID。我从未使用过Hibernate过滤器,因此这个想法很可能是错误的。
3. 门面层级别实现。我们实际上已经对这个想法进行了相当多的思考,因为我们最近才意识到选项(1)和(2)。这将涉及在我们的表之间执行连接,以构建一个Criteria API谓词,该谓词将限制我们的查询仅包括特定操作员可访问的实体。就我所理解的而言,这基本上是“手动”方法,似乎远非理想。
如果熟悉JAX-RS和/或数据库安全性的人能够帮助理清所有这些内容,那将是很棒的。
以下是我们项目的技术栈(至少与此问题相关的部分):
- 数据库:MS SQL - JPA提供程序:Hibernate - JAX-RS实现:RESTEasy
授权端点、端点方法,甚至实体内容(序列化的内容)都相对容易,但是行级授权似乎非常复杂。
请注意,我们不使用Spring,也没有在项目中使用Spring Security的计划。
我们想出了一些潜在的解决方案,但我们不确定哪种最好。也很可能有一种我们还没有考虑的解决方案;我现在对任何事情都持开放态度。以下是我们目前的解决方案:
1. 数据库级别实现(如此帖子中所讨论的)。这可能涉及在每个请求上使用请求的安全上下文将操作员的ID传递给数据库。我不清楚实施此方法的具体细节,因此如果这是执行行级安全性的最佳方法,我会感激进一步的建议。例如,对于实体检索,这是有意义的,但是我们如何修改新创建或更新实体的行级权限呢?
2. JPA级别实现(如2008年此帖子中所讨论的)。这可能涉及生成一个参数化的Hibernate过滤器,其中我们将提供发出请求的操作员的ID。我从未使用过Hibernate过滤器,因此这个想法很可能是错误的。
3. 门面层级别实现。我们实际上已经对这个想法进行了相当多的思考,因为我们最近才意识到选项(1)和(2)。这将涉及在我们的表之间执行连接,以构建一个Criteria API谓词,该谓词将限制我们的查询仅包括特定操作员可访问的实体。就我所理解的而言,这基本上是“手动”方法,似乎远非理想。
如果熟悉JAX-RS和/或数据库安全性的人能够帮助理清所有这些内容,那将是很棒的。
以下是我们项目的技术栈(至少与此问题相关的部分):
- 数据库:MS SQL - JPA提供程序:Hibernate - JAX-RS实现:RESTEasy