在 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 中仅查看您自己的数据的主要内容,如果未能解决你的问题,请参考以下文章
如何允许用户在 Spring Boot / Spring Security 中仅访问自己的数据?
访问被拒绝并获取 抱歉,在 grails 中将插件 Spring Security 核心升级到 2.0 版本后,您无权查看此页面