2011-12-30 65 views
0

我使用Grails 1.3.7 alogn與SpringSecurity並有一個要求,我需要當用戶會話到期進行很少的處理。如何注入springSecurityService到定製監聽

所以不得不在SRC /常規它實現HttpSessionListener和覆蓋sessionDestroyed方法的定義的類。監聽器類被定義爲web.xml中的「監聽器」。

我添加了一個「高清springSecurityService」到了我希望會自動注入服務聽衆,但這似乎並不如此。

所以我想知道還有什麼我需要爲了使注射要發生的事情,我必須聲明監聽器類中resources.groovy不知何故?

感謝,

戴夫

回答

3

的聽衆由servlet容器實例化,因此Spring的範圍之外。但是,您可以通過servletcontext(在會話對象中提供)訪問應用程序上下文。像這樣的東西應該讓你的服務:

在2.0.0你可以使用:

public void sessionDestroyed(HttpSessionEvent se) { 
    ServletContext context = se.getSession().getServletContext(); 
    GrailsApplication application = GrailsWebUtil.lookupApplication(context); 
    application.getMainContext().getBean("springSecurityService"); 
} 

在以前的版本中,GrailsWebUtil.lookupApplication()不可用,但可以使用組織。 codehaus.groovy.grails.commons.ApplicationHolder.getApplication()代替。

+0

感謝輸入但是在調用lookupApplication我收到方法的無簽名:靜態grails.util。 GrailsWebUtil.lookupApplication()是適用於參數類型:(org.apache.catalina.core.ApplicationContextFacade)例外。 – Dave 2011-12-30 12:08:29

+0

好吧,正在取得進展,現在能夠獲得服務,但不幸的是,當前用戶爲空。所以不確定是否因爲spring已經在sessionDestroyed事件被觸發之前卸載了它,或者出於其他原因。 – Dave 2011-12-30 12:17:23

+0

是的,lookupApplication()是一個2.0.0的功能(編輯我的答案反映它)。至於springSecurityService.getCurrentUser(),可能僅在請求期間保持安全上下文。由於事件偵聽器在請求上下文之外觸發,安全上下文將不可用。我不是Spring Security的專家,但這是一種常見模式。 – 2011-12-30 12:31:56

0

在2.0及更高版本,可以使用插件彈簧安全核心:2.0 RC4

安裝在BuildConfig.groovy編譯 ':彈簧安全核心:2.0 RC4'

Class MyController { 
static allowedMethods = [save: "POST", update: "PUT", delete: "DELETE"] 

    def springSecurityService 
    def index(Integer max) { 
     params.max = Math.min(max ?: 10, 100) 
     def user = (User)springSecurityService.currentUser 
     respond User.list(params), model: [userInstanceCount: User.count() ] 
    } 
} 

更多信息http://grails-plugins.github.io/grails-spring-security-core/

希望這有助於