Grails 如何将springSecurityService注入自定义侦听器

Grails 如何将springSecurityService注入自定义侦听器,grails,dependency-injection,spring-security,Grails,Dependency Injection,Spring Security,我将Grails1.3.7与SpringSecurity一起使用,并且有一个需求,当用户会话过期时,我需要执行一些处理 因此,我在src/groovy中定义了一个类,它实现了HttpSessionListener并重写了sessionDestroyed方法。侦听器类在web.xml中定义为“侦听器” 我在侦听器中添加了一个“def springSecurityService”,我希望它能自动注入服务,但事实并非如此 所以我想知道为了进行注入还需要做些什么,我是否必须以某种方式在resources

我将Grails1.3.7与SpringSecurity一起使用,并且有一个需求,当用户会话过期时,我需要执行一些处理

因此,我在src/groovy中定义了一个类,它实现了HttpSessionListener并重写了sessionDestroyed方法。侦听器类在web.xml中定义为“侦听器”

我在侦听器中添加了一个“def springSecurityService”,我希望它能自动注入服务,但事实并非如此

所以我想知道为了进行注入还需要做些什么,我是否必须以某种方式在resources.groovy中声明侦听器类

谢谢


Dave

监听器由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()不可用,但您可以使用org.codehaus.groovy.grails.commons.ApplicationHolder.getApplication()。

监听器由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()不可用,但您可以使用org.codehaus.groovy.grails.commons.ApplicationHolder.getApplication()。

在2.0及更高版本中,您可以使用插件spring security core:2.0-RC4

BuildConfig.groovy编译中的安装:spring安全核心: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() ]
    }
}  
更多信息请访问


希望这对2.0及更高版本有所帮助,您可以使用插件spring security core:2.0-RC4

BuildConfig.groovy编译中的安装:spring安全核心: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() ]
    }
}  
更多信息请访问


希望这是帮助

感谢您的输入,但是在调用lookupApplication时,我收到了一个无签名的方法:static grails.util.GrailsWebUtil.lookupApplication()适用于参数类型:(org.apache.catalina.core.ApplicationContextFacade)exception.Ok,正在进行中,现在可以获得服务,然而不幸的是,currentuser为null。所以不确定这是因为spring在sessionDestroyed事件触发之前已经卸载了它,还是因为其他原因。是的,lookupApplication()是一个2.0.0功能(编辑我的答案以反映它)。对于springSecurityService.getCurrentUser(),安全上下文可能仅在请求期间保留。由于事件侦听器在请求上下文之外触发,因此安全上下文将不可用。我不是Spring安全方面的专家,但这是一种常见的模式。是的,我就是这么做的,因为我发现Log4J代码也在使用:def ctx=AH.application.mainContext和springSecurityService=ctx.SpringSecurityServices。那么,您可能可以接受我的答案,因为它解决了您的注入问题:)您可能应该就在请求上下文之外使用spring security currentUser的复杂性提出一个新问题……感谢您的输入,但是在调用lookupApplication时,我收到了一个无签名的方法:static grails.util.GrailsWebUtil.lookupApplication()适用于参数类型:(org.apache.catalina.core.ApplicationContextFacade)异常。好的,正在进行中,现在能够获得服务,但不幸的是当前用户为空。所以不确定这是因为spring在sessionDestroyed事件触发之前已经卸载了它,还是因为其他原因。是的,lookupApplication()是2.0.0功能(编辑我的答案以反映它),安全上下文可能仅在请求期间保留。由于事件侦听器在请求上下文之外触发,安全上下文将不可用。我不是Spring安全方面的专家,但这是一种常见的模式。是的,我就是这么做的,因为我发现Log4J代码也在使用:def ctx=AH.application.mainCo执行相同的操作ntext和springSecurityService=ctx.springsecurityservices那么您可能可以接受我的答案,因为它解决了您的注入问题?:)您可能应该就在请求上下文之外使用spring security currentUser的复杂性提出一个新问题。。。