使用 Java 操做 Git-驗證相關

背景

平常工做中,有時候須要用代碼去操做gitlab 或者github實現自動化部署,持續集成,持續部署等功能,本文就 Java 操做 git 相關的權限驗證進行實踐總結.java

工具

使用的工具爲eclipsejgit,pom爲目前最新版本.git

<!-- https://mvnrepository.com/artifact/org.eclipse.jgit/org.eclipse.jgit -->
    <dependency>
        <groupId>org.eclipse.jgit</groupId>
        <artifactId>org.eclipse.jgit</artifactId>
        <version>5.2.1.201812262042-r</version>
    </dependency>
複製代碼

權限驗證

固然要進行操做 gitlab,不管是檢測倉庫是否存在,或者 clone 代碼,切換分支等操做,都須要首先驗證權限,本文主要講解兩種驗證方式,用戶名密碼公鑰私鑰驗證.一下使用git ls-remote 來驗證github

用戶名密碼驗證

用戶名密碼驗證只能用於http類型的倉庫,實例以下:session

CredentialsProvider credentialsProvider = new UsernamePasswordCredentialsProvider("username","password");

Map<String, Ref> asMap = Git.lsRemoteRepository()
       .setRemote("http://gitlab.xxx.com/arch/aabb.git")
       .setCredentialsProvider(credentialsProvider)
       .callAsMap();
複製代碼

若是用戶名密碼沒問題,驗證就能夠經過了.框架

SSH驗證

上面展現的是http類型的倉庫,若是地址是 git類型的,就要使用公鑰私鑰進行驗證.好比git@gitlab.xxxx.com:arch/aabb.gitdom

利用主機上的私鑰和known_hosts進行驗證

這也是默認的形式. ssh 驗證須要先建立一個JschConfigSessionFactory,而後在這個對象中進行權限的配置,若是不配置,就默認使用系統的私鑰和 known_hosts.這段邏輯在JschConfigSessionFactorycreateDefaultJSch方法中,感興趣的同窗能夠自行查看源碼.eclipse

SshSessionFactory sshSessionFactory = new JschConfigSessionFactory() {
   @Override
   protected void configure(OpenSshConfig.Host host, Session session) {
   }
};

LsRemoteCommand command = Git.lsRemoteRepository();
command.setRemote("git@gitlab.xxxx.com:data/aabb.git");
command.setHeads(false);
// command 和 sshSessionFactory 關聯,進行驗證.
TransportConfigCallback callback = transport -> {
   SshTransport sshTransport = (SshTransport) transport;
   sshTransport.setSshSessionFactory(sshSessionFactory);
};
command.setTransportConfigCallback(callback);
Map<String, Ref> stringRefMap = command.callAsMap();
...
複製代碼

使用自定義的私鑰和known_hosts進行驗證.

若是你的代碼須要部署帶不一樣的機器上,而又不想依賴主機的配置,那麼能夠經過自定義配以讀取特定的文件,進行配置,使用以下,修改SshSessionFactory相關配置:ssh

SshSessionFactory sshSessionFactory = new JschConfigSessionFactory() {
    @Override
    protected void configure(OpenSshConfig.Host host, Session session) {
        //若是有密碼;
        //session.setPassword("123");
    }
    @Override
    protected JSch createDefaultJSch(FS fs) throws JSchException {
        JSch defaultJSch = new JSch();
        //私鑰文件的路徑,可放在項目目錄中
        defaultJSch.addIdentity(file);
        //git 倉庫域名對應的known_hosts文件,可放在項目目錄中
        defaultJSch.setKnownHosts(known_hosts);
        return defaultJSch;
    }
};
複製代碼

使用上面的例子進行驗證,若是配置正確,就能夠經過ssh的校驗了.ide

最佳實踐

實際編寫過程當中,會重複使用SshSessionFactory,而且addIdentitysetKnownHosts都要使用內存中的inputstream操做,避免框架在反查文件 file 的時候找不到文件(SpringBoot),代碼以下:工具

@PostConstruct
private void init() throws IOException {

    sshSessionFactory = new JschConfigSessionFactory() {
        @Override
        protected void configure(OpenSshConfig.Host host, Session session) {
        }

        @SneakyThrows
        @Override
        protected JSch createDefaultJSch(FS fs) throws JSchException {
            try (InputStream fileInputStream = Utils.loadAsInputStream("git/private.key");
                 InputStream knownHostInputStream = Utils.loadAsInputStream("git/known_hosts")) {
                JSch defaultJSch = new JSch();
                defaultJSch.addIdentity(Utils.getRandomString(), IOUtils.toByteArray(fileInputStream), null, null);
                defaultJSch.setKnownHosts(knownHostInputStream);
                return defaultJSch;
            }

        }
    };

}
複製代碼

後記

總之,工具並不難,本文主要涉及到公鑰私鑰驗證的原理相關,搞懂了原理,進行操做就不難了.

相關文章
相關標籤/搜索