2013-08-19 35 views
0

在嘗試讓我的RESTful Web服務獲得Amazon S3身份驗證時,我的測試刷新了Verifier for S3 auth中的一個可能的錯誤。如果您指定的服務器機密中不存在的訪問密鑰,則AwsVerifier將引發NullPointerException,從而導致HTTP 500內部服務器錯誤。問題始於上線AwsVerifier.java 233:Restlet框架中的AwsVerifier中可能存在的錯誤

char[] userSecret = getLocalSecret(userId); 

如果用戶標識沒有在當地的祕密存在(即不在服務器祕密地圖存在的快捷鍵),則沒有相關的祕密,所以userSecret變爲空。當AwsVerifier調用第235行的getS3Signature()時:

String sigToCompare = AwsUtils.getS3Signature(request, userSecret); 

您將收到NullPointerException。這對我來說似乎是一個錯誤......任何人都同意/不同意?

回答

0

我相信這是一個錯誤。不過,我找到了解決這個問題的方法:只需要AwsVerifier的子類並覆蓋verify()方法。確保和代碼從超複製驗證()到子類,但更改如下:

public class NewAwsVerifier extends AwsVerifier { 
    public NewAwsVerifier(LocalVerifier wrappedVerifier) { 
     super(wrappedVerifier); 
    } 
    ... 
    @Override 
    public int verify(Request request, Response response) { 
    ... 
     char[] userSecret = getLocalSecret(userId); 
     if (userSecret == null) { 
      // If there is no userSecret for the given userId then the 
      // request probably specified a user that doesn't exist 
      // and using that userID in the getS3Signature call 
      // will result in a NullPointerException, so we intercept it here 
      return RESULT_INVALID; 
     } 
     char[] signature = getSecret(request, response); 
     String sigToCompare = AwsUtils.getS3Signature(request, userSecret); 
    ... 
    } 
} 

然後確保你使用這個新的驗證:

MapVerifier verifier = new MapVerifier(); 
NewAwsVerifier newVerifier = new NewAwsVerifier(verifier); 

// Get passwords from a more secure source (only here for illustration)! 
verifier.getLocalSecrets().put("accessKey", "secretKey".toCharArray()); 
auth.setVerifier(newVerifier); 

現在,如果你指定一個訪問密鑰不存在於服務器機密中,那麼將會優雅地拒絕訪問,而不是收到HTTP 500內部服務器錯誤。