首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用kerberos身份验证将文件上载到sharepoint的java http客户端

使用kerberos身份验证将文件上载到sharepoint的java http客户端
EN

Stack Overflow用户
提问于 2013-09-12 00:34:44
回答 1查看 2.6K关注 0票数 1

需要独立的Java程序,方便上传文件到Sharepoint使用KERBEROS身份验证。

我们有sharepoint服务器,它升级到2010版本,并配置了Kerberos身份验证。早期的sharepoint版本使用NTLM身份验证,我使用javaq客户端程序从本地系统上传文件。由于sharepoint升级了Kerberos身份验证,因此我需要修改当前NTLM版本的java程序以使用Kerberos。我得到了身份验证和连接的代码片段,它工作得很好。我可以通过java程序读取Sharepoint URL并下载特定的文件。现在我正在尝试将文件上传到Sharepoint,但没有获得用于此目的所需的java类和jar文件。

我使用SPNEGO API设置了Kerberos配置以连接sharepoint。

会议文件: krb5.conf login.conf

用于Kerberos身份验证的API : spnego-r7.jar

连接性:下面是我用来连接和下载文件的代码,它工作得很好。

代码语言:javascript
复制
spnego = new SpnegoHttpURLConnection("spnego-client", <<sharepoint_user>>, <<sharepoint_password>>); 

//New Lines added to omit SSL Handshake exception 
TrustManager[] trustAllCerts = new TrustManager[]{ 
new X509TrustManager() { 
public java.security.cert.X509Certificate[] getAcceptedIssuers(){ 
return null; 
} 
public void checkClientTrusted(java.security.cert.X509Certific ate[] certs, String authType){ 
//No need to implement. 
} 
public void checkServerTrusted(java.security.cert.X509Certific ate[] certs, String authType){ 
//No need to implement. 
} 
} 
}; 
SSLContext sc = SSLContext.getInstance("SSL"); 
sc.init(null, trustAllCerts, new java.security.SecureRandom()); 
HttpsURLConnection.setDefaultSSLSocketFactory(sc.g etSocketFactory()); 
spnego.connect(new URL(spLocation)); 
System.out.println("spnego.getResponseCode():: "+spnego.getResponseCode()); 
if(spnego.getResponseCode() >= 200) { 
log.debug("Authentication Successful"); 
} 

文件读取/下载:

代码语言:javascript
复制
java.io.BufferedInputStream in = new java.io.BufferedInputStream( spnego.getInputStream()); 
java.io.FileOutputStream fos = new java.io.FileOutputStream(outputFile); 
java.io.BufferedOutputStream bout = new BufferedOutputStream(fos,1024); 
byte[] data = new byte[1024]; 
int x=0; 
System.out.println("4" + outputFile.length()); 
while((x=in.read(data,0,1024))>=0) { 
bout.write(data,0,x); 
} 
bout.close(); 
in.close(); 

你能告诉我如何使用java代码上传文件到Sharepoint文件夹吗?我搜索了许多论坛几个小时,但没有得到文件上传的确切代码。非常感谢您在这方面的建议。

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2013-09-23 02:13:34

经过10天的研究和许多博客的搜索,我终于找到了我的问题的解决方案。我希望这能帮助有需要的人:

将多个文件上载到SHAREPOINT (KERBEROS AUTHENTICated):

代码语言:javascript
复制
    System.setProperty("java.security.krb5.conf", workareaFolder+"/"+props.getProperty("kerberos.conf.file"));
    System.setProperty( "java.security.auth.login.config", workareaFolder+"/"+props.getProperty("jass.conf.file"));
    System.setProperty( "javax.security.auth.useSubjectCredsOnly", "false");           

    krb5MechOid    = new Oid("1.2.840.113554.1.2.2");
    spnegoMechOid  = new Oid("1.3.6.1.5.5.2");

      shost= targetSPN.toLowerCase();
      if (shost.startsWith("http/") || shost.startsWith("cifs/") )  {
          shost = shost.substring(5);
      }  
      else  {
          log.debug("Entered invalid SPN.  Must begin with HTTP/ or CIFS/");
          System.exit(-1);
      }
      this.checkSPNHostname(shost);                     

    //login to the KDC using JAAS login module
    this.subject = login(username, password);

    log.debug(this.subject);

    SSLContext sslContext = SSLContext.getInstance("SSL");

    // set up a TrustManager that trusts everything
    sslContext.init(null, new TrustManager[] { new X509TrustManager() {
                public X509Certificate[] getAcceptedIssuers() {
                        return null;
                }
                public void checkClientTrusted(X509Certificate[] certs,
                                String authType) {
                }
                public void checkServerTrusted(X509Certificate[] certs,
                                String authType) {
                }
    } }, new SecureRandom());

    Scheme httpScheme80 = new  Scheme("http", 80,  PlainSocketFactory.getSocketFactory());
    SSLSocketFactory sf = new SSLSocketFactory(sslContext,SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
    Scheme httpsScheme = new  Scheme("https", 443, sf);

    SchemeRegistry schemeRegistry = new SchemeRegistry();
    schemeRegistry.register(httpsScheme);
    schemeRegistry.register(httpScheme80);

    // Create Connection Manager instance for use by Httpclient
    cm = new SingleClientConnManager(schemeRegistry);
    HttpParams params = new BasicHttpParams();
    params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);

    httpclient = new DefaultHttpClient(cm,params);
    httpclient.setRedirectStrategy(new DefaultRedirectStrategy());

    File[] listOfFiles = folder.listFiles(new FileFilter() {
                                                public boolean accept(File f) {
                                                    if (f.isFile()) {
                                                        return true;
                                                    }
                                                    return false;
                                                }
                                            });
    String[] url = new String[listOfFiles.length];
    String spTargetFolder = new String();

    totalFilesInReportsFolder = listOfFiles.length;

    for (int i = 0; i < totalFilesInReportsFolder; i++) {
        uploadFileName = listOfFiles[i].getName();
        log.info("\nFile: "+uploadFileName);

        spTargetFolder = this.getSPFolder(uploadFileName);
        spDestinationFolderURL = sharedDocumentsRoot + instanceFolder + "/" + spTargetFolder + "/" + uploadFileName;
        //log.info("Destination URL : " + spDestinationFolderURL);

        httpPut = new HttpPut(new URI(sharedDocumentsRoot + instanceFolder + "/" + spTargetFolder + "/" + uploadFileName));
        httpPut.getParams().setParameter("http.protocol.handle-redirects",true);
        InputStreamEntity inputStreamEntity = new InputStreamEntity(new FileInputStream(listOfFiles[i]), listOfFiles[i].length());
        httpPut.setEntity(inputStreamEntity);
        // Get the service ticket for targetSPN and set it in HttpPut Authorization header
        this.serviceTicket= initiateSecurityContext( targetSPN );
        encodedBytes  = org.apache.commons.codec.binary.Base64.encodeBase64(this.serviceTicket);
        encoded =   new String(encodedBytes);
        httpPut.addHeader("Authorization", "Negotiate " + encoded);

        httpResponse = null;

        try {
             log.info("Uploading File... ");
             log.debug("Executing httpPut request: " + httpPut.getRequestLine());           
             httpResponse = httpclient.execute(httpPut);
             log.debug("After Post - Status code:" +httpResponse.getStatusLine().getStatusCode());
             BufferedReader reader = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent(), "UTF-8"));
             StringBuilder s = new StringBuilder();
             String sResponse; 
             while ((sResponse = reader.readLine()) != null) {
                 s = s.append(sResponse);
             }


             if (httpResponse.getStatusLine() != null && httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                 log.info("Response Code received: "+ httpResponse.getStatusLine() +" [200 - CREATE / OVERWRITE]");
                 log.info("File Sucessfully uploaded to Sharepoint location: "+spDestinationFolderURL );
                 uploadSuccessCount++;
             } else {
                 log.error("Error while uploading file to sharepoint");
                 if (httpResponse.getStatusLine() != null && httpResponse.getStatusLine().getStatusCode() != HttpStatus.SC_CREATED){
                     log.error("Response code: "+httpResponse.getStatusLine().getStatusCode());
                     log.error("Response Text:" + s);
                 }
                 uploadFailCount++;
             }

             log.debug("----------------------------------------");
             log.debug("Response StatusLine: "+ httpResponse.getStatusLine());
             log.debug("----------------------------------------");
             log.debug("Return Code : " + httpResponse.getStatusLine().getStatusCode());
             log.debug("----------------------------------------");

        } catch (Exception exp) {
            log.error("Exception while uploading report \""+uploadFileName+"\" to Share point="+exp);
            exp.printStackTrace();
        }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18746659

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档