其他属性的Maven密码加密

时间:2012-07-03 15:35:19

标签: maven encryption mojo

我想使用Maven的密码加密,例如它用于Mojo属性的节点。我尝试将加密的密码粘贴到mojo的正确属性中,但它将其视为纯文本。我希望我可以在Mojo属性的注释上设置一个属性来解释它可以被加密,如果是的话,使用系统主密码来解密,但我不知道请参阅文档中的任何内容。

是否有人设法将Maven的密码加密用于除服务器密码节点之外的任何其他内容?我很乐意为我的Mojo做这个工作。

4 个答案:

答案 0 :(得分:3)

不是一个完整的答案,但希望指向正确的方向......

maven-scm-pluginmaven-release-plugintomcat6-maven-plugin都允许从<servers>文件的${user.home}/.m2/settings.xml部分读取密码。

也许如果你查看这些插件/目标的源代码,你会发现一个Maven核心或共享组件,它可以让你做你想做的事情,你可以根据自己的需要进行调整。

答案 1 :(得分:1)

将此代码看作示例SqlExecMojo。如果您在插件中,则可以获取密码并对其进行解密。如果你想用它来过滤资源插件中的属性,我们可能需要编写一个自定义版本的资源插件。我有一个类似的问题可能最终这样做。

答案 2 :(得分:1)

@ user944849让我开始朝着正确的方向前进,这就是解决方案。

如果您正在使用Maven 2,则需要将以下依赖项添加到您的mojo:

<dependency>
  <groupId>org.sonatype.plexus</groupId>
  <artifactId>plexus-sec-dispatcher</artifactId>
  <version>1.4</version>
  <scope>compile</scope>
</dependency>

并将以下内容放入src/main/resources/META-INF/plexus/components.xml

<?xml version="1.0" encoding="utf-8" ?>
<component-set>
  <components>
    <component>
      <role>org.sonatype.plexus.components.sec.dispatcher.SecDispatcher</role>
      <role-hint>mng-4384</role-hint>
      <implementation>org.sonatype.plexus.components.sec.dispatcher.DefaultSecDispatcher</implementation>
      <requirements>
        <requirement>
          <role>org.sonatype.plexus.components.cipher.PlexusCipher</role>
          <role-hint>mng-4384</role-hint>
          <field-name>_cipher</field-name>
        </requirement>
      </requirements>
      <configuration>
        <_configuration-file>~/.m2/settings-security.xml</_configuration-file>
      </configuration>
    </component>
    <component>
      <role>org.sonatype.plexus.components.cipher.PlexusCipher</role>
      <role-hint>mng-4384</role-hint>
      <implementation>org.sonatype.plexus.components.cipher.DefaultPlexusCipher</implementation>
    </component>
  </components>
</component-set>

然后在您的Mojo中,将密码作为普通属性获取,将SecDispatcher作为具有相同roleHint的组件。 decrypt上的String方法将返回字符串本身,如果它不是Maven加密字符串。

import org.apache.maven.plugin.AbstractMojo;
import org.apache.maven.plugin.MojoExecutionException;
import org.sonatype.plexus.components.sec.dispatcher.SecDispatcher;
import org.sonatype.plexus.components.sec.dispatcher.SecDispatcherException;

/**
 * @goal echopass
 * 
 * @phase process-sources
 */
public class MyMojo extends AbstractMojo {
  /**
  * The password
  * @parameter expression="${password}"
  */
  private String password;

  /**
   * Plexus component for the SecDispatcher
   * @component roleHint="mng-4384"
   */
  private SecDispatcher secDispatcher;

  private String decrypt(String input) {
    try {
      return secDispatcher.decrypt(input);
    } catch (SecDispatcherException sde) {
      getLog().warn(sde.getMessage());
      return input;
    }
  }

  public void execute() throws MojoExecutionException {
    String s = decrypt(password);
    getLog().info("The password is " + s);
  }
}

字符串可以位于settings.xml中的属性中,也可以位于配置文件中,或者甚至可以将加密的字符串作为系统属性传递给命令行。

参考文献:

答案 3 :(得分:0)

使用Colselaws解决方案我得到一个空指针异常。未设置SecDispatcher组件。我需要将注释更改为:

//Plexus component for the SecDispatcher
@Component(role = SecDispatcher.class, hint = "mng-4384")
private SecDispatcher secDispatcher;

请注意,这不在任何文档注释范围内,必须从maven注释插件中导入Component。