3

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

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

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

4

3 回答 3

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

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

于 2012-11-09T02:33:03.767 回答
3

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

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

于 2012-11-09T09:18:35.863 回答
2

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

于 2012-11-09T09:12:49.463 回答