Grails域对象 - 限制对特定用户的访问

时间:2013-08-22 21:05:08

标签: security grails gorm

有没有办法限制对所有对象的所有者访问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
  }
}

3 个答案:

答案 0 :(得分:1)

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

根据doc

  

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

安全核心和ACL的组合可以帮助您实现所需。

答案 1 :(得分:0)

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

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

理想情况下,如果您正在寻找特定用户的特定数据,那么ID就不是真正的方法。

答案 2 :(得分: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