平常工做中,有時候須要用代碼去操做gitlab
或者github
實現自動化部署,持續集成,持續部署等功能,本文就 Java 操做 git 相關的權限驗證進行實踐總結.java
使用的工具爲eclipse
的jgit
,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();
複製代碼
若是用戶名密碼沒問題,驗證就能夠經過了.框架
上面展現的是http
類型的倉庫,若是地址是 git
類型的,就要使用公鑰私鑰
進行驗證.好比git@gitlab.xxxx.com:arch/aabb.git
dom
known_hosts
進行驗證這也是默認的形式. ssh 驗證須要先建立一個JschConfigSessionFactory
,而後在這個對象中進行權限的配置,若是不配置,就默認使用系統的私鑰和 known_hosts
.這段邏輯在JschConfigSessionFactory
的createDefaultJSch
方法中,感興趣的同窗能夠自行查看源碼.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
,而且addIdentity
和setKnownHosts
都要使用內存中的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;
}
}
};
}
複製代碼
總之,工具並不難,本文主要涉及到公鑰私鑰驗證的原理相關,搞懂了原理,進行操做就不難了.