2015-12-04 5 views
1

Я использую grails 2.5.x и добавляю PreAuthentication к пружинной защите.Доступ к «сеансу» с фильтра

Я пытаюсь передать параметры запроса в пакет PreAuth, поэтому я создал фильтр, который это делает. Вот класс:

class PreAuthenticationRequestParametersFilter extends AbstractPreAuthenticatedProcessingFilter { 

Вот самозагрузки:

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

Наконец, вот мой боб конфигурации из resources.groovy:

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 на этом уровне?

ответ

4

Это сеанс Hibernate, а не сеанс HTTP. Grails использует шаблон OpenSessionInView, где он открывает сеанс Hibernate и сохраняет его доступным до тех пор, пока запрос не завершится, но Spring Security запускается до Grails (в случае необходимости блокировать доступ), так что сеанс автоматически не зарегистрирован.

Простейшим обходным решением для этого является обертывание вашего кода в блоке withTransaction. В любом случае, это хорошая идея, если вы будете писать в базу данных, но также избегаете проблем, которые вы видите, а также позволяет ленивой загрузке работать. Класс домена, который вы вызываете withTransaction, не имеет никакого влияния, поэтому выберите любой из них, например.

AnyDomainClass.withTransaction { status -> 

    // GORM code here 
} 
+0

ответил в 20 минутах от самого Берта. Мне нужно только читать, но это отличная модель, особенно потому, что она полезна для остальной части моей проблемы с проблемами безопасности весной. – tedder42

Смежные вопросы