在 Grails 中仅查看您自己的数据

Posted

技术标签:

【中文标题】在 Grails 中仅查看您自己的数据【英文标题】:Seeing only your own data in Grails 【发布时间】:2012-10-29 08:39:27 【问题描述】:

这似乎是一个基本问题,但我还没有找到明确的答案。我在 Grails 中使用 spring-security-core 插件,并且我的 S2Users 有很多 Portfolios,Portfolios 有很多 Transactions。

当我转到脚手架视图检查事务时,我如何知道每个用户只看到他自己的事务?反之,如何创建一个可以查看所有用户的所有交易的用户?

我不清楚默认行为是什么,以及 Grails/Spring-Security 如何知道特定域类是应该对所有人可见还是只对关联用户可见。

【问题讨论】:

不,Spring Security 不会自动限制数据。您必须创建正确的查询。 【参考方案1】:

当我去脚手架视图检查事务时,我怎么知道 每个用户只看到他自己的交易?

您将不得不修改脚手架视图以使其正常工作:

@Secured(['ROLE_USER'])
def list() 
   def authenticatedUser = User.findByUsername(springSecurityService.principal.username)
   def transactions = Transaction.findAllByUser(authenticatedUser)
   [transactions: transactions]

以上将只允许经过身份验证的用户访问 list() 方法,并将获取登录用户的所有事务。

相反,我如何创建一个可以查看所有交易的用户 所有用户?

您不会创建一个可以查看所有内容的用户,而是在您的控制器中创建一个允许特定用户查看所有内容的方法,例如:

@Secured(['ROLE_USER', 'ROLE_ADMIN'])
def list() 

   def authenticatedUser = User.findByUsername(springSecurityService.principal.username)
   def transactions = []
   if (SpringSecurityUtils.ifAnyGranted('ROLE_ADMIN')) 
       transactions = Transaction.list()
   else
       transactions = Transaction.findAllByUser(authenticatedUser)
   
   [transactions: transactions]

反正就是这样。根据需要进行调整。

【讨论】:

您可以使用springSecurityService.currentUser。确切地说,查询需要像transactions = Transaction.withCriteria portfolio eq 'user.id', springSecurityService.currentUser.id 【参考方案2】:

有一些插件可以帮助您。我将Hibernate Filter plugin 用于该确切目的,它可以帮助您限制SQL,以便每个用户只能看到他/她自己的数据。然后,您可以使用您自己的 HibernateFilterFilters 实现覆盖,如果用户具有 ROLE_ADMIN(从插件复制源并适应),则禁用所有过滤器。

还有一些用于多租户的插件,但我似乎不确定这些插件的维护。我喜欢 Hibernate Filter 插件,它简单明了 - 但您必须将所有 .get() 调用更改为 .findById(),因为该插件如何与 Grails/GORM 挂钩。

【讨论】:

绝对是一个有用的指针。但原版 Grails 在这些方面提供了什么? AFAIK 什么都没有。您必须自己处理,使用自己的代码或插件。【参考方案3】:

如果数据访问规则比较复杂,需要在所有应用代码中强制执行,可以使用spring-security-acl插件。

【讨论】:

以上是关于在 Grails 中仅查看您自己的数据的主要内容,如果未能解决你的问题,请参考以下文章

在 Grails 中仅输出日期 + 时间的日期部分

如何允许用户在 Spring Boot / Spring Security 中仅访问自己的数据?

Grails:调试脚手架模板

动态连接到 grails 中的数据库

如何在 CouchDB 中仅显示用户自己的文档?

访问被拒绝并获取 抱歉,在 grails 中将插件 Spring Security 核心升级到 2.0 版本后,您无权查看此页面