我正在使用grails 2.5.x,并在spring-security中添加了一些PreAuthentication
。
我试图将请求参数传递到PreAuth程序包中,因此我创建了一个过滤器来执行此操作。这是类(class):
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")
}
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
”。编译失败。最佳答案
那是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/