【问题标题】:Adding Spring Security dependency to Grails plugin将 Spring Security 依赖项添加到 Grails 插件
【发布时间】:2013-07-29 12:17:27
【问题描述】:

我正在开发一个供内部使用的 Grails 2.2.3 插件,我希望在插件中配置我在每个应用程序中使用的安全设置。 Spring Security 配置、Spring Security LDAP 配置以及自定义 UserDetails 类和 UserDetailsContextMapper 类。

我已经处理了所有这些,但我遇到的问题是我无法让依赖项在插件中正常工作。如果使用插件的应用程序在其插件依赖项中声明spring-security-corespring-security-ldap,它工作正常,但应用程序不必声明此依赖项 - 插件应该处理它。

那么如何让这个插件正确安装和使用spring-security-corespring-security-ldap 插件呢?这是我在插件中的 BuildConfig.groovy 文件:

    plugins {
        compile ":spring-security-core:1.2.7.3"
        compile ":spring-security-ldap:1.0.6"
        //Putting this in the app USING the plugin makes it work fine.
    }

【问题讨论】:

  • 这应该可以传递解决 - 你是如何在应用程序中使用你的插件的?如果它是内联的,这可能会失败,但从 zip 或本地工件/nexus/etc 安装应该可以正常工作
  • 我真的希望你能出现,伯特。它实际上是内联的。我正在开发它并使用测试应用程序使用它。我可以尝试将其打包为 zip 并以这种方式安装。
  • 更新:没有这样的运气。在插件块中声明这个我错了吗?我应该在依赖块中声明它吗?
  • @BurtBeckwith 我有一个相关的问题,也许你可以帮忙:stackoverflow.com/questions/50494260/…

标签: grails spring-security grails-plugin dependency-management


【解决方案1】:

plugins 块是正确的。如果从 zip 安装后仍无法正常工作,则可能是您之前留下了一些杂物。

为了把东西放在一个地方,我喜欢删除

grails.project.class.dir = "target/classes"
grails.project.test.class.dir = "target/test-classes"
grails.project.test.reports.dir = "target/test-reports" 

并将它们替换为

grails.project.work.dir = 'target'

所以一切都在target 文件夹下。当事情变得奇怪时,运行rm -rf target 以强制进行完全重新解析和重建。

然后,不要使用内联插件(这对于传递 deps 不是很好,因为我们现在从 POM 文件中读取该信息,除非您正确打包插件,否则这些信息不可用)或 zip,使用发布插件的 maven-install 脚本.

将此添加到plugins 部分(删除您可能拥有的任何旧版本):

build ':release:2.2.1', ':rest-client-builder:1.0.3', {
   export = false
}

在运行grails compile 解决问题后,maven-install 脚本将可用。这会打包您的插件并将其复制到您的 $HOME/.m2/repository 文件夹中的正确位置。然后,如果您在应用程序的 BuildConfig.groovy 中的 repositories 块中添加或取消注释 mavenLocal(),您可以在应用程序中为您的插件添加一个依赖项,就好像它已在主存储库中发布一样,例如

plugins {
   compile ':my-cool-security-plugin:0.1'
}

当您对插件进行更改时定期重新运行grails maven-install,并删除目标目录以强制在应用中重新安装。

【讨论】:

  • 感谢您如此彻底。我尝试了这些步骤。编译插件后,Spring Security Core 和 LDAP 都安装到插件中。然后我运行 maven-install 并创建了一个 pom.xml 文件,看起来它确实安装到了 $HOME/.m2/repository/org/grails/plugins/security-plugin/0.1/ (希望这是它所属的位置)。但是,当我尝试使用插件运行应用程序时,我在任何引用 org.springframework.security.*(导入、UserDetails 实现等)的地方都会遇到编译错误,所以没有这样的运气。 :(
  • @grantmc 在您使用自定义插件的应用中,BuildConfig.groovy 的外观如何?具体来说,repositories{..} 中有 inherits true 吗?
  • 我检查了 ~/.grails/2.2.3/projects/myapp/plugins/ 并且我的安全插件在那里,但是 spring-security-core 和 spring-security-ldap 没有——尽管它们都在该插件的 dependencies.groovy 文件中声明并且plugin.xml 文件。
  • @dmahapatro 是的,inherits true 在存储库块中。插件部分如下所示:plugins { compile 'edu.mssu:mssu-common:0.1' } 我可以手动添加 spring-security-core 和 spring-security-ldap ,一切都会正常工作。但我的想法是,我不想对每个使用这个插件的应用程序都这样做。我希望插件自己处理。
  • @grantmc 如果您遵循 Burt 的方法,这应该不是问题。我在这里唯一需要提供的是在您的应用程序的BuildConfig 中尝试legacyResolve true,如果您已经为您的插件适当地生成了一个 pom,它指定了 security-* 插件的依赖项,我不应该建议您这样做。
猜你喜欢
  • 2016-10-08
  • 1970-01-01
  • 1970-01-01
  • 2018-06-03
  • 2016-03-28
  • 1970-01-01
  • 2020-12-30
  • 2012-11-28
  • 2012-03-06
相关资源
最近更新 更多