Я пытаюсь создать приложение Java, работающее на локальном сервере, которое управляет разрешениями доступа к блокам, которые хранятся в Windows Azure. Ресурсы облачного хранилища используются несколькими мобильными приложениями (также написанными на Java), которым необходим доступ на чтение, а иногда и временный доступ на запись, к одному контейнеру blob, размещенному в облаке. Я использую Windows Azure Plugin for Eclipse with Java by Microsoft Open Technologies.Контроль доступа к контенту на уровне доступа с помощью Java
Мой вопрос: Как (или если) уровень контейнера stored access policies в Azure можно сделать для возврата к ранее сохраненной политике (READ) по истечении срока действия, а не к «без доступа». "
Статья MSDN: Creating a Shared Access Signature in Java обеспечивает хороший старт, но он пока не говорит о том, как использовать хранимые политики на уровне контейнера для управления политиками доступа общего доступа с Java. Я изучаю Java и SAS, и потому, что мне не удалось найти примеры кода Java, похожие на Access Control for Azure Blobs, я включил короткую часть кода Java ниже, чтобы продемонстрировать мой вопрос.
Серверное приложение извлекает строку подключения частного хранилища, используемую для подключения к хранилищу Azure. Получает учетную запись облачного хранилища и создает клиент облачного blob. Получает ссылку на контейнер и создает контейнер, если он еще не существует. (Обратите внимание, что имя контейнера должно быть в нижнем регистре.) Затем он загружает текущие разрешения для контейнера. (Для контейнера может быть сохранено до пяти сохраненных политик хранилища на уровне контейнера).
Например, есть две политики хранимого доступа с именем «baxter» и «heath», которые контролируют разрешения на уровне контейнера, и что обе политики были установлены в READ (только), когда сохраненные политики доступа контейнера были ранее сохранены. Эти первоначальные политики с разрешениями READ истекают через несколько месяцев. Мобильные приложения, назначенные либо «вереск» или политика «Бакстер», то начать с чтением-доступом к сгусткам, хранящимся в sascontainer6 через Ури строки, подобные:
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» писать (или перезаписывать) капли в контейнере. Мобильные приложения, назначенные политике «heath», продолжаются для получения разрешения READ (только). Аналогичным образом серверное приложение может отменить весь доступ к контейнеру для приложений, назначенных для определенной политики.
Перед изменением политики серверное приложение обеспечивает открытый доступ к контейнеру был отключен, он указывает текущее время как время начала и время истечения для доступа, которое составляет один час после начала. Он устанавливает разрешения READ и WRITE для новой политики. Наконец, существующая политика «baxter» переписывается новой политикой.
Метод generateSharedAccessSignature может получить подпись общего доступа (SAS) для политик «baxter» и «heath». Изменение разрешений, сохраненных в политике, не должно изменять SAS, а приложения, использующие вышеуказанные строки uri, должны работать до указанного времени истечения.
Однако, по достижении срока годности, строка «baxter» потеряет все разрешения для контейнера, как READ, так и WRITE. Но это не то, что я хочу. Мне нужны разрешения для мобильных приложений, назначенных для политики «baxter», чтобы вернуться к READ (только). Поскольку строка SAS с доступом WRITE позволяет кому-либо писать ресурс, наилучшей практикой является сохранение периода между временем начала и время истечения как можно короче, не более часа.Установка разрешений на READ для более длительных периодов приемлема для моего конкретного приложения.
Мой вопрос: как (или если) политики общего доступа на уровне контейнера в Azure могут использоваться, чтобы разрешить токен (т. Е. Строку «baxter», показанную выше) вернуться к альтернативной политике (например, READ) чем «без доступа».
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");
}
Спасибо за внимание и задумчивый ответ.Ваш ответ подтверждает то, с чем я столкнулся в своих тестах - URL-адрес, включающий истекший SAS (связанный с политикой или нет), перестает работать (без доступа) и не «отступает» на какие-либо разрешения вообще - даже не указанный уровень общего доступа. Клиенту нужен другой URL-адрес. Да, я пытаюсь реализовать управление на уровне контейнера, имея при этом минимальные URL-адреса. Как вы полагаете, я, вероятно, перейду с несколькими политиками контейнеров, чтобы при необходимости я мог повторно активировать/аннулировать строки URL. - Благодаря! –