jgit_JGit身份验证说明
jgit
JGit中的身份驗證與本地Git大致相同。 支持SSH和HTTP(S)等常用協議及其身份驗證方法。 本文總結了如何使用JGit身份驗證API安全地訪問遠程Git存儲庫。
盡管本文中的示例使用CloneCommand,但是可以將所描述的技術應用于連接到遠程存儲庫的所有類,例如FetchCommand,PushCommand,LsRemoteCommand等。所有這些命令都有一個公共基類-TransportCommand-提供了所討論的方法這里。
HTTP(S)– https://example.com/repo.git
通過HTTP和HTTPS進行身份驗證非常簡單。 當命令請求身份驗證憑據時,將使用CredentialsProvider的實現返回身份驗證憑據。 可以通過setCredentialsProvider()指定用于特定命令的CredentialsProvider。
例如,以下代碼通過HTTPS克隆存儲庫,并使用用戶名和密碼進行身份驗證。
CloneCommand cloneCommand = Git.cloneRepository(); cloneCommand.setURI( "https://example.com/repo.git" ); cloneCommand.setCredentialsProvider( new UsernamePasswordCredentialsProvider( "user", "password" ) );UsernamePasswordCredentialsProvider是JGit隨附的CredentialsProvider的實現,并使用給定的用戶名和密碼進行身份驗證。
另外,JGit(3.5版和更高版本)也可以從用戶的.netrc文件中讀取憑據。 NetRCCredentialsProvider使用文件中的第一個機器條目進行身份驗證。
盡管不建議通過不安全的連接發送憑據,但是所描述的方法也適用于純HTTP,例如http://example.com/repo.git。
帶有公鑰的SSH – ssh://user@example.com/repo.git
JGit委托創建和銷毀與抽象SshSessionFactory的SSH連接。 要將公共密鑰身份驗證用于SSH連接,必須為執行的命令指定這樣的會話工廠。
使用setTransportConfigCallback(),可以指定TransportConfigCallback接口以攔截連接過程。 建立連接之前,將調用唯一的方法configure()。 傳遞給它一個傳輸類型的參數,該參數將用于在本地和遠程存儲庫之間復制對象。 對于每個協議,都有一個不同的Transport子類來處理該協議的各個詳細信息。
如下所示,該回調可用于在使用前立即配置Transport實例:
SshSessionFactory sshSessionFactory = new JschConfigSessionFactory() {@Overrideprotected void configure( Host host, Session session ) {// do nothing} }; CloneCommand cloneCommand = Git.cloneRepository(); cloneCommand.setURI( "ssh://user@example.com/repo.git" ); cloneCommand.setTransportConfigCallback( new TransportConfigCallback() {@Overridepublic void configure( Transport transport ) {SshTransport sshTransport = ( SshTransport )transport;sshTransport.setSshSessionFactory( sshSessionFactory );} } );JGit提供了一個抽象的JSchConfigSessionFactory,它使用JSch建立SSH連接,并要求覆蓋它的configure()。 因為在最簡單的情況下沒有任何要配置的內容,所以上面的示例只是覆蓋了使代碼編譯的方法。
JSchConfigSessionFactory大多數與本機Git使用的SSH實現OpenSSH兼容。 它從用戶的.ssh目錄中的默認主機(身份,id_rsa和id_dsa)的默認位置加載已知主機和私鑰。
如果您的私鑰文件的名稱不同或位于其他位置,則建議覆蓋createDefaultJSch()。 調用基本方法后,可以像這樣添加自定義私鑰:
@Override protected JSch createDefaultJSch( FS fs ) throws JSchException {JSch defaultJSch = super.createDefaultJSch( fs );defaultJSch.addIdentity( "/path/to/private_key" )return defaultJSch; }在此示例中,添加了來自自定義文件位置的私鑰。 如果您查看JSch JavaDoc ,將會發現更多重載的addIdentity()方法。
為了完整起見,我應該提到還有一個全球會話工廠。 可以通過SshSessionFactory.get / setInstance()獲取和更改它,并且如果沒有為命令配置特定的shSessionFactory,它將用作默認值。 但是,我建議不要使用它。 除了使編寫獨立的測試變得更加困難之外,您的控件之外可能還有一些代碼會更改全局會話工廠。
SSH和密碼– ssh://user@example.com/repo.git
與通過公用密鑰使用SSH一樣,必須指定SshSessionFactory以使用受密碼保護的SSH連接。 但是這次,會話工廠的configure()方法是有目的的。
SshSessionFactory sshSessionFactory = new JschConfigSessionFactory() {@Overrideprotected void configure( Host host, Session session ) {session.setPassword( "password" );} } );CloneCommand cloneCommand = Git.cloneRepository(); cloneCommand.setURI( "ssh://user@example.com/repo.git" ); cloneCommand.setTransportConfigCallback( new TransportConfigCallback() {@Overridepublic void configure( Transport transport ) {SshTransport sshTransport = ( SshTransport )transport;sshTransport.setSshSessionFactory( sshSessionFactory );} } );JSch會話表示與SSH服務器的連接,在第4行中,設置了當前會話的密碼。 其余代碼與用于通過SSH與公共密鑰身份驗證進行連接的代碼相同。
使用哪種身份驗證方法?
此處討論的某些身份驗證方法也可以組合使用。 例如,在嘗試通過帶有公共密鑰的SSH連接到遠程存儲庫時設置憑據提供者不會有任何危害。 但是,您通常希望事先知道給定的存儲庫URL將使用哪種傳輸。
為了確定這一點,可以使用TransportProtocol的canHandle()方法。 如果協議可以處理給定的URL,則返回true,否則返回false。 可以從Transport.getTransportProtocols()獲得所有已注冊TransportProtocol的列表。 一旦知道了協議,就可以選擇適當的身份驗證方法。
驗證@ GitHub
GitHub支持多種協議和身份驗證方法,但肯定不是所有可能的組合。 例如,一個常見的錯誤是嘗試將SSH與密碼驗證一起使用。 但是不支持此組合-僅支持帶公鑰的SSH。
GitHub提供的協議的比較列出了支持的內容和不支持的內容。 總結一下,有:
- Plain Git(例如git://github.com/user/repo.git):傳輸未加密,服務器未通過驗證。
- HTTPS(例如https://github.com/user/repo.git):實際上可在任何地方使用。 使用密碼身份驗證進行推送,但允許匿名獲取和克隆。
- SSH(例如ssh://git@github.com:user / repo.git):使用公鑰身份驗證,也用于獲取和克隆。
結束JGit身份驗證
雖然我發現身份驗證功能在JGit API上散布了很多,但它們可以完成任務。 此處給出的食譜有望為您提供必要的基礎知識,以驗證JGit中的連接,并且隱藏API的復雜性可以視為練習干凈代碼的練習!
如果您有困難或問題,請隨時發表評論或向友好而樂于助人的JGit社區尋求幫助。
翻譯自: https://www.javacodegeeks.com/2014/12/jgit-authentication-explained.html
jgit
總結
以上是生活随笔為你收集整理的jgit_JGit身份验证说明的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 9个最佳未来主义标志以及如何在2022年
- 下一篇: sap寄售退货单_多个退货单