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身份验证说明相关推荐

  1. ASP.NET MVC 4 (十三) 基于表单的身份验证

    在前面的章节中我们知道可以在MVC应用程序中使用[Authorize]特性来限制用户对某些网址(控制器/控制器方法)的访问,但这都是在对用户认证之后,而用户的认证则依然是使用ASP.NET平台的认证机 ...

  2. Facebook 与 Google 正在主导在线身份验证市场

    OpenID 公司 JanRain 的一项研究发现,用户在第三方网站进行身份验证时,最喜欢使用 Google 和 Facebook 的身份验证服务.Facebook 的验证服务 在媒体, 零售,技术等 ...

  3. 远程连接windows出现身份验证错误,提示由于CredSSP加密Oracle修正解决方案

    本机操作系统(OS版本:10.0.17134) 远程计算机操作系统(OS版本:6.3.9600) 远程连接的时候报错"出现身份验证错误,要求的函数不受支持.远程计算机:xxx 这可能是由于C ...

  4. 【WEB API项目实战干货系列】- API登录与身份验证(三)

    上一篇: [WEB API项目实战干货系列]- 接口文档与在线测试(二) 这篇我们主要来介绍我们如何在API项目中完成API的登录及身份认证. 所以这篇会分为两部分, 登录API, API身份验证. ...

  5. 技术图文:如何利用BigOne的API制作自动化交易系统 -- 身份验证

    背景 最近,自己在技术精进方向上有所犹豫,是往"网络渗透"的方向走呢?还是往"量化交易"的方向走? 如果选择精进"网络渗透",就需要学习各种 ...

  6. 公开课 | 旷视科技产品总监:计算机视觉如何赋能身份验证场景

    "刷脸"曾一度是人们互相调侃时的用语,如今早已深深地融入我们的生活.从可以人脸解锁的手机,到公司上下班的人脸识别打卡机,甚至最近有消息称北京地铁有望近期实现"刷脸&quo ...

  7. 利用IPSec实现网络安全之三(身份验证和加密数据)

    作者:许本新 在上两篇中我们一起讨论了关于利用IPsec实现禁用协议和端口的相关知识,其实IPsec真正能够让用户感觉到安全放心的功能并不局限于此,IPsec的功能是相当的强大,今天我们就继续来讨论如 ...

  8. 网络访问:本地账号的共享和安全模式设置身份验证后自动更改其他验证的处理方法 ...

    网络访问:本地账号的共享和安全模式 设置成为"仅来宾-本地用户以来宾身份验证"后自动更改成"经典:本地用户以自己的身份验证"的处理方法 我们为何要修改网络访问: ...

  9. Asp.net 身份验证、授权概述

    [本周]如约而至;时间是争取来的,这回的[本周]是把若干零碎的时间利用起来成文的,完成对Asp.net身份验证.访问授权等内容的梳理,可能漏掉的东西会比较多,漏掉的还是希望大家来补充.顺便说一下上次[ ...

最新文章

  1. 文件不能断点 webstorm_详解python使用金山词霸的翻译功能(调试工具断点的使用)...
  2. Entity Framework
  3. 导入Scrapy 项目报错:no module named scrapy
  4. 与nlp相关的模型概览
  5. PHP学习总结(函数、数组、字符串)
  6. 简单易学的深度学习算法:Wide Deep Learning
  7. 【结论】游戏(jzoj 5536)
  8. 六一特辑丨“我的礼物我开发”这群小朋友在用新的方式对话未来
  9. 微服务学习之Eureka注册中心集群环境构建【Hoxton.SR1版】
  10. vue系列之vue cli 3引入ts
  11. Bing Maps进阶系列二:使用GeocodeService进行地理位置检索
  12. Atitit.Atiposter 发帖机 信息发布器 v7 q516
  13. conda安装hanlp报错“找不到JAVA,请安装JAVA8”
  14. RGB HSV CMYK LAB颜色空间
  15. 三维游戏开发实战--狙击僵尸(unity开发)
  16. docker学习(四) 配置阿里云镜像加速器
  17. 基于JAVA保险公司风险测评管理系统计算机毕业设计源码+系统+lw文档+部署
  18. web前端期末大作业 ~我的家乡-绿城之都html+css+javascript旅游网页设计实例
  19. 配置电脑使Wireshark能抓到有VLAN标签的报文
  20. 基本的ubunutu命令以及代码环境配置

热门文章

  1. 【结论】棋盘(jzoj 2297)
  2. 【高精】Gift(jzoj(gz) 1763)
  3. [XSY] 分割(dfs树)
  4. Spark SQL(二)之DataSet操作
  5. JS document.execCommand实现复制功能
  6. 成为更优秀的程序员:退后一步看问题
  7. 从 Linux 源码看 Socket 的阻塞和非阻塞
  8. 小程序如何将wx.request里的数据传出去
  9. 【填坑】博客搬家造成的博客重复问题
  10. vue中如何在地图中标点…