【问题标题】:grails spring security custom userDetailsServicegrails spring security自定义userDetailsS​​ervice
【发布时间】:2013-02-11 21:21:46
【问题描述】:

我在将 userDetailsS​​ervice 注入自定义提供程序时遇到问题。我有一个自定义的 userDetailsS​​ervice,我正试图将它注入我的提供者,但是,由于我的提供者的某种原因,这在 null userDetailsS​​ervice 中解析。 以下来自我的resources.groovy:

beans = {
  userDetailsService(CustomUserDetailsService) {
  }

  stupidAuthenticationProvider(StupidAuthenticationProvider) {
    userDetailsService = ref("userDetailsService")
  }
}

基本上我只是在我的提供程序中将其定义如下:

public class StupidAuthenticationProvider implements AuthenticationProvider {
def userDetailsService

我错过了什么?

【问题讨论】:

  • 查看Spring Security Core 定义的bean,这似乎是正确的名称。你确定你声明了userDetailsService?在您的引导程序中,如果您打印 grailsApplication.mainContext.getBean('userDetailsService') 实例是 CustomUserDetailsService?
  • 是:com.test.CustomUserDetailsS​​ervice@6180ef93
  • 你是如何使用愚蠢的AuthenticationProvider的?
  • 基本上我刚刚将提供程序添加到 springsecurity.providerNames... grails.plugins.springsecurity.providerNames = ['stupidAuthenticationProvider'] 这一切顺利,当我尝试登录时触发此提供程序.一旦进入愚蠢的AuthenticationProvider,我将userDetailsS​​ervice定义为:def userDetailsS​​ervice,但这被解析为null,只是println userDetailsS​​ervice或尝试调用某些方法解析为null
  • 问题只是userDetailsS​​ervice似乎没有正确注入

标签: grails spring-security


【解决方案1】:

您的 CustomUserDetailsS​​ervice 是否在一个包中?如果是,那么您应该在配置中给出它的完全限定名称。

以下内容对我有用:

beans = {
    userDetailsService(com.mysite.MyUserDetailsService)
//and then refer it like...
    emailAuthenticationProvider(com.mysite.EmailAuthenticationProvider) {
        springSecurityService = ref('springSecurityService')
        userDetailsService = ref('userDetailsService')
    }
}

在身份验证提供程序中...

class EmailAuthenticationProvider implements AuthenticationProvider {

    def userDetailsService
    def springSecurityService

    @Override
    public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        //...
    }
}

【讨论】:

  • 我有一个没有完全限定名称的 userDetailsS​​ervice,它运行良好。
  • 在 beans DSL 中,括号中的参数是 java.lang.Class 对象 - 您可以使用完全限定名称 userDetailsService(com.mysite.MyUserDetailsService) 或仅使用普通名称 userDetailsService(MyUserDetailsService) 还有 在文件顶部添加一个合适的import com.mysite.*。两种变体是等效的。
  • 谢谢@IanRoberts,我不知道 :)
【解决方案2】:

尝试使用类的限定名称:

    beans = {
        userDetailsService(com.test.CustomUserDetailsService){
        }

        StupidAuthenticationProvider(com.test.XXX.StupidAuthenticationProvider) {
            userDetailsService = ref('userDetailsService ')
        }
    }

【讨论】:

  • 这并没有改变任何东西
猜你喜欢
  • 1970-01-01
  • 2013-05-12
  • 2014-10-12
  • 2014-10-06
  • 2012-12-13
  • 2016-03-09
  • 1970-01-01
  • 1970-01-01
  • 2012-06-11
相关资源
最近更新 更多