Windows Azure に格納されている BLOB へのアクセス許可を管理する、ローカル サーバーで実行される Java アプリケーションを設計しようとしています。クラウド ストレージ リソースは、クラウドでホストされている単一の BLOB コンテナーへの読み取りアクセスと、場合によっては一時的な書き込みアクセスを必要とする複数のモバイル アプリケーション (これも Java で記述されています) によって使用されます。Microsoft Open Technologies の Windows Azure Plugin for Eclipse with Java with Java を使用しています。
私の質問は、Azure に格納されたコンテナー レベルのアクセス ポリシー を、有効期限が切れたときに "アクセスなし" ではなく、以前に格納されたポリシー (読み取り) に戻す方法 (または場合)です。「
MSDN の記事: Java での共有アクセス署名の作成は良い出発点となりますが、コンテナー レベルの格納されたポリシーを使用して Java で共有アクセス ポリシーを管理する方法についてはまだあまり言及されていません。私は Java と SAS を学んでいますが、Access Control for Azure Blobsに似た Java コードの例を見つけることができなかったため、質問を示すために以下に短い Java コードを含めました。
サーバー アプリケーションは、Azure ストレージへの接続に使用されるプライベート ストレージ接続文字列を取得します。クラウド ストレージ アカウントを取得し、クラウド BLOB クライアントを作成します。コンテナーへの参照を取得し、コンテナーがまだ存在しない場合はコンテナーを作成します。(コンテナー名は小文字でなければならないことに注意してください。) 次に、コンテナーの現在のアクセス許可をダウンロードします。(1 つのコンテナーに対して、最大 5 つのコンテナー レベルの格納されたアクセス ポリシーを保存できます。)
たとえば、コンテナー レベルのアクセス許可を制御する "baxter" と "heath" という名前の 2 つの保存されたアクセス ポリシーがあり、コンテナーの保存されたアクセス ポリシーが以前に保存されたときに両方のポリシーが READ (のみ) に設定されたとします。 . これらの初期ポリシーは、読み取り権限があり、数か月後に期限切れになるように設定されています。「ヒース」または「バクスター」ポリシーのいずれかに割り当てられたモバイル アプリケーションは、次のような uri 文字列を介して sascontainer6 に保存されている BLOB への読み取りアクセスから開始します。
http://grassy.blob.core.windows.net/sascontainer6/image4.jpg?sr=c&sv=2012-02-12&sig=5G7EOgiYYNEGmw2Y0T4IUgt%2FzTnmYpaxWfB5nEira08%3D&si=baxter
http://grassy.blob.core.windows.net/sascontainer6/image4.jpg?sr=c&sv=2012-02- 12&sig=llUoAg2PvFUfhO28ncrlheh2RRJdb7smQEX6nO8xoCk%3D&si=heath
必要に応じて、サーバー アプリケーションは、新しい文字列を発行することなく、モバイル アプリケーションのサブセットを読み取り権限と書き込み権限の両方に昇格させることができます。これは、コンテナに保存されている「baxter」ポリシーを変更することで実現できます。コントロールの「粒度」はポリシー レベルであり、ポリシーの更新により、「baxter」ポリシーに割り当てられたすべてのモバイル アプリケーションがコンテナーに BLOB を書き込む (または上書きする) ことができるようになります。「ヘルス」ポリシーに割り当てられたモバイル アプリケーションは続行します。同様に、サーバー アプリケーションは、特定のポリシーに割り当てられたアプリケーションのコンテナーへのすべてのアクセスを取り消すことができます。
ポリシーを変更する前に、サーバー アプリケーションはコンテナーへのパブリック アクセスがオフになっていることを確認します。現在時刻を開始時刻とし、開始時刻から 1 時間後にアクセスの有効期限を指定します。これにより、新しいポリシーに READ および WRITE の両方のアクセス許可が設定されます。最後に、既存の「baxter」ポリシーが新しいポリシーで上書きされます。
generateSharedAccessSignature メソッドは、「baxter」および「heath」ポリシーの共有アクセス署名 (SAS) を取得できます。ポリシーに保存されているアクセス許可を変更しても、SAS は変更されません。また、上記の uri 文字列を使用するアプリケーションは、指定された有効期限まで動作するはずです。
ただし、有効期限に達すると、「baxter」文字列はコンテナーに対するすべてのアクセス許可 (読み取りと書き込みの両方) を失います。しかし、これは私が望んでいることではありません。「baxter」ポリシーに割り当てられたモバイル アプリケーションが READ (のみ) に戻るためのアクセス許可が必要です。有効期限はできるだけ短く、1 時間以内にします。私の特定のアプリケーションでは、許可をより長い期間 READ に設定することは許容されます。
私の質問は、Azure のコンテナー レベルの共有アクセス ポリシーを使用して、トークン (つまり、上記の「baxter」文字列) を「アクセスなし」ではなく代替ポリシー (つまり、READ) に戻すことを許可する方法 (または場合) です。 .」</p>
public static void main(String[] args) throws InvalidKeyException, URISyntaxException, StorageException
{
Account creds = new Account();
final String storageConnectionString = creds.getstorageconnectionstring();
CloudStorageAccount storageAccount = CloudStorageAccount.parse(storageConnectionString);
CloudBlobClient blobClient = storageAccount.createCloudBlobClient();
CloudBlobContainer container = blobClient.getContainerReference("sascontainer6");
container.createIfNotExist();
BlobContainerPermissions containerPermissions = container.downloadPermissions();
containerPermissions.setPublicAccess(BlobContainerPublicAccessType.OFF);
SharedAccessBlobPolicy policy = new SharedAccessBlobPolicy();
GregorianCalendar calendar = new GregorianCalendar(TimeZone.getTimeZone("UTC"));
calendar.setTime(new Date());
policy.setSharedAccessStartTime(calendar.getTime());
calendar.add(Calendar.HOUR, 1);
policy.setSharedAccessExpiryTime(calendar.getTime());
policy.setPermissions(EnumSet.of(SharedAccessBlobPermissions.READ, SharedAccessBlobPermissions.WRITE));
containerPermissions.getSharedAccessPolicies().put("baxter", policy);
container.uploadPermissions(containerPermissions);
String sas = container.generateSharedAccessSignature(new SharedAccessBlobPolicy(),"baxter");
String sasex = container.generateSharedAccessSignature(new SharedAccessBlobPolicy(),"heath");
}