添加 Spring Security 插件 3.1.1 后,Grails 3.2.4 应用程序不会加载

Posted

技术标签:

【中文标题】添加 Spring Security 插件 3.1.1 后,Grails 3.2.4 应用程序不会加载【英文标题】:Grails 3.2.4 Application Won't Load After Adding Spring Security Plugin 3.1.1 【发布时间】:2017-05-21 20:44:36 【问题描述】:

我生成了一个新的 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 并进行解析时,我在文件中看到的属性不会出现在返回的配置映射中。

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

【问题讨论】:

个人从未尝试过 --uiOnly grails s2-quickstart com.yourapp User Role 试试看它是否会改变行为。 grails-plugins.github.io/grails-spring-security-core/v3/… 你的方法确实存在,该页面上的文档并不多 遗憾的是,行为没有改变: 【参考方案1】:

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

【讨论】:

【参考方案2】:

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

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

grails.plugin.springsecurity.useBasicAuth = true

添加到 application.yml 和一切正常的文件。

【讨论】:

以上是关于添加 Spring Security 插件 3.1.1 后,Grails 3.2.4 应用程序不会加载的主要内容,如果未能解决你的问题,请参考以下文章

带有 Spring Security 核心和 CORS 插件的 grails REST API 不适用于 OPTIONS http 方法请求

在 grails 中使用 spring-security 插件时出错

带有 grails 的 Spring Security 核心插件

使用 Grails Spring Security Saml 插件

grails spring-security-ui 插件重定向回应用程序

Spring Security 3.1 xsd 和 jars 不匹配问题