JGit Authentication JGit验证机制

2023-10-27

验证机制在JGit中大部分与本地git相同。普遍使用SSH协议和HTTP(S)协议和他们所支持的验证方法。
这篇文章总结了如何使用JGit的验证API去安全连接远程GIT库。
虽然在下面的例子中使用的是CloneCommand方法,但是它能实现的方法可以应用到所有用于连接远程仓库的类,例如FetchCommand,PushCommand,LsRemoteCommand等等。所有这些命令都有一个相同的基本类-TransportCommand,它能提供我们所实例的所有方法。

HTTP(s) -https://example.com/repo.git

通过HTTP和HTTPS的验证方式很直接。一个继承CredentialsProvider类用于返回命令所需要的认证凭证。用于某个命令的CredentialsProvider类可以被setCredentialsProvider()方法指定。

例如,下面的代码通过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 with Public Key - ssh://user@example.com/repo.git

JGit委托抽象的SSHSessionFactory去创建销毁SSH连接。为了使用SSH的公钥认证,必须指定一个session Factory类。
通过 setTransportConfigCallback(),可以指定一个TransportConfigCallback 接口去拦截连接进程。它有一个单独的方法-configure(),在一个连接建立后被调用。它会传输一个传输类型的参数用来在本地和远程库之间拷贝对象。对于每个协议都有一个确切的传输子类来处理该协议的细节。

如下所示,回调可以用在配置正确的传输实例之前投入使用。

SshSessionFactory sshSessionFactory = new JschConfigSessionFactory() {
  @Override
  protected void configure( Host host, Session session ) {
    // do nothing
  }
};
CloneCommand cloneCommand = Git.cloneRepository();
cloneCommand.setURI( "ssh://user@example.com/repo.git" );
cloneCommand.setTransportConfigCallback( new TransportConfigCallback() {
  @Override
  public void configure( Transport transport ) {
    SshTransport sshTransport = ( SshTransport )transport;
    sshTransport.setSshSessionFactory( sshSessionFactory );
  }
} );

JGit 提供了一个抽象的JSchConfigSessionFactory 可以使用JSch去建立SSH连接并且要求configure()要被覆盖。因为在最简单的例子中并没有任何东西区需要去配置,上方的例子中提供了一个空的方法为了编译通过。JSchConfig SessionFactory与OpenSSH最兼容,因为继承了原始Git使用的SSH实现。她加载了在用户.ssh目录中默认的路径(identity,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;

}

在这个例子中添加了一个用户自定义位置的私钥。如果你查看了JSchJavaDoc,你会发现进一步重载的addIdentity()方法。
为了完整起见,我应该提到还有一个 global sessionFactory。它可以通过SSHSessionFactory去获取和更改,如果没有为命令配置特定的SessionFactory,则用作默认值。但是我建议避免使用它,除了使编写隔离测试更为困难外,可能还有一些代码不在你的控制之中,改变了它。

SSH with Password - ssh://user@example.com/repo.git

通过公钥使用SSH,一个SshSessionFctory 必须指定使用密保连接SSH。但是在这种情况下,session Factory的configure()方法要有一个配置。

SshSessionFactory sshSessionFactory = new JschConfigSessionFactory() {
  @Override
  protected 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() {
  @Override
  public void configure( Transport transport ) {
    SshTransport sshTransport = ( SshTransport )transport;
    sshTransport.setSshSessionFactory( sshSessionFactory );
  }
} );

一个 Jsch session代表了到服务器的连接。第四行设置了此次会话的密码。其余代码与用于通过SSH连接到公钥认证的代码相同。

使用哪一种验证方法?

一些在这里讨论到的验证方法也可以组合使用。例如,在尝试通过带有公用密钥的SSH连接到远程存储库时设置凭据提供程序不会受到影响。 然而,你通常想知道什么Transport将被用于给定的仓库URL。

为了确定这些,可以使用TransportProtocol的canHandle()方法。 如果协议可以处理给定的URL,则返回true,否则返回false。 所有已注册的TransportProtocols的列表可以从Transport.getTransportProtocols()获取。 一旦知道协议,就可以选择适当的认证方法。

github 验证方式

GitHub支持各种协议和认证方法,但肯定不是所有可能方法的组合。 例如,尝试使用SSH进行密码身份验证是常见的错误。 但是不支持此组合 - 只有使用公钥的SSH可以。

GitHUb提供的协议列表中指出了什么是支持的,什么是不支持的。总结如下:

  • Plain Git(e.g. git://github.com/user/repo.git): 传输未加密,并且服务器没有进行验证。
  • HTTPS(e.g. https://github.com/user/repo.git): 到处都在使用。使用验证密码推送,但允许匿名抓取和克隆。
  • SSH((e.g. ssh://git@github.com:user/repo.git): 使用公钥认证,也用于提取和克隆。

总结 JGit Authentication

虽然我发现验证机制在JGit API中有点广泛散布,但是他们能完成任务。这里给出的方案希望为您提供在JGit中认证连接所需的基础知识,隐藏API的复杂性可以被看作是编写干净的代码的练习!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JGit Authentication JGit验证机制 的相关文章

随机推荐

  • IPsec协议过程

    版权声明 如有需要 可供转载 但请注明出处 https blog csdn net City of skey article details 86618784 目录 1 ipsec协议简介 2 IPSec工作模式 2 1 传输模式 2 2
  • 三星S5P6818之UBOOT网络配置

    三星S5P6818之UBOOT网络配置 使用友善提供的固件烧写到SD卡发现UBOOT并不能联网 于是研究了UBOOT源码 并调通了网络 以下步骤亲测可用 前言 这个适合友善nanopi3系列的开发板 M3 Fire3 T3等 或者其他使用
  • Python不平衡数据处理库imblearn安装和使用

    一般直接pip安装即可 安装不成功可能是因为 没有安装imblearn需要的Python模块 对应安装即可 pip install U imbalanced learn imblearn中的过采样方法 Over sampling metho
  • VMware 安装、移除Ubuntu系统

    目录 前言 安装虚拟机 1 新建虚拟机 2 进入向导 3 选择系统镜像 4 添加系统设置 用户名主机名密码 lt 实际没啥用 在系统安装过程中才设置的 gt 5 设置虚拟机名称 存放位置 6 磁盘容量 7 设置虚拟机硬件配置 8 自定义硬件
  • vue框架

    一 vue是什么 官方解释 vue是一套用于构建用户界面的渐进式框架 vue是一个js框架 提供了一套开发规则 按照这个开发规则可提高开发效率 补充 渐进式意思是 vue js本身功能局限 一旦配合其他的工具可以增强其能力 vue rout
  • Linux离线安装NTP服务,无外网环境下配置本地时间同步

    1 常用命令 rpm qa grep ntp 查询已安装的ntp版本信息等 rpm e nodeps ntp 4 2 6p5 29 el7 centos 2 x86 64 卸载 systemctl status ntpd 查询ntp服务状态
  • es打分机制

    基于Lucene的倒排索引算法
  • 【python数据挖掘课程】二十.KNN最近邻分类算法分析详解及平衡秤TXT数据集读取

    这是 Python数据挖掘课程 系列文章 也是我这学期上课的部分内容及书籍的一个案例 本文主要讲述KNN最近邻分类算法 简单实现分析平衡秤数据集 希望这篇文章对大家有所帮助 同时提供些思路 内容包括 1 KNN算法基础原理知识 2 最近邻分
  • 如何手动运行一个容器【一】

    作者 行云创新 周朋 每个刚涉足容器的人都会对容器的实现有所困惑 容器是如何实现的 是如何复用宿主机的资源 并且实现资源隔离的 下面会用shell创建一个容器 为大家展示一个容器的创建过程 1 创建镜像 我们一般用 docker pull
  • 宏定义的#和##

    宏定义中一个 表示右侧的符号转化为字符串 比如 define STR x x QString s STR 3 编译ok s值为 3 之前在看QT源码时 发现了下面的宏定义 define QLOCATION 0 FILE QT STRINGI
  • Typora + Gitee 配置图床_图片自动上传教程

    一 创建 Gitee 仓库 进入 Gitee 官网 注册一个属于自己的账号 点击创建仓库并且设置为开源 一定要是开源的public 只有这样你的图片才能被别人访问到 二 设置私人令牌 进入个人设置 gt 选择私人令牌进行创建 gt 设置自己
  • 华为od机考真题-HJ6-质数因子(简单)

    while 1 try num int input c 2 while c lt num 0 5 if num c 0 print c end
  • C++ Primer 学习笔记十五 —— 面向对象编程

    记录笔记原则 1 用简单易懂的语言叙述自己的理解 避免照搬原文 2 用实例说明 避免空洞 3 多做总结和横向对比 避免片面 面向对象三个基本概念 抽象 继承 动态绑定 继承使我们简化了类的定义 动态绑定使我们简化了接口的实现 使得所有继承层
  • 探究java IO之AutoCloseable,Closeable和Flushable接口

    http blog csdn net caiwenfeng for 23 article details 41862225 有3个接口对于流类相当重要 其中两个接口是Closeable和Flushable 它们是在java io包中定义的
  • BQ40Z50/BQ4050/BQ40Z80 等 BQ40xxx 系列电量计外围电路设计指导

    TI 电量计在消费和工业市场电池产品广泛应用 本文围绕电量计的功能逐一介绍电量计供电和 采样 对外交互 电池保护 电池均衡等外围电路设计 以帮助大家优化电量计电路设计 提高 开发效率 FAE 壹伍柒 陆陆贰陆 柒捌贰伍 1 电量计外围电路框
  • GPIO 8种工作模式

    GPIO 是什么 GPIO全称General Purpose Input Output 即通用输入 输出 其实GPIO的本质就是芯片的一个引脚 通常在ARM中所有的I O都是通用的 不过由于每个开发板上都会设计不同的外围电路 这就造成GPI
  • QT——操作数据库03

    目录标题 一 安装数据库 二 连接数据库 一 在项目的pro文件中增加一行代码 二 连接sqlite 三 封装连接数据库操作 三 增删查改例子 一 安装数据库 一般使用mysql或者sqlite mysql安装教程 sqlite安装教程 1
  • 多线程顺序打印的5种解法

    多线程同步的方式有许多 有传统的synchronized锁 还可以使用lock锁 下面列举多线程顺序打印的5种解法 算作对线程同步的一个总结 文章目录 经典面试题 多种解法 使用 Lock 使用 wait notify 使用 Lock Co
  • Win10添加开机自动运行软件三种方法(亲测可用)

    Win10管理开机启动项的方法相信大家已经非常熟悉 msconfig命令各系统都通用 那么很多用户发觉Win10和Win7 XP等系统不同 没有启动文件夹 那么我们怎么添加开机启动项呢 如晨软件或程序没有开机启动设置的话 是的 在Win10
  • JGit Authentication JGit验证机制

    验证机制在JGit中大部分与本地git相同 普遍使用SSH协议和HTTP S 协议和他们所支持的验证方法 这篇文章总结了如何使用JGit的验证API去安全连接远程GIT库 虽然在下面的例子中使用的是CloneCommand方法 但是它能实现