需要独立的Java程序,便于使用KERBEROS身份验证将文件上传到Sharepoint。
我们有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 Auth的API: spnego-r7.jar
连接: 以下代码我用于连接和文件下载,这是完美的工作。
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");
}
文件读取/下载:
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文件夹。我搜索了很多论坛几个小时但没有获得文件上传的确切代码。您对此的建议非常感谢。
提前致谢。
答案 0 :(得分:0)
经过10天的研究和搜索很多博客后,我找到了解决问题的方法。我希望这可以帮助有需要的人:
上传多个文件到SHAREPOINT(KERBEROS AUTHENTICated):
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();
}
}