Grails 访问';会议';从过滤器

Grails 访问';会议';从过滤器,grails,spring-security,Grails,Spring Security,我正在使用Grails2.5.x,并向spring security添加了一些预验证 我试图将请求参数传递到一个预授权包中,所以我创建了一个过滤器。下面是课程: class PreAuthenticationRequestParametersFilter extends AbstractPreAuthenticatedProcessingFilter { 以下是引导程序: def init = { servletContext -> // injects request data

我正在使用Grails2.5.x,并向spring security添加了一些
预验证

我试图将请求参数传递到一个预授权包中,所以我创建了一个过滤器。下面是课程:

class PreAuthenticationRequestParametersFilter extends AbstractPreAuthenticatedProcessingFilter {
以下是引导程序:

def init = { servletContext ->
    // injects request data for SAML login
    SpringSecurityUtils.clientRegisterFilter('preAuthRequestFilter', SecurityFilterPosition.PRE_AUTH_FILTER)
}
最后,这里是我的bean配置,来自
resources.groovy

preAuthRequestFilter(PreAuthenticationRequestParametersFilter) {
    authenticationManager = ref("authenticationManager")
}
我想从过滤器中查找一些数据库。然而,当我尝试使用我的DAO(Hibernate)方法时,它会呕吐

我尝试将“
session=ref(“session”)
”添加到
resources.groovy中的过滤器中。未能编译


有没有办法在这个级别访问我的会话/DAO?

这是Hibernate会话,而不是HTTP会话。Grails使用OpenSessionInView模式,在该模式中,它打开一个Hibernate会话并保持它在请求完成之前可用,但Spring Security在Grails之前运行(以防它需要阻止访问),因此还没有自动注册会话

最简单的解决方法是将代码包装在
withTransaction
块中。无论如何,如果您要向数据库写入数据,这是一个好主意,但也可以避免您看到的问题,并允许延迟加载工作。您在其上调用的
withTransaction
域类没有影响,因此请选择任何一个域类,例如

AnyDomainClass.withTransaction { status ->

  // GORM code here
}

这是Hibernate会话,不是HTTP会话。Grails使用OpenSessionInView模式,在该模式中,它打开一个Hibernate会话并保持它在请求完成之前可用,但Spring Security在Grails之前运行(以防它需要阻止访问),因此还没有自动注册会话

最简单的解决方法是将代码包装在
withTransaction
块中。无论如何,如果您要向数据库写入数据,这是一个好主意,但也可以避免您看到的问题,并允许延迟加载工作。您在其上调用的
withTransaction
域类没有影响,因此请选择任何一个域类,例如

AnyDomainClass.withTransaction { status ->

  // GORM code here
}

从伯特本人那里20分钟内回答。我只需要阅读,但这是一个很好的模式,尤其是因为它有助于我余下的春季安全问题的解决。Burt自己在20分钟内回答。我只需要阅读,但这是一个很好的模式,尤其是因为它有助于我余下的spring安全问题的解决。