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

时间:2012-11-09 02:05:52

标签: grails spring-security gorm

这似乎是一个基本问题,但我没有找到一个明确的答案。我正在使用带有Grails的spring-security-core插件,我有S2Users,他们有很多投资组合,投资组合有很多交易。

当我进入一个脚手架视图来检查交易时,我怎么知道每个用户只看到他自己的交易?相反,如何创建可以查看所有用户的所有交易的用户?

我不清楚默认行为是什么,以及Grails / Spring-Security如何知道某个特定的域类是否应该对所有人可见而不是仅对相关用户可见。

3 个答案:

答案 0 :(得分:4)

  

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

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

@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]
}

无论如何都是这样的。根据需要调整。

答案 1 :(得分:3)

有插件可以帮助您解决此问题。我正在使用Hibernate Filter plugin用于此目的,它可以帮助您限制SQL,以便每个用户只能看到他/她自己的数据。然后,您可以使用自己的HibernateFilterFilters实现覆盖,如果用户具有ROLE_ADMIN(从插件中复制源并进行调整),则会禁用所有过滤器。

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

答案 2 :(得分:2)

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