我使用grails 2.5.x并为spring-security添加了一些PreAuthentication
。
我试图将请求参数传送到PreAuth包中,因此我创建了一个过滤器来执行它。这是班级:
class PreAuthenticationRequestParametersFilter extends AbstractPreAuthenticatedProcessingFilter {
这是引导程序:
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(Hibernate)方法时它会发生骚扰。
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
中的过滤器。那编译失败了。
有没有办法在此级别访问我的会话/ DAO?
答案 0 :(得分:5)
这是Hibernate会话,而不是HTTP会话。 Grails使用OpenSessionInView模式,它打开Hibernate会话并在请求完成之前保持可用,但Spring Security在Grails之前运行(如果它需要阻止访问),所以没有会话自动注册。
最简单的解决方法是将代码包装在withTransaction
块中。无论如何,如果您要写入数据库,这也是一个好主意,但也避免了您所看到的问题,并且还允许延迟加载工作。您调用withTransaction
的域类没有影响,因此选择任何一个,例如
AnyDomainClass.withTransaction { status ->
// GORM code here
}