Spring 应用程序数据库行级安全最佳方法

Posted

技术标签:

【中文标题】Spring 应用程序数据库行级安全最佳方法【英文标题】:Spring application database row level security best approach 【发布时间】:2016-07-14 15:12:11 【问题描述】:

在 Spring Web 应用程序及其数据库中实现行级安全性的最佳方法是什么?我有许多包含应用程序用户数据的表。用户只能选择、更新和删除他自己的行。用户在数据库的表中定义,并使用 spring-security 记录到应用程序。我正在使用一个数据库帐户从应用程序连接到数据库。

我的想法是在每个表中创建带有用户名的列(我需要在这里建立关系吗?)。现在我可以在后端查询中添加'where username = <username>'。这是个好主意吗?在这种情况下,最常用的方法是什么?

我使用 JPA 和 Hibernate 管理数据访问。

【问题讨论】:

【参考方案1】:

我认为您需要为需要验证的每个对象定义一个所有者。您可以使用 where 子句验证数据库中的用户。

但你也可以使用 Spring @PostFilter 在方法中添加另一层。它可以让您过滤返回的对象。

@PostFilter ("filterObject.owner == authentication.name") 公共列表 getMyObjects();

你可以在这里看到更多。

http://www.concretepage.com/spring/spring-security/prefilter-postfilter-in-spring-security

【讨论】:

它只会在应用程序端进行过滤,您可能会遇到性能问题,一旦您在过滤之前从数据库中获取所有内容(取决于您的 where 子句)。最好转到另一个过滤数据库 where 子句的解决方案(使用 JPA、Spring Data 或任何其他解决方案)。【参考方案2】:

一些数据库已经具有行级安全功能。 Oracle 提供虚拟专用数据库,PostreSQL 有alter table ... enable row level security;。 SQL server 也有这个特性。在其他数据库中,您必须手动完成所有工作(通过表中的辅助列或/和包装器视图中的特殊检查):question about mysql on SE、MairaDB。

【讨论】:

以上是关于Spring 应用程序数据库行级安全最佳方法的主要内容,如果未能解决你的问题,请参考以下文章

Hibernate/Spring:是不是存在行级安全性?

访问 Spring 的安全上下文的最佳实践

SSAS 表格 - 通过从 Rest API 读取安全权利来应用行级过滤

在spring boot apis中添加安全漏洞检查的最佳方法。

实体框架的行级安全性

Jersey JAX-RS + Spring 安全应用示例