grails - 从过滤器访问 'session'

我正在使用grails 2.5.x,并在spring-security中添加了一些PreAuthentication

我试图将请求参数传递到PreAuth程序包中,因此我创建了一个过滤器来执行此操作。这是类(class):

class PreAuthenticationRequestParametersFilter extends AbstractPreAuthenticatedProcessingFilter {

这是 bootstrap :
def init = { servletContext ->
    // injects request data for SAML login
    SpringSecurityUtils.clientRegisterFilter('preAuthRequestFilter', SecurityFilterPosition.PRE_AUTH_FILTER)
}

最后,这是来自resources.groovy的bean配置:
preAuthRequestFilter(PreAuthenticationRequestParametersFilter) {
    authenticationManager = ref("authenticationManager")
}

我想从过滤器中进行一些数据库查找。但是,当我尝试使用我的DAO(休眠)方法时,这很令人讨厌。
org.springframework.dao.DataAccessResourceFailureException: Could not obtain current Hibernate Session; nested exception is org.hibernate.HibernateException: No Session found for current thread
    org.grails.datastore.gorm.GormStaticApi.methodMissing(GormStaticApi.groovy:105)
    com.mydomain.PreAuthenticationRequestParametersFilter.decodeXml(PreAuthenticationRequestParametersFilter.groovy:52)

我尝试在session = ref("session")的过滤器中添加“resources.groovy”。编译失败。

是否可以在此级别访问我的 session / DAO?

最佳答案

那是Hibernate session ,而不是HTTP session 。 Grails使用OpenSessionInView模式,在该模式中,它打开一个Hibernate session 并保持可用状态,直到请求完成为止,但是Spring Security在Grails之前运行(以防需要阻止访问),因此尚无自动注册的 session 。

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

AnyDomainClass.withTransaction { status ->

  // GORM code here
}

https://stackoverflow.com/questions/34095120/

相关文章:

ubuntu - ssh 不会在 ubuntu 10.04 64bit 中自动启动

grails - Grails War在版本3.1中产生JAR文件

grails - 大括号与方括号

ssh - 如何在远程服务器上运行CPU Hogging程序?

grails - Groovy/Grails无法仅在运行时解析类

php - 同时更新同一台服务器上的数百个站点

ssh - chroot访问www文件夹

django - django 启动时使用 paramiko 来隧道化 MySql 端口

git - Git推送错误:ssh:无法解析主机名domain.com [:7555]:提供了节点名

bash - 通过ssh登录时自动运行脚本