婚车租赁网站怎样做,网址导航网站建站,制作动画的软件app,微信网站建设流程jgitJGit中的身份验证与本地Git大致相同。 支持SSH和HTTP#xff08;S#xff09;等常用协议及其身份验证方法。 本文总结了如何使用JGit身份验证API安全地访问远程Git存储库。 尽管本文中的示例使用CloneCommand#xff0c;但是可以将所描述的技术应用于连接到远程存储库的… jgit JGit中的身份验证与本地Git大致相同。 支持SSH和HTTPS等常用协议及其身份验证方法。 本文总结了如何使用JGit身份验证API安全地访问远程Git存储库。 尽管本文中的示例使用CloneCommand但是可以将所描述的技术应用于连接到远程存储库的所有类例如FetchCommandPushCommandLsRemoteCommand等。所有这些命令都有一个公共基类-TransportCommand-提供了所讨论的方法这里。 HTTPS– 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的实现并使用给定的用户名和密码进行身份验证。 另外JGit3.5版和更高版本也可以从用户的.netrc文件中读取凭据。 NetRCCredentialsProvider使用文件中的第一个机器条目进行身份验证。 尽管不建议通过不安全的连接发送凭据但是所描述的方法也适用于纯HTTP例如http://example.com/repo.git。 带有公钥的SSH – ssh//userexample.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://userexample.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//userexample.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://userexample.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//gitgithub.comuser / repo.git使用公钥身份验证也用于获取和克隆。 结束JGit身份验证 虽然我发现身份验证功能在JGit API上散布了很多但它们可以完成任务。 此处给出的食谱有望为您提供必要的基础知识以验证JGit中的连接并且隐藏API的复杂性可以视为练习干净代码的练习 如果您有困难或问题请随时发表评论或向友好而乐于助人的JGit社区寻求帮助。 翻译自: https://www.javacodegeeks.com/2014/12/jgit-authentication-explained.htmljgit