我正在尝试设计一个在本地服务器上运行的 Java 应用程序,该应用程序管理对存储在 Windows Azure 中的 blob 的访问权限。云存储资源由多个移动应用程序(也用 Java 编写)使用,这些应用程序需要对托管在云中的单个 blob 容器进行读取访问,有时还需要临时写入访问权限。我正在使用Microsoft Open Technologies 的 Windows Azure Plugin for Eclipse with Java。
我的问题是:如何(或是否)可以使 Azure 中的容器级存储访问策略 在到期时恢复为较早的存储策略 (READ),而不是“无访问”。“
MSDN 文章:Creating a Shared Access Signature in Java提供了一个良好的开端,但它还没有说明如何使用容器级存储策略来管理 Java 的共享访问策略。我正在学习 Java 和 SAS,因为我找不到类似于Azure Blob 的访问控制的Java 代码示例,所以我在下面包含了一小段 Java 代码来演示我的问题。
服务器应用程序检索用于连接到 Azure 存储的专用存储连接字符串。获取云存储帐户并创建云 blob 客户端。获取对容器的引用并在容器不存在时创建它。(请注意,容器名称必须小写。)然后它会下载容器的当前权限。(一个容器最多可以保存五个容器级存储访问策略。)
例如,假设有两个存储访问策略,名为“baxter”和“heath”,控制容器级别的权限,并且当容器的存储访问策略之前保存时,这两个策略都设置为 READ(仅) . 这些具有读取权限的初始策略将在几个月后到期。分配给“heath”或“baxter”策略的移动应用程序然后开始通过类似于以下的 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
根据需要,服务器应用程序可以将移动应用程序的子集提升为 READ 和 WRITE 权限,而无需发出新字符串。它可以通过修改与容器一起保存的“baxter”策略来实现。控件的“粒度”处于策略级别,策略更新使分配给“baxter”策略的所有移动应用程序都可以写入(或覆盖)容器中的 blob。分配给“健康”策略的移动应用程序继续拥有读取(仅)权限。以类似的方式,服务器应用程序可以撤销分配给特定策略的应用程序对容器的所有访问权限。
在更改策略之前,服务器应用程序确保已关闭对容器的公共访问。它将当前时间指定为开始时间,并将访问的到期时间指定为开始时间后一小时。它为新策略设置 READ 和 WRITE 权限。最后,现有的“baxter”策略被新策略覆盖。
generateSharedAccessSignature 方法可以获取“baxter”和“heath”策略的共享访问签名 (SAS)。更改保存在策略中的权限不应该改变 SAS,并且使用上述 uri 字符串的应用程序应该在指定的到期时间之前工作。
但是,一旦达到过期时间,“baxter”字符串将失去对容器的所有权限,包括 READ 和 WRITE。但这不是我想要发生的。我需要分配给“baxter”策略的移动应用程序的权限才能恢复为 READ(仅限)。因为具有 WRITE 访问权限的 SAS 字符串允许任何人写入资源,最佳实践是保持开始时间和过期时间尽量短,不超过一个小时。对于我的特定应用程序,将权限设置为更长的时间是可以接受的。
我的问题是:如何(或是否)可以使用 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");
}