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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338911.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

未发现oracle(tm)客户端和网络组件_SpringColud Eureka的服务注册与发现

一、Eureka简介本文中所有代码都会上传到git上,请放心浏览 项目git地址:https://github.com/839022478/Spring-Cloud在传统应用中,组件之间的调用,通过有规范的约束的接口来实现,从而实现不同模块间良好的协作。但是被…

mysql global index_Oracle中addsplit partition对globallocal index的影响

生产库中某些大表的分区异常,需要对现有表进行在线操作,以添加丢失分区,因为是生产库,还是谨慎点好,今天有空,针对addspli生产库中某些大表的分区异常,需要对现有表进行在线操作,以添…

sap寄售退货单_多个退货单

sap寄售退货单我曾经听说过,过去人们一直在努力使方法具有单个出口点。 我知道这是一种过时的方法,从未认为它特别值得注意。 但是最近我与一些仍坚持该想法的开发人员联系(最后一次是在这里 ),这让我开始思考。 因此…

课堂经验值管理小程序_微信小程序怎么管理门店?

微信门店小程序是一种不用注册下载就能使用的购物平台,近年来很是流行,而且它操作简单,能让用户快速找到自己需要的产品,然后进行购买,深得用户喜爱,有用户的地方就会有商家,商家想拥有自己的微…

C语言 | 直接插入排序

解题思路:直接插入排序是一种最简单的排序方法,其基本操作是将一条记录插入到已排好的有序表中,从而得到一个新的、记录数量增1的有序表。C语言源代码演示:#include//头文件 int main()//主函数 {void insort(int post[],int n)…

mysql+after+commit_Spring事务aftercommit原理及实践

来道题CREATE TABLE goods (id bigint(20) NOT NULL AUTO_INCREMENT,good_id varchar(20) DEFAULT NULL,num int(11) DEFAULT NULL,PRIMARY KEY (id),KEY goods_good_id_index (good_id)) ENGINEInnoDB DEFAULT CHARSETutf8mb4 COLLATEutf8mb4_0900_ai_ciClass.forName("c…

序列化和反序列化的概念_序列化的概念

序列化和反序列化的概念讨论了为什么Optional不可序列化以及如何处理(即将推出)之后,让我们仔细看看序列化。 总览 这篇文章介绍了序列化的一些关键概念。 它尝试精简地执行此操作,而不会涉及太多细节,包括将建议降至…

python自动解析json_Python语言解析JSON详解

本文主要向大家介绍了Python语言解析JSON详解,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助。 JSON 函数使用 JSON 函数需要导入 json 库:import json。函数 描述json.dumps 将 Python 对象编码成 JSON 字符串json.loads 将已…

C语言必学的12个排序算法:基数排序

# 基本思想基数排序(radix sort),同样时一种非比较的内部排序算法,主要基于多关键字排序的思想进行排序,它将单个关键字按照基数分成“多个关键字”进行排序。例如整数789是一个关键字,可以按照十进制位划分多关键字(十…

有没有code能改xml内容_Spring源码解析-applicationContext.xml加载和bean的注册

applicationContext文件加载和bean注册流程​ Spring对于从事Java开发的boy来说,再熟悉不过了,对于我们这个牛逼的框架的介绍就不在这里复述了,Spring这个大杂烩,怎么去使用怎么去配置,各种百度谷歌都能查到很多大牛教…

C语言数据类型转换

首先变量的数据类型是可以转换的。转换的方法有两种,一种是自动转换,另一种是强制转换。自动转换即当不同类型的数据进行混合运算时,编译系统将按照一定的规则自动完成。而强制类型转换是由程序员通过编程强制转换数据的类型。自动转换的规则…

jdk 9和jdk8_JDK 9 –给圣诞老人的信?

jdk 9和jdk8众所周知,冬天(尤其是圣诞节前的时间)是做梦的合适时机,希望有一个梦想似乎可以触及的时刻。 当孩子们和大人在纸上或在他们对圣诞老人的虚构或真实信件中写下自己的梦想时,希望他们的梦想将成为现实。 这很…

java 类持久化_Java 持久化之 -- IO 全面整理(看了绝不后悔)

目录:一、java io 概述什么是IO?IO包括输入流和输出流,输入流指的是将数据以字符或者字节形式读取到内存 分为字符输入流和字符输入流输入流指的是从内存读取到外界 ,分为字符输入流和字节输出流Java IO即Java 输入输出系统。不管…

idea 找不到或无法加载主类_解决IDEA中Groovy项目no Groovy library is defined的问题

实验环境IDEA2019.1.2Groovy-2.5.8错误重现新建了一个Groovy工程,指定了groovy版本,如图新建了一个简单的Groovy Class,运行,出现如下错误错误的尝试(以下是试错过程,并不能解决问题,读者可以不要跟着操作&…

C语言标识符、关键字和注释

这一节主要讲解C语言中的几个基本概念。标识符定义变量时,我们使用了诸如“a”“abc”“mn123”这样的名字,它们都是程序员自己起的,一般能够表达出变量的作用,这叫做标识符(Identifier)。标识符就是程序员…

java与java ee_Java EE 8怎么了?

java与java eeJava EE 8的工作进展顺利。 是时候赶上了! 无需费力就可以潜入… 不要忘记Java EE 7….. 围绕三个重要主题 HTML 5对齐–用于WebSocket的Java API(JSR 356),JSON处理(JSR 353),JA…

java 类.class_面试官:Java反射是什么?我回答不上来!

一.概念反射就是把Java的各种成分映射成相应的Java类。Class类的构造方法是private,由JVM创建。反射是java语言的一个特性,它允程序在运行时(注意不是编译的时候)来进行自我检查并且对内部的成员进行操作。例如它允许一个java的类获取他所有的成员变量和…

巧解C语言运算符的优先级和结合性

本篇文章我们从一个例子入手讲解,请看下面的代码:#include int main(){ int a 16, b 4, c 2; int d a b * c; int e a / b * c; printf( "d%d, e%d\n", d, e); return 0; }运行结果:d24, e81) 对于表达式a b * c&#xff0…

jms mdb_MDB!= JMS,反之亦然

jms mdb基本 消息驱动Bean(又称为MDB)只是另一个EJB,例如无状态,有状态或单例。 使用MessageDriven批注指定。 MDB用于异步消息处理 它们与无状态EJB 相似 ,因为它们都是由EJB容器池化的 但是,它们与无状…

java interestops_Java Channel.setInterestOps方法代码示例

import org.jboss.netty.channel.Channel; //导入方法依赖的package包/类protected void doConnect() throws Throwable {long start System.currentTimeMillis();ChannelFuture future bootstrap.connect(getConnectAddress());try{boolean ret future.awaitUninterruptibl…