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 应用程序数据库行级安全最佳方法的主要内容,如果未能解决你的问题,请参考以下文章
SSAS 表格 - 通过从 Rest API 读取安全权利来应用行级过滤