Grails 3.2.4添加Spring Security Plugin 3.1.1后将无法加载应用程序

时间:2017-01-07 00:56:24

标签: grails spring-security

我生成了一个新的Grails 3.2.4应用程序。我生成了一些域对象,控制器和服务,然后让应用程序编译和运行。然后我将以下行添加到build.gradle。

    dependencies {
      ...
      compile "org.grails.plugins:spring-security-core:3.1.1"
      ...
   }

然后按照the plugin docs中的规定运行以下命令。

grails s2-quickstart --uiOnly

我已经定义了User,Role和UserRole类,我在application.groovy中指出了这个命令生成,以及定义:

grails.plugin.springsecurity.active = true

我还在一些观点中添加了<sec:ifNotGranted>标记的一些用法。

据我从文档中可以看出,我不应该做任何其他事情。根据上面链接的文档,Spring Security属性应该具有在插件提供的DefaultSecurityConfig.groovy文件中定义的默认值。但是,应用程序现在甚至不会运行。我得到的第一个错误是:

    groovy.lang.MissingMethodException: No signature of method: static grails.plugin.springsecurity.SpringSecurityUtils.findFilterChainNames() is applicable for argument types: (org.grails.config.NavigableMap$NullSafeNavigator, java.lang.Boolean, java.lang.Boolean, java.lang.Boolean, java.lang.Boolean, java.lang.Boolean, groovy.util.ConfigObject) values: [[:], false, false, false, false, false, [:]]
Possible solutions: findFilterChainNames(java.lang.Object, boolean, boolean, boolean, boolean, boolean, boolean)
    at groovy.lang.MetaClassImpl.invokeStaticMissingMethod(MetaClassImpl.java:1503)
    at groovy.lang.MetaClassImpl.invokeStaticMethod(MetaClassImpl.java:1489)
    at org.codehaus.groovy.runtime.callsite.StaticMetaClassSite.call(StaticMetaClassSite.java:53)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
    at grails.plugin.springsecurity.ReflectionUtils.findFilterChainNames(ReflectionUtils.groovy:214)

我查看了the code where findFilterChainNames is called,问题是有些属性的默认布尔值应该是true或false(根据上面的文档),但是根本没有定义它们,导致此处显示的错误。我确认如果我自己在application.groovy中定义这些属性,则会出现此错误。但是,对于Spring Security代码运行的下一个未定义属性的另一个错误,它被替换为,我试图定义自己的每个属性,即使我不应该,根据文档。

我走过了the code where the default values from DefaultSecurityConfig.groovy should be merged into the values defined in the application.groovy。但是,当从类路径加载DefaultSecurityConfig并进行解析时,我在文件中看到的属性不会在返回的配置映射中结束。

当我按照文档中的说明操作时,我无法弄清楚我做错了什么。我尝试在线搜索类似的问题,但找不到任何东西。有没有人有任何想法或有其他人遇到过这个?

2 个答案:

答案 0 :(得分:0)

Whelp,我想通了。我正在进一步进入应该合并来自提供的DefaultSecurityConfig的属性的代码,我注意到a)当它踩过DefaultSecurityConfig文件时,断点没有与代码排成一行而b)一些返回的属性具有旧的grails.plugins前缀而不是新的grails.plugin前缀。这让我怀疑某个旧版本的DefaultSecurityConfig(以及可能还有其他groovy类)被引入而不是正确的版本。因此,我清空了所有缓存的jar和类的〜/ .grails,〜/ .gradle和〜/ .m2目录。之后,我的应用程序似乎正确初始化Spring Security(由于无法找到我已将Spring Security配置为用作注销处理程序的bean,因此失败,我不知道为什么,但这似乎与这个问题无关。)

答案 1 :(得分:0)

我正在使用grails 3.2.8,在配置Spring security ldap之后,基于表单的身份验证工作正常。

但是,当我切换到基本身份验证时,我遇到了同样的错误。我正在使用application.properties文件来获取ldap的配置道具并将Basic Authentication设置为true。

grails.plugin.springsecurity.useBasicAuth = true

添加到application.yml和一切工作文件。