【问题标题】:How to inject springSecurityService into custom Listener如何将springSecurityService注入自定义监听器
【发布时间】:2012-01-30 12:10:16
【问题描述】:

我正在使用带有 SpringSecurity 的 Grails 1.3.7 登录,并且有一个要求,我需要在用户会话到期时执行一些处理。

所以我在 src/groovy 中定义了一个类,它实现了 HttpSessionListener 并覆盖了 sessionDestroyed 方法。侦听器类在 web.xml 中定义为“侦听器”。

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

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

谢谢,

戴夫

【问题讨论】:

    标签: grails dependency-injection spring-security


    【解决方案1】:

    侦听器由 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() .

    【讨论】:

    • 感谢您的输入,但是在调用 lookupApplication 时我收到了方法的无签名:静态 grails.util.GrailsWebUtil.lookupApplication() 适用于参数类型:(org.apache.catalina .core.ApplicationContextFacade) 异常。
    • 好的,正在取得进展,现在可以获取服务,但不幸的是当前用户为空。所以不确定这是因为 spring 在 sessionDestroyed 事件被触发之前已经卸载了它,还是因为其他一些原因。
    • 是的,lookupApplication() 是一个 2.0.0 功能(编辑我的答案以反映它)。至于 springSecurityService.getCurrentUser(),安全上下文可能只在请求期间被保存。由于事件侦听器在请求上下文之外触发,因此安全上下文将不可用。我不是 Spring Security 方面的专家,但这是一种常见的模式。
    • 是的,这就是我所做的,因为发现 Log4J 代码正在做同样的事情:def ctx = AH.application.mainContext 和 springSecurityService = ctx.springSecurityService
    • 那您大概可以接受我的回答,因为它解决了您的注射问题? :) 您也许应该提出一个关于在请求上下文之外使用 spring security currentUser 的复杂性的新问题......
    【解决方案2】:

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

    在 BuildConfig.groovy 中安装 compile ':spring-security-core: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/

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-10
      • 2015-04-19
      • 2017-02-18
      相关资源
      最近更新 更多