Куда мне вводить свои учетные данные при использовании Ivy и репозитория частной компании?

Я использую Ant + Ivy, и моя компания недавно установила сервер Nexus для наших собственных частных библиотек. Ivy может получить зависимости от сервера Nexus, используя преобразователь ibilio и m2compatible=true, но мне нужно поместить свои учетные данные в файл ivysettings.xml.

Как разные разработчики должны хранить свои учетные данные?

Разве файл ivysettings.xml не должен быть зафиксирован в vcs?

Я действительно не хочу хранить свой пароль в виде простого текста.


person kalithlev    schedule 21.09.2011    source источник


Ответы (4)


Используйте файл настроек со свойствами, управляющими учетными данными Nexus:

<ivysettings>
    <property name="repo.host" value="default.mycompany.com" override="false"/>
    <property name="repo.realm" value="Sonatype Nexus Repository Manager" override="false"/>
    <property name="repo.user" value="deployment"  override="false"/>
    <property name="repo.pass" value="deployment123"  override="false"/>          

    <credentials host="${repo.host}" realm="${repo.realm}" username="${repo.user}" passwd="${repo.pass}"/>

    ..
    ..
</ivysettings>

Когда вы запускаете сборку, вы можете указать настоящее имя пользователя и пароль:

ant -Drepo.user=mark -Drepo.pass=s3Cret

Обновление/улучшение

Хранение паролей в качестве свойств в файловой системе требует шифрования.

Jasypt имеет программу командной строки, которая может генерировать зашифрованные строки:

$ encrypt.sh verbose=0 password=123 input=s3Cret
hXiMYkpsPY7j3aIh/2/vfQ==

Это можно сохранить в файле свойств сборки:

username=bill
password=ENC(hXiMYkpsPY7j3aIh/2/vfQ==)

Следующая цель ANT будет расшифровывать любые зашифрованные свойства ANT:

<target name="decrypt">
    <taskdef name="groovy" classname="org.codehaus.groovy.ant.Groovy" classpathref="build.path"/>

    <groovy>
    import org.jasypt.properties.EncryptableProperties
    import org.jasypt.encryption.pbe.StandardPBEStringEncryptor

    StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor()
    encryptor.setPassword(properties["master.pass"])

    Properties props = new EncryptableProperties((Properties)properties, encryptor);

    props.propertyNames().each {
        properties[it] = props.getProperty(it)
    }
    </groovy>
</target>

Конечно, чтобы это работало, пароль, используемый для шифрования свойств, должен быть указан как часть сборки.

ant -Dmaster.pass=123

Это означает, что решение подходит только для сокрытия данных в состоянии покоя.

person Mark O'Connor    schedule 21.09.2011
comment
Просто примечание, в файле ~/.bash_history все еще можно найти конфиденциальную информацию. - person om-nom-nom; 07.09.2012
comment
@om-nom-nom Ага, решение далеко не идеальное. - person Mark O'Connor; 07.09.2012

Для моих целей учетные данные командной строки не подходили, потому что я запускаю Jenkins, и они будут четко вставлены в выходные данные сборки, поэтому вот мое решение, которое обеспечивает баланс, будучи достаточно безопасным.

  • Создайте файл свойств в своем домашнем каталоге, содержащий конфиденциальную информацию (мы назовем его «maven.repo.properties»).

    repo.username=admin
    repo.password=password
    
  • В верхней части файла сборки импортируйте файл свойств.

    <property file="${user.home}/maven.repo.properties"/>
    
  • В целевом объекте публикации в build.xml укажите местоположение файла настроек ivy (которое действительно регистрируется для управления кодом), но внедрите свои учетные данные.

    <target name="publish">
        <ivy:settings file="ivysettings.xml">
            <credentials host="repohostname" realm="Artifactory Realm" username="${repo.username}" passwd="${repo.password}"/>
        </ivy:settings>
        <!-- ivy:makepom and ivy:publish targets go here -->
    </target>
    
  • Создайте файл ivysettings.xml так же, как и раньше, но удалите атрибуты имени пользователя и пароля.

Затем вы можете использовать разрешения вашей операционной системы, чтобы убедиться, что файл maven.repo.properties правильно скрыт от всех, кроме вас (или вашей реализации автоматической сборки).

person Fred Drake    schedule 04.11.2012

Образец ivysettings.xml в ответе Марка О'Коннора должен выглядеть следующим образом:

<ivysettings>
  <property name="repo.host" value="default.mycompany.com" override="false"/>
  <property name="repo.realm" value="Sonatype Nexus Repository Manager" override="false"/>
  <property name="repo.user" value="deployment"  override="false"/>
  <property name="repo.pass" value="deployment123"  override="false"/>          

  <credentials host="${repo.host}" realm="${repo.realm}" username="${repo.user}" passwd="${repo.pass}"/>

  ..
</ivysettings>

Это означает, что имена свойств не должны быть окружены ${...} (мне потребовалось довольно много времени, чтобы выяснить, почему это не удалось, но теперь я знаю, как отлаживать доступ к плющу - используйте commons- httpclient-3.0, установите для всех подробностей и т. д.)

person Remigius Stalder    schedule 27.11.2014

В дополнение к ответу Марка О'Коннора вы можете скрыть пароль от своей повседневной работы и от посторонних глаз ваших коллег по работе, поместив эти свойства либо в файл antrc или в среду переменные, используемые ant. Обратите внимание, что они не очень безопасны в любом месте.

person A.H.    schedule 21.09.2011
comment
Если бы я был действительно параноиком по поводу сохранения пароля в открытом виде, я бы написал задачу ANT, которая считывает зашифрованную копию из файла свойств. См. jasypt.org/encrypting-configuration.html. - person Mark O'Connor; 22.09.2011