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

Security Grails域对象-限制对特定用户的访问,security,grails,gorm,Security,Grails,Gorm,有没有办法限制对象所有者对Grails域对象的全面访问 例如,我可以轻松地创建一个断言,但我不想到处重复,也不想冒漏掉一点的风险 这与多租户并不完全相同,因为它不仅仅是租户ID——它可能是不同域对象的特定业务逻辑 class MyDomain { String name String user } class MyController { def show(Long id) { def obj = MyDomain.get(id) // *** How do I n

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

例如,我可以轻松地创建一个
断言
,但我不想到处重复,也不想冒漏掉一点的风险

这与多租户并不完全相同,因为它不仅仅是租户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
  }
}

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

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

理想情况下,如果您正在为特定用户查找特定数据,ID并不是真正的解决方法。

我不确定您是否可以在域级别执行此操作,但一种方法是使用筛选器。有一个过滤器插件可用于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的文档,正如其他答案所建议的那样,处理此类场景的方法有很多,但是,我认为一种正确的方法是使用和。ACL插件将深入到对象级别,帮助您控制

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


安全核心和ACL的结合可以帮助您完成所需的任务

SpringSecurity看起来仍然必须应用于每个服务或控制器方法。我希望有一些东西进入域/GORM层本身。你看过spring security acl插件吗?是的,我当然能做到-重点是在堆栈中放一些较低的东西,这样如果我做MyDomain.find(x)本身,我不会意外地拉别人的东西。