0

有没有办法限制对象所有者对 Grails 域对象的全面访问?

例如,我可以assert轻松地制作一个,但我不想到处复制它,或者冒着错过一个地方的风险。

这与多租户并不完全相同,因为它不仅仅是租户 ID - 它可能是不同域对象的特定业务逻辑。

class MyDomain {
  String name
  String user
}

class MyController {
  def show(Long id) {
    def obj = MyDomain.get(id)
    // *** How do I not do copy-paste this line in each individual controller 
    // that touches MyDomain?? *** 
    assert obj.user == CURRENT_USER

    return obj
  }
}
4

3 回答 3

1

正如其他答案所暗示的那样,有很多方法可以处理这种情况,但是,我认为一种正确的方法是使用Spring Security Pluginspring-security-acl plugin。ACL 插件将深入到对象级别并帮助您控制

根据文档

“ACL 插件为使用 Spring Security 的 Grails 应用程序添加了域对象安全支持。”

安全核心和 ACL 的结合可以帮助您完成所需的工作。

于 2013-08-23T02:10:30.260 回答
0

过滤器可能是一种方式,另一种方式是尽可能调整您的查询。您可能需要能够搜索 ID 以外的其他条件。如果不进一步了解您的用例,就很难给出更好的答案。

def show(String someValue) {
  def currentUser = howeverYouGetYourUser
  def obj = MyDomain.findByUserAndSomeValue(currentUser, someValue)
  if (obj) {
    // yeah!!!
  } else { 
    // boo!!
  } 
}

理想情况下,如果您正在寻找特定用户的特定数据,ID 并不是真正的选择。

于 2013-08-22T22:50:46.743 回答
0

我不确定您是否可以在域级别执行此操作,但一种方法是使用过滤器。有一个可用于 Grails 的过滤器插件。将用户保持在会话中并在过滤器中验证每个请求..

示例过滤器代码:

class SecurityFilters {
    def filters = {
        loginCheck(controller: '*', action: '*') {
            before = {
                if (!session.user && !actionName.equals('login')) {
                    redirect(action: 'login')
                    return false
                }
            }
        }
    }
}

并指定过滤器属性..

这是文档 grails.org/doc/2.2.1/ref/Plug-ins/filters.html

于 2013-08-23T00:12:10.220 回答