これはバグだと思います。ただし、これを回避する方法を見つけました。AwsVerifier をサブクラス化し、verify() メソッドをオーバーライドするだけです。コードをスーパークラスの 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);
...
}
}
次に、この新しい Verifier を必ず使用してください。
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 内部サーバー エラーを受け取る代わりに、適切にアクセスが拒否されます。