2016-07-14 32 views
2

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

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

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

回答

0

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

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

@PostFilter(“filterObject.owner == authentication.name”) public List getMyObjects();

你可以在这里看到更多。

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

+1

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

0

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