【问题标题】:Hibernate Filter Plugin not working in Grails休眠过滤器插件在 Grails 中不起作用
【发布时间】:2015-06-05 07:30:31
【问题描述】:

我正在使用休眠过滤器在每个继承业务域的域中启用分支 id....我在每个域中都包含休眠过滤器

static hibernateFilters = {
        branchEnabledFilter(condition: ':branch_id=branch_id', types: 'long', default: true)
}

通过 Our Grails 过滤器启用此休眠过滤器...如下所示..

def filters = {
        all(controller:'login', action:'auth',invert:true) {
            before = {
                grailsApplication.getArtefacts("Domain")*.clazz.each{ clazz ->
                    if(clazz.getGenericSuperclass().getName().contains('BusinessDomain')){
                        def filter =  clazz.enableHibernateFilter('branchEnabledFilter')
                        filter.setParameter('branch_id',applicationContext.springSecurityService.principal?.branchId as long)
                    }
                }   
            }
            after = {
                //
            }
        }
}

第一次登录时,我调用主控制器,然后在仪表板页面中,通过链接调用通知控制器...第一次出现错误,例如未设置分支 id...但是我的过滤器工作...但是它没有为此请求启用休眠过滤器...但是如果我修改了过滤器中的任何代码,例如注释 println 或取消注释 println,则编译过滤器...然后一切正常...请告诉我这里发生了什么...如何解决这个问题...如何在所有请求中工作..

【问题讨论】:

  • 我在这里发现有趣的是,您拦截了通常只显示登录页面并请求主体的分支 ID 的登录/身份验证。在大多数情况下,由于用户即将登录,因此不会知道此信息。我可能会挂上登录成功,然后应用过滤器。顺便说一句,过滤器是会话感知的,还是首先登录的人为所有其他人设置过滤器?
  • 首先。感谢你的回复。在登录控制器中,auth 操作提供登录页面...除了该操作,在每个控制器的操作中...我正在请求分支 id...invert true 将完成这项工作...我认为
  • 这个问题解决了吗?我也面临同样的问题。

标签: hibernate grails plugins filter multi-tenant


【解决方案1】:

很难确切地说,但我正在做类似的事情,这是我能说出的差异:

我认为您需要为每个域过滤器设置不同的名称,即:domainAFilter、domainBFilter 等。

在我使用的 Grails 过滤器中(短版):

import org.grails.plugin.hibernate.filter.DefaultHibernateFiltersHolder;

def hibernateSession = grailsApplication.mainContext.sessionFactory.currentSession
DefaultHibernateFiltersHolder.defaultFilters.each { name ->
  def aFilter = hibernateSession.enableFilter(name)
  aFilter.setParameter('branchId', springSecurityService.principal.branchId)
}

我还有一个“相反”的 Grails 过滤器,在您的情况下 onlyAuth(controller:'login', action:'auth'),它会循环遍历每个过滤器并禁用它,但我是不确定是否需要。

def hibernateSession = grailsApplication.mainContext.sessionFactory.currentSession
DefaultHibernateFiltersHolder.defaultFilters.each { name ->
  hibernateSession.disableFilter(name)
}

【讨论】:

  • 感谢您的回答...已更改所有域中的过滤器名称...仍未设置分支 ID...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-30
  • 1970-01-01
  • 2017-06-08
  • 2015-02-14
  • 1970-01-01
  • 1970-01-01
  • 2017-03-30
相关资源
最近更新 更多