Cette page vous a-t-elle été utile ?
Votre avis sur ce contenu est important. N'hésitez pas à nous faire part de vos commentaires.
Vous avez d'autres commentaires ?
1500 caractères restants
Exporter (0) Imprimer
Développer tout

Contrôle de l'accès aux conteneurs d'objets blob Azure avec Java

Mis à jour: mai 2015

Ce guide explique comment effectuer des tâches courantes à l'aide du service de stockage d'objets blob Azure. Les exemples sont écrits en Java, et utilisent le kit de développement logiciel (SDK) Azure pour Java. Les scénarios présentés incluent le chargement, la génération de listes, ainsi que le téléchargement et la suppression de conteneurs d'objets blob, d'objets blob et de métadonnées. Le contrôle d'accès est un aspect essentiel de l'utilisation en toute sécurité et de manière productive du stockage cloud dans vos applications Java. Les exemples sont donc regroupés par type de contrôle d'accès présenté : accès public, signatures d'accès partagé et stratégie d'accès stockée. Les exemples ont tous été compilés et exécutés en tant qu'applications Java dans Eclipse à l'aide de la Boîte à outils Azure pour Eclipse.

Après avoir exécuté les exemples relatifs à l'accès public décrits dans cette section, vous devriez être en mesure d'effectuer les tâches suivantes avec Java.

  • Créer une chaîne de connexion de compte de stockage pour votre compte de stockage Azure

  • Créer un conteneur d'objets blob dans votre compte de stockage

  • Ajuster l'accès public d'utilisateurs anonymes aux métadonnées du conteneur, au contenu d'objets blob et aux métadonnées d'objets blob

  • Ajouter des métadonnées à un conteneur d'objets blob dans votre compte de stockage

  • Charger un objet blob à partir de votre ordinateur dans un conteneur d'objets blob Azure

  • Ajouter des métadonnées à un objet blob dans votre compte de stockage

  • Lire des métadonnées de conteneur en tant qu'utilisateur anonyme

  • Répertorier tous les objets blob stockés dans un conteneur en tant qu'utilisateur anonyme

  • Lire les métadonnées d'objet blob en tant qu'utilisateur anonyme

  • Télécharger un objet blob sur votre ordinateur à partir d'un compte de stockage Azure, en tant qu'utilisateur anonyme

Votre application Java peut créer un conteneur d'objets blob dans Azure Storage. Elle peut également spécifier le niveau d'accès public en lecture pour les objets blob et les métadonnées enregistrés dans le conteneur. L'accès public est le niveau d'autorisation d'accès en lecture automatiquement octroyé à un utilisateur anonyme en possession de l'URL d'accès public pour le conteneur d'objets blob ou l'objet blob. Vous ne pouvez pas utiliser un accès public pour octroyer à des utilisateurs anonymes des autorisations d'accès en écriture au conteneur. Si devez octroyer une autorisation d'accès en écriture à des utilisateurs qui ne sont pas en possession de la clé de compte de votre compte de stockage Azure, vous devez leur fournir un jeton sous la forme d'une URL faisant référence à une signature d'accès partagé ou à une stratégie d'accès partagé.

Si l'accès public au conteneur d'objets blob n'est pas désactivé (privé), un utilisateur anonyme peut lire tous les objets blob figurant dans le conteneur à l'aide d'une URL d'accès public telle que la suivante.

http://contoso.blob.core.windows.net/container1/image2.jpg

Bien que l'accès public soit désactivé par défaut pour un nouveau conteneur d'objets blob, en cas d'activation de l'accès public, l'URL d'accès public octroie aux utilisateurs anonymes un accès en lecture au conteneur. N'essayez pas de permettre aux utilisateurs de lire un objet blob dans votre conteneur en activant l'accès public, car cela active l'accès public pour l'intégralité du conteneur. Un utilisateur connaissant l'URL d'accès public d'un objet blob peut être en mesure de deviner et construire des URL fonctionnelles pour d'autres objets blob du conteneur. L'accès public utilisé comme seul moyen de contrôle est donc une méthode faible pour contrôler l'accès aux conteneurs d'objets blob. Si vous devez exercer un contrôle renforcé sur l'accès aux métadonnées du contenu et du conteneur d'objets blob, vous devez associer le conteneur à une signature d'accès partagé ou à une stratégie d'accès partagé.

Pour créer un conteneur d'objets blob dans votre compte de stockage Azure, ou pour modifier le niveau d'accès public à un conteneur d'objets blob existant dans votre compte, vous avez besoin du nom et de la clé de votre compte de stockage Azure. Vous devez utiliser le nom et la clé du compte pour construire une chaîne de connexion de stockage. Votre application peut utiliser un code Java similaire à l'exemple suivant pour construire et renvoyer une chaîne de connexion de stockage. La même classe Account est utilisée pour tous les exemples de ce guide dans lesquels vous devez fournir la clé et le nom du compte de stockage Azure.

public class Account 
{
   private String storageConnectionString;
   public Account()
   {
      this.storageConnectionString =
         "DefaultEndpointsProtocol=http;" + 
         "AccountName=contoso;" + 
         "AccountKey=nPPnnnnPPPPb5nnPnnn5nn5nPnnPnn50P/nnPnPPnPn+PnPPnP/n2nnPPPPn
            Pn55555PPPPn/P5nnP5P+n5n==";
   }
   public String getstorageconnectionstring()
   {
      return storageConnectionString;
   }
} 

Avec cette chaîne de compte de stockage, votre application peut utiliser un code Java similaire au suivant pour créer un conteneur d'objets blob nommé container1 avec l'accès public désactivé (OFF). Si le conteneur container1 existe, l'exécution de ce code rétablit le niveau d'accès public à désactivé (OFF). Notez qu'un nom de conteneur doit être en minuscules.

public class MakeContainer
{
   public static void main(String[] args)
         throws InvalidKeyException, URISyntaxException, StorageException 
   {
      // Exposes the storage account’s secret key
      Account creds = new Account();
      final String storageConnectionString = creds.getstorageconnectionstring();
      CloudStorageAccount storageAccount =
            CloudStorageAccount.parse(storageConnectionString);
      CloudBlobClient blobClient = storageAccount.createCloudBlobClient();
      CloudBlobContainer container =
            blobClient.getContainerReference("container1");
      container.createIfNotExists();
      BlobContainerPermissions containerPermissions =
            new BlobContainerPermissions();
      // All anonymous public access to the container is OFF
      containerPermissions.setPublicAccess(BlobContainerPublicAccessType.OFF);
      container.uploadPermissions(containerPermissions);
      BlobContainerPublicAccessType access1 =
            containerPermissions.getPublicAccess();
      System.out.println("Public access to " + 
            container.getName() + 
            " is set to: " + access1);
   }
}

Avec la chaîne de compte de stockage, une application peut également écrire des métadonnées dans le conteneur sous la forme d'un objet HashMap<Chaîne, Chaîne>. Par exemple, le code Java suivant ajoute trois éléments aux métadonnées du conteneur container2.

public class AddMetadata
{
   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("container2");
      container.createIfNotExists();
      HashMap<String, String> meta = new HashMap<String, String>();
      meta.put("city", "San Francisco");
      meta.put("desc", "Photos");
      meta.put("date", "June 2012");
      container.setMetadata(meta);
      container.uploadMetadata();
      System.out.println("Container metadata was added to " + container.getName());
   }
}

L'accès public au conteneur container1 a été désactivé en définissant la valeur de la propriété publicAccess sur la constante appropriée (OFF) de l'énumération BlobContainerPublicAccessType. La valeur de la propriété publicAccess peut être l'une des trois constantes suivantes, qui spécifient le niveau d'accès public en lecture.

  • BLOB : le grand public peut lire le contenu et les métadonnées d'objets blob dans ce conteneur, mais ne peut pas lire les métadonnées de conteneur ou de liste les objets blob dans le conteneur.

  • CONTENEUR : le grand public peut lire contenu et les métadonnées d'objets blob et les métadonnées de conteneur et peut répertorier les objets blob dans le conteneur.

  • OFF : ne spécifie aucun accès public. Seul le propriétaire du compte peut lire les ressources dans ce conteneur.

Un accès public ne vous permet pas d'octroyer à des utilisateurs anonymes une autorisation d'accès en écriture. En revanche, un accès public vous permet d'octroyer à un utilisateur anonyme une autorisation d'accès en lecture au contenu d'objet blob, aux métadonnées d'objet blob et aux métadonnées de conteneur. Si l'accès public au conteneur container2 a été défini sur CONTAINER, le code Java suivant permet à un utilisateur anonyme de lire les métadonnées du conteneur. Notez que, pour lire les métadonnées du conteneur, vous devez appeler downloadAttributes() sur l'objet conteneur.

public class ReadMetadata
{
   public static void main(String[] args)
         throws InvalidKeyException, URISyntaxException, StorageException
   {
      //Get a reference to the blob container
      //This does not expose the storage account’s secret key
      URI baseuri = new URI("https://contoso.blob.core.windows.net/");
      CloudBlobClient blobclient = new CloudBlobClient(baseuri);
      CloudBlobContainer container = blobclient.getContainerReference("container2");
      container.createIfNotExists();
      //Must be called before reading metadata
      container.downloadAttributes();
      HashMap<String, String> meta = container.getMetadata();
      System.out.println(container.getName() + " contains this metadata." );
      System.out.println(meta.get("city"));
      System.out.println(meta.get("desc"));
      System.out.println(meta.get("date"));
   }
}

N'oubliez pas que l'accès public détermine l'accès en lecture public pour l'intégralité du conteneur. Dès lors, si votre application active un accès public pour autoriser la lecture d'un objet blob, cela peut autoriser le public à répertorier et à lire tous les objets blob figurant dans le conteneur. Par exemple, le code Java suivant charge l'objet blob image4.jpg dans le conteneur container1, et modifie le niveau d'accès public de OFF en CONTAINER. Enfin, le code ajoute des métadonnées à associer à l'objet blob image4.jpg. Le fichier image4.jpg est initialement stocké localement sur l'ordinateur du propriétaire du compte.

public class ChangeAccess
{
   public static void main(String[] args)
      throws InvalidKeyException, URISyntaxException,
      StorageException, FileNotFoundException, IOException
   {
      Account creds = new Account();
      final String storageConnectionString =
         creds.getstorageconnectionstring();
      CloudStorageAccount account =
         CloudStorageAccount.parse(storageConnectionString);
      CloudBlobClient serviceClient = account.createCloudBlobClient();
      CloudBlobContainer container =
         serviceClient.getContainerReference("container1");
      container.createIfNotExists();
      BlobContainerPermissions containerPermissions;
      containerPermissions = new BlobContainerPermissions();
      //Anonymous users can list blobs and read blobs and metadata
      containerPermissions.setPublicAccess(BlobContainerPublicAccessType.CONTAINER);
      container.uploadPermissions(containerPermissions);
      CloudBlockBlob blob = container.getBlockBlobReference("image4.jpg");
      //Local source file will be uploaded to blob-container in cloud
      File fileReference = new File ("c:\\myimages\\image4.jpg");
      blob.upload(new FileInputStream(fileReference), fileReference.length());
      BlobContainerPublicAccessType access1 =
         containerPermissions.getPublicAccess();
      System.out.println("Public access to "
         + container.getName() + " is set to: " + access1);
   }
}

Un accès public CONTAINER permet à des utilisateurs anonymes d'accéder à tous les objets blob figurant dans le conteneur, ainsi qu'à les répertorier. Le code suivant permet à un utilisateur anonyme de répertorier les objets blob.

public class EnableAnonymousList
{
   public static void main(String[] args)
      throws InvalidKeyException, URISyntaxException,
      StorageException, FileNotFoundException, IOException
   {
      URI baseuri = new URI("http://wingtiptoys.blob.core.windows.net");
      CloudBlobClient blobclient = new CloudBlobClient(baseuri);
      CloudBlobContainer container = blobclient.getContainerReference("container1");
      for (ListBlobItem blobItem : container.listBlobs())
      {
         System.out.println(blobItem.getUri());
      }
   }
}

L'accès public étant CONTAINER pour le conteneur container1, un utilisateur anonyme peut lire les métadonnées et le contenu de tous les objets blob qui y figurent à l'aide d'un code Java tel celui ci-après. Notez que, pour lire les métadonnées de l'objet blob, vous devez appeler downloadAttributes().

public class ReadBlobs
{
   public static void main(String[] args)
      throws InvalidKeyException, URISyntaxException,
      StorageException, FileNotFoundException, IOException
   {
      URI baseuri = new URI("http://wingtiptoys.blob.core.windows.net");
      CloudBlobClient blobclient = new CloudBlobClient(baseuri);
      CloudBlobContainer container = blobclient.getContainerReference("container1");
      String blobName = "image4.jpg";
      CloudBlockBlob blob = container.getBlockBlobReference(blobName);
      // Required to read metadata
      blob.downloadAttributes();
      HashMap<String, String> user = new HashMap<String, String>();
      user = blob.getMetadata();
      String name = (user.get("firstname") + " " + user.get("lastname"));
      String age = ("age: " + user.get("age"));
      String present = ("Presenting talk? " + user.get("presenter"));
      System.out.println(name);
      System.out.println(age);
      System.out.println(present);
      // Image in cloud blob container will be downloaded to local file
      String localFileName = "c:\\myoutputimages\\" + blobName;
      File fileTarget = new File(localFileName);
      blob.download(new FileOutputStream(fileTarget));
      System.out.println("The blob at:\n"  + baseuri +  "/" + container.getName()
         + "/" + blobName + "\nwas downloaded from the cloud to local file:\n"
         + localFileName);
   }  
}

Bien que le contrôle d'accès public de conteneurs d'objets blob soit relativement facile à utiliser, vous devez également implémenter des signatures ou des stratégies d'accès partagé si votre application Java doit effectuer les opérations suivantes.

  • Donner accès à des non-propriétaires sélectionnés du compte de stockage sans exposer l'accès à tous les utilisateurs anonymes.

  • Autoriser temporairement des non-propriétaires du compte de stockage à accéder en écriture ainsi qu'en lecture aux conteneurs d'objets blob.

  • Limiter l'accès par des non-propriétaires du compte de stockage à de courtes périodes spécifiées.

  • Accorder un accès temporaire à un conteneur, et pouvoir révoquer cet accès sans avoir à supprimer le conteneur ou à modifier la clé du compte de stockage.

Après avoir exécuté les exemples de la section relative aux signatures d'accès partagé, vous devriez être en mesure d'effectuer les tâches suivantes avec Java.

  • Générer une signature d'accès partagé (SAP) qui octroie à un ou plusieurs utilisateurs de celle-ci un accès temporaire au conteneur

  • Distribuer des autorisations d'accès distinctes à différents utilisateurs sans étendre l'accès à tous les utilisateurs anonymes

  • Étendre l'accès temporaire en lecture, écriture, répertoriage ou suppression à un conteneur d'objets blob, mais pas à d'autres

  • Accéder à un conteneur privé (accès public désactivé) sans avoir connaissance de la clé du compte de stockage Azure

  • Télécharger un objet blob à partir d'un conteneur d'objets blob privé à l'aide d'une SAP de base

  • Charger un objet blob vers un conteneur d'objets blob privé à l'aide d'une SAP de base

  • Répertorier ou supprimer tout objet blob dans un conteneur privé, à l'exception de tout autre

  • Lire et écrire des métadonnées de conteneur et d'objet blob

Une signature d'accès partagé (SAP) contient toutes les informations nécessaires pour octroyer à tout utilisateur un accès contrôlé aux objets blob enregistrés dans un conteneur d'objets blob Azure. Une SAP de base n'est pas associée à une stratégie d'accès partagé, et fournit un accès irrévocable à tout utilisateur en possession de la SAP pour une durée limitée. Une SAP de base a un délai d'expiration non extensible. Une fois qu'une SAP a été distribuée, il est impossible de l'annuler, et l'accès au conteneur peut uniquement être révoqué avant le délai d'expiration en modifiant la clé du compte de stockage Azure.

Une application en possession de la clé de stockage Azure peut générer une SAP de base pour contrôler l'accès à un conteneur d'objets blob enregistré dans le compte de stockage en spécifiant une ou plusieurs des constantes suivantes dans l'énumération SharedAccessBlobPermissions d'un objet SharedAccessBlobPolicy. Notez qu'une SAP contrôle l'accès au niveau du conteneur et donne le même accès à tous les objets blob figurant dans le conteneur

  • READ : lire le contenu, les propriétés, les métadonnées ou la liste rouge de tout objet blob figurant dans le conteneur. Utiliser un objet blob du conteneur comme source d'une opération de copie.

  • WRITE : créer ou écrire du contenu, des propriétés, des métadonnées ou une liste rouge pour tout objet blob figurant dans le conteneur. Créer un instantané ou louer l'objet blob. Redimensionner l'objet blob (objet blob de page uniquement). Remarque : Vous ne pouvez pas accorder d'autorisations de lecture ou d'écriture de propriétés ou de métadonnées de conteneur.

  • DELETE : supprimer tout objet blob figurant dans le conteneur. Remarque : vous ne pouvez pas accorder d'autorisations de suppression d'un conteneur entier.

  • LIST : répertorier les objets blob figurant dans le conteneur.

Par exemple, la chaîne suivante représente une SAP de base contenant toutes les informations nécessaires pour accéder au conteneur.

sp=rwdl&sr=c&sv=2012-02-12&se=2013-03-27T20%3A20%3A21Z&st=2013-03-27T19%3A20%3A21Z&sig=nn5PPPnnPPnPPnnPP%5PPPnnP55P5nnPP5nPn%5P5nnPPn5%5P

Vous pouvez ajouter des SAP à l'URL d'accès public pour l'objet blob en tant que paramètres de requête pour construire une URL de SAP. Étant donné que la SAP contient toutes les informations nécessaires, tout utilisateur en possession de cette URL a accès. Notez que, pour construire une URL fonctionnelle, un symbole de requête (?) est requis entre l'URL d'accès public et la SAP.

http://contoso.blob.core.windows.net/container1/image3.jpg?sp=rwdl&sr=c&sv=2012-02-12&se=2013-03-27T20%3A20%3A21Z&st=2013-03-27T19%3A20%3A21Z&sig=nn5PPPnnPPnPPnnPP%5PPPnnP55P5nnPP5nPn%5P5nnPPn5%5P

Une fois cette URL distribuée, il n'est pas possible de l'annuler ou de l'étendre au-delà de l'heure d'expiration. Elle peut donner à toute application qui l'obtient un accès en lecture, écriture, répertoriage et suppression aux objets blob figurant dans le conteneur. Elle cesse de fonctionner après l'heure d'expiration et ne peut pas être réactivée.

Le code Java suivant crée un conteneur d'objets blob nommé container1 si celui-ci n'existe pas. Il désactive (OFF) le niveau d'accès public de container1. Il génère une chaîne de SAP de base avec un intervalle de temps applicable de 1 heure. Vous pouvez spécifier un intervalle de temps plus long. La période d'applicabilité démarre immédiatement et expire une heure plus tard. Au cours de l'intervalle de temps applicable, tout utilisateur en possession de la SAP dispose d'autorisations d'accès en lecture (READ), écriture (WRITE), suppression (DELETE) et répertoriage (LIST) au conteneur. L'exécution de ce code une deuxième fois avant la première heure d'expiration ne révoque pas les autorisations fournies par la première SAP, et les URL basées sur l'ancienne SAP continuent de fonctionner. Après l'heure d'expiration, une URL ajoutée avec la SAP expirée ne fonctionne pas. En cas de réexécution après l'heure d'expiration, ce code génère une nouvelle SAP valide qui peut octroyer des autorisations pendant une heure supplémentaire, mais l'ancienne SAP n'est pas réactivée. L'accès d'un utilisateur anonyme au conteneur est toujours contrôlé par le niveau d'accès public spécifié.

public class BasicSAS
{
   public static void main(String[] args)
      throws InvalidKeyException, URISyntaxException, StorageException
   {
      // Account key required to create SAS
      Account creds = new Account();
      final String storageConnectionString = creds.getstorageconnectionstring();
      CloudStorageAccount storageAccount =
         CloudStorageAccount.parse(storageConnectionString);
      CloudBlobClient blobClient = storageAccount.createCloudBlobClient();
      CloudBlobContainer container = blobClient.getContainerReference("container1");
      container.createIfNotExists();
      SharedAccessBlobPolicy policy = new SharedAccessBlobPolicy();
      GregorianCalendar calendar =
         new GregorianCalendar(TimeZone.getTimeZone("UTC"));
      calendar.setTime(new Date());
      // Immediately applicable
      policy.setSharedAccessStartTime(calendar.getTime());
      // Applicable time span is 1 hour
      calendar.add(Calendar.HOUR, 1);
      policy.setSharedAccessExpiryTime(calendar.getTime());
      // SAS grants all access privileges
      policy.setPermissions(EnumSet.of(SharedAccessBlobPermissions.READ,
         SharedAccessBlobPermissions.WRITE, SharedAccessBlobPermissions.DELETE,
         SharedAccessBlobPermissions.LIST));
      BlobContainerPermissions containerPermissions =
         new BlobContainerPermissions();
      // Private blob-container with no access for anonymous users
      containerPermissions.setPublicAccess(BlobContainerPublicAccessType.OFF);
      container.uploadPermissions(containerPermissions);
      String sas = container.generateSharedAccessSignature(policy,null);
      System.out.println("The basic shared access signature :");
      System.out.println(sas);
   }
}

Au cours de l'intervalle d'une heure d'applicabilité de la SAP, une application en possession de l'URL de SAP pour le conteneur d'objets blob peut écrire un objet blob dans le conteneur container1 à l'aide d'un code Java similaire à celui ci-après. Rappelez-vous que des utilisateurs anonymes (accès public) ne peuvent pas recevoir d'autorisation d'accès en écriture aux conteneurs d'objets blob. Enfin, certaines informations sur l'auteur de l'image sont écrites en tant que métadonnées enregistrées avec l'objet blob. La SAP ne permet d'accéder en écriture aux métadonnées du conteneur.

Le code Java suivant permet à un utilisateur en possession de la SAP d'écrire un objet blob sans avoir connaissance de la clé du compte de stockage Azure.

public class SASBlober
{
   public static void main(String[] args)
      throws URISyntaxException, FileNotFoundException, StorageException, IOException
   {
      // This does not reveal the secret storage account key
      URI baseuri = new URI("http://wingtiptoys.blob.core.windows.net");
      CloudBlobClient blobclient = new CloudBlobClient(baseuri);
      MyUploadBlob("container1",
         "sp=rwdl&sr=c&sv=2012-02-12&se=2013-03-27T20%3A20%3A21Z&st=2013-03-27T19%3A20%3A21Z&sig=nn5PPPnnPPnPPnnPP%5PPPnnP55P5nnPP5nPn%5P5nnPPn5%5P",
         blobclient);
   }
   
   public static void MyUploadBlob(String containerName, String containerSAS,
      CloudBlobClient blobClient) throws URISyntaxException, StorageException,
      FileNotFoundException, IOException
   {
      //Uploads a local file to blob-container in cloud
      String blobName = "image3.jpg";
      String localFileName = "c:\\myimages\\image3.jpg";
      URI uri = new URI(blobClient.getEndpoint().toString() + "/" +
         containerName + "/" + blobName + "?" + containerSAS);
      CloudBlockBlob sasBlob = new CloudBlockBlob(uri, blobClient);
      HashMap<String, String> user = new HashMap<String, String>();
      user.put("firstname", "Joe");
      user.put("lastname", "Brown" );
      user.put("age", "28");
      user.put("presenter", "no");
      sasBlob.setMetadata(user);
      File fileReference = new File(localFileName);
      sasBlob.upload(new FileInputStream(fileReference), fileReference.length());
      System.out.println("The blob: " + blobName + " has been uploaded to:");
      System.out.println(uri);
   }
}

Étant donné que l'autorisation READ est incluse dans les autorisations associées à l'exemple de SAP, une application en possession de l'URL de SAP peut lire un objet blob dans le conteneur container1, puis écrire le contenu dans un fichier local à l'aide d'un code Java similaire à celui ci-après sans avoir connaissance de la clé du compte de stockage Azure. Enfin, le code lit et affiche les métadonnées stockées avec l'objet blob.

public class SASread
{
   public static void main(String[] args)
      throws URISyntaxException, FileNotFoundException, StorageException, IOException
   {
      URI baseuri = new URI("http://wingtiptoys.blob.core.windows.net");
      CloudBlobClient blobclient = new CloudBlobClient(baseuri);
      MyDownloadBlob("container1",
         "sp=rwdl&sr=c&sv=2012-02-12&se=2013-03-27T20%3A20%3A21Z&st=2013-03-27T19%3A20%3A21Z&sig=nn5PPPnnPPnPPnnPP%5PPPnnP55P5nnPP5nPn%5P5nnPPn5%5P",
         blobclient);
   }
   
   public static void MyDownloadBlob(String containerName, String containerSAS, CloudBlobClient blobClient)
      throws URISyntaxException, StorageException, FileNotFoundException, IOException
   {
      //Downloads blob in cloud to local file
      String blobName = "image3.jpg";
      String localFileName = "c:\\myoutputimages\\image3.jpg";
      URI uri = new URI(blobClient.getEndpoint().toString() + "/" +
         containerName + "/" + blobName + "?" + containerSAS);
      CloudBlockBlob sasBlob = new CloudBlockBlob(uri, blobClient);
      File fileTarget = new File(localFileName);
      sasBlob.download(new FileOutputStream(fileTarget));
      HashMap<String, String> user = new HashMap<String, String>();
      user = sasBlob.getMetadata();
      String name = (user.get("firstname") + " " + user.get("lastname"));
      String age = ("age: " + user.get("age"));
      String present = ("Presenting talk? " + user.get("presenter"));
      System.out.println(name);
      System.out.println(age);
      System.out.println(present);
      System.out.println("The blob at:\n"  + uri
         + "\nwas downloaded from the cloud to local file:\n" + localFileName);
   }
}

Rappelez-vous que des utilisateurs anonymes ne peuvent pas répertorier les objets blob figurant dans le conteneur container1 si l'accès public est défini sur OFF. Étant donné que l'autorisation LIST est incluse dans les autorisations associées à la SAP, un utilisateur en possession de l'URL de SAP peut utiliser le code Java suivant pour répertorier les objets blob figurant dans le conteneur sans avoir connaissance de la clé du compte de stockage Azure.

public class ListBlobs 
{
   public static void main(String[] args)
      throws URISyntaxException,StorageException
   {
      URI baseuri = new URI("http://wingtiptoys.blob.core.windows.net");
      CloudBlobClient serviceclient = new CloudBlobClient(baseuri);
      MyList("container1",
         "sp=rwdl&sr=c&sv=2012-02-12&se=2013-03-27T20%3A20%3A21Z&st=2013-03-27T19%3A20%3A21Z&sig=nn5PPPnnPPnPPnnPP%5PPPnnP55P5nnPP5nPn%5P5nnPPn5%5P",
         serviceclient);
   }
   
   public static void MyList(String containerName,
      String containerSAS, CloudBlobClient serviceClient)
      throws URISyntaxException, StorageException
   {
      URI uri = new URI(serviceClient.getEndpoint().toString() + "/"
         + containerName + "?" + containerSAS);
      CloudBlobContainer container = new CloudBlobContainer(uri, serviceClient);
      for (ListBlobItem blobItem : container.listBlobs())
      {
         System.out.println(blobItem.getUri());
      }
   }  
}

Étant donné que l'autorisation DELETE est incluse dans les autorisations associées à la SAP, un utilisateur en possession de l'URL de SAP peut supprimer des objets blob dans le conteneur container1. Notez que vous ne pouvez pas octroyer à un utilisateur l'autorisation de supprimer le conteneur d'objets blob du compte de stockage. Pendant la période d'applicabilité de la SAP, le code Java suivant supprime un objet blob du conteneur.

public class SASDelete
{
   public static void main(String[] args)
      throws URISyntaxException, FileNotFoundException, StorageException, IOException
   {
      URI baseuri = new URI("http://wingtiptoys.blob.core.windows.net");
      CloudBlobClient blobclient = new CloudBlobClient(baseuri);
      MyDeleteBlob("container1",
         "sp=rwdl&sr=c&sv=2012-02-12&se=2013-03-27T20%3A20%3A21Z&st=2013-03-27T19%3A20%3A21Z&sig=nn5PPPnnPPnPPnnPP%5PPPnnP55P5nnPP5nPn%5P5nnPPn5%5P",
         blobclient);
   }
   public static void MyDeleteBlob(String containerName,
      String containerSAS, CloudBlobClient serviceClient)
      throws URISyntaxException, FileNotFoundException, IOException, StorageException
   {
      String blobName = "image4.jpg";
      URI uri = new URI(serviceClient.getEndpoint().toString() + "/" +
         containerName + "/" + blobName + "?" + containerSAS);
      CloudBlockBlob sasBlob = new CloudBlockBlob(uri, serviceClient);
      try
      {
         sasBlob.delete();
         System.out.println(blobName + " was deleted");
      }
      catch (StorageException storageException)
      {
         System.out.println(storageException.getMessage());
         System.exit(-1);
      }
   } 
}

Suivez ces meilleures pratiques lors de l'utilisation de signatures d'accès partagé (SAP) pour vous assurer que l'accès est restreint autant que possible tant sur le plan des autorisations d'accès que sur celui de l'intervalle de temps applicable. N'oubliez pas que, si l'accès public permet simplement d'accéder en lecture aux conteneurs et aux objets blob, les signatures d'accès partagé peuvent octroyer un accès en écriture et en suppression à vos ressources basées dans le cloud. Si des utilisateurs indésirables entrent en possession de l'URL de SAP, cela peut entraîner la destruction de ressources stockées dans votre compte de stockage.

  • Les signatures d'accès partagé ne doivent jamais contenir plus de droits qu'il n'est nécessaire. Autrement dit, si l'autorisation d'accès en lecture (READ) est suffisante, ne distribuez pas de SAP accordant également des privilèges de répertoriage (LIST), d'écriture (WRITE) et de suppression (DELETE).

  • Si une signature d'accès partagé contient des droits qui ne sont pas destinés au grand public, distribuez-la aux utilisateurs souhaités via le protocole HTTPS, car les requêtes HTTP divulguent l'URL complète de la SAP sur Internet.

  • Une SAP de base ne pouvant pas être révoquée, exécutez toujours l'étape supplémentaire pour générer une SAP associée à une stratégie d'accès stockée au niveau du conteneur. Vous pouvez révoquer une SAP créée avec une stratégie d'accès stockée avant l'heure d'expiration sans devoir modifier votre clé de compte Azure.

Après avoir exécuté les exemples présentés dans la section relative à la stratégie d'accès stockée, vous pouvez effectuer les tâches suivantes avec Java.

  • Générer une SAP de stratégie donnant accès au conteneur, qui peut être révoquée, étendue ou mise à jour

  • Annuler toutes les URL de conteneur après distribution sans modifier votre clé de stockage Azure

  • Réactiver une SAP de stratégie après son heure d'expiration

  • Révoquer ou mettre à jour des URL basées sur une SAP de stratégie à tout moment, et modifier le comportement des anciennes URL

  • Créer plusieurs stratégies pour un seul conteneur

  • Utiliser une SAP de stratégie et une SAP de base pour une flexibilité maximale du contrôle d'accès au niveau du conteneur

Votre application peut avoir un meilleur contrôle d'accès au niveau du conteneur en utilisant une SAP de stratégie au lieu d'une SAP de base. Une SAP de base a une applicabilité limitée dans le temps, qui ne peut pas être étendue ou annulée une fois qu'elle a été distribuée. Une SAP de stratégie peut être spécifiée pour rester valide pendant une période quelconque, et peut être annulée ou modifiée à tout moment. Étant donné que la stratégie est enregistrée avec le conteneur, et non avec l'URL de SAP, il est possible de la mettre à jour sans avoir à modifier la chaîne de SAP (ou les URL distribuées aux utilisateurs). Lors de la mise à jour de la stratégie pour le conteneur, toutes les anciennes URL construites à l'aide de la SAP de stratégie sont réactivées avec la stratégie mise à jour.

Le code Java suivant crée un conteneur d'objets blob container1 avec une stratégie nommée heath si ce conteneur n'existe pas. Ce code désactive (OFF) le niveau d'accès public du conteneur container1. Il génère une chaîne de SAP de stratégie avec un intervalle de temps applicable de 3 heures. La période d'applicabilité démarre immédiatement et expire trois heures plus tard. Au cours de l'intervalle de temps applicable, tout utilisateur en possession de la SAP de stratégie dispose d'autorisations d'accès en lecture (READ), écriture (WRITE), suppression (DELETE) et répertoriage (LIST) au conteneur. Après le délai d'expiration, une URL ajoutée avec la SAP qui a expiré ne fonctionne pas tant qu'elle n'est pas réactivée par le propriétaire du compte de stockage à l'aide de la clé de celui-ci. L'accès d'un utilisateur anonyme au conteneur est toujours contrôlé par le niveau d'accès public.

Si le conteneur container1 existe, ce code ajoute la stratégie heath au conteneur. Un conteneur d'objets blob ne peut pas avoir plus de quatre stratégies d'accès stockées simultanées. Un code montrant comment affecter plusieurs stratégies d'accès stockées à un conteneur est présenté plus loin. Étant donné qu'une SAP de base enregistre toutes ses informations dans la chaîne de SAP, et qu'une SAP de stratégie enregistre ses informations avec le conteneur, les droits d'accès des URL de SAP de base toujours d'application ne sont pas affectés par l'ajout ou la modification d'une SAP de stratégie. Vous ne pouvez pas révoquer une SAP de base déjà distribuée en créant une SAP de stratégie pour le conteneur.

Pour révoquer et annuler toutes les URL distribuées avec la SAP de stratégie heath, réexécutez le code avec une heure d'expiration antérieure à l'heure de début. Par exemple, pour révoquer la SAP de stratégie, et annuler toutes les autorisations associées aux URL distribuées aux utilisateurs, opérez la substitution suivante.

policy.setSharedAccessStartTime(calendar.getTime());
calendar.add(Calendar.HOUR, -1); //Expiration time is earlier than start time
policy.setSharedAccessExpiryTime(calendar.getTime());

Vous pouvez également révoquer une SAP de stratégie après la distribution, en supprimant ou remplaçant la stratégie dans le conteneur. Si le code est réexécuté sur le conteneur container1, avec le nom de la stratégie modifié de heath en baxter, la nouvelle stratégie baxter remplace l'ancienne stratégie heath. Cela annule toutes les URL déjà distribuées avec une SAP de stratégie heath. Toutefois, les anciennes URL associées à la stratégie heath peuvent être réactivées en exécutant le code une troisième fois avec la stratégie modifiée de baxter en heath (ce qui annule toutes les URL baxter).

Si le code Java suivant est réexécuté avant ou après le délai d'expiration de la SAP de stratégie, cela renouvelle la SAP de stratégie heath pour 3 heures, et réactive les URL de stratégie healh révoquées ou expirées qui ont été distribuées. Vous pouvez également mettre à jour les autorisations (par exemple, ajouter ou supprimer des autorisations d'accès) à tout moment en modifiant et en réexécutant ce code.

public class PolicySAS
{
   public static void main(String[] args)
      throws InvalidKeyException, URISyntaxException, StorageException
   {
      // Account key required to create SAS
      Account creds = new Account();
      final String storageConnectionString = creds.getstorageconnectionstring();
      CloudStorageAccount storageAccount =
         CloudStorageAccount.parse(storageConnectionString);
      CloudBlobClient blobClient = storageAccount.createCloudBlobClient();
      CloudBlobContainer container = blobClient.getContainerReference("container1");
      container.createIfNotExists();
      SharedAccessBlobPolicy policy = new SharedAccessBlobPolicy();
      GregorianCalendar calendar =
         new GregorianCalendar(TimeZone.getTimeZone("UTC"));
      calendar.setTime(new Date());
      // Immediately applicable
      policy.setSharedAccessStartTime(calendar.getTime());
      // Applicable time-span is 3 hours
      calendar.add(Calendar.HOUR, 3);
      policy.setSharedAccessExpiryTime(calendar.getTime());
      policy.setPermissions(EnumSet.of(SharedAccessBlobPermissions.READ,
            SharedAccessBlobPermissions.WRITE,
            SharedAccessBlobPermissions.DELETE,
            SharedAccessBlobPermissions.LIST));
      BlobContainerPermissions containerPermissions = new BlobContainerPermissions();
      //Private container with no access for anonymous users
      containerPermissions.setPublicAccess(BlobContainerPublicAccessType.OFF);
      //Name the shared access policy: heath
      containerPermissions.getSharedAccessPolicies().put("heath", policy);
      container.uploadPermissions(containerPermissions);
      //Generate the policy SAS string for heath access
      String sas = container.generateSharedAccessSignature(
         new SharedAccessBlobPolicy(),"heath");
      System.out.println("The stored access policy signature:");
      System.out.println(sas);
   } 
}

La SAP de stratégie peut être ajoutée à l'URL de base pour l'objet blob, en tant que paramètres de requête pour construire une URL décorée avec les autorisations contrôlées, de la même façon qu'une SAP de base. Notez que la SAP générée par le code ci-dessus n'inclut pas le symbole de requête (?) requis entre l'URL de base et la SAP de stratégie. Par exemple, la chaîne de l'objet blob image3.jpg serait similaire à celle ci-dessous.

http://contoso.blob.core.windows.net/container1/image3.jpg?sr=c&sv=2012-02-12&sig=nnPn5P5nnPPnn5Pnn5PPnPPPnPPP5PPPPPP%5PPnn5PPn%55&si=heath

Les applications peuvent utiliser la SAP de stratégie exactement comme une SAP de base. Pour utiliser la stratégie d'accès partagé afin de contrôler l'accès au niveau du conteneur, remplacez simplement la chaîne de SAP de stratégie par la chaîne de SAP de base dans les exemples précédents. Les applications disposant d'une SAP de stratégie peuvent effectuer des opérations de lecture, d'écriture, de répertoriage ou de suppression sur des objets blob figurant dans le conteneur sans avoir connaissance de la clé du compte de stockage Microsoft Azure.

Un modèle utile pour implémenter un contrôle d'accès flexible au niveau du conteneur consiste à spécifier quatre stratégies d'accès stockées pour le conteneur, qui octroient respectivement un accès en lecture, écriture, répertoriage et suppression. Cette approche laisse toujours la possibilité de distribuer si nécessaire des URL de SAP de base à courte durée de vie pour le conteneur. Les URL de SAP de base peuvent donner des autorisations d'accès indépendantes de la stratégie. Le code Java suivant montre comment quatre stratégies d'accès stockées peuvent être enregistrées pour un seul conteneur.

public class StoredAccessPolicies
{
   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("container1");
      container.createIfNotExists();
      BlobContainerPermissions containerPermissions =
         new BlobContainerPermissions();
      containerPermissions.setPublicAccess(BlobContainerPublicAccessType.OFF);
      SharedAccessBlobPolicy read = new SharedAccessBlobPolicy();
      SharedAccessBlobPolicy write = new SharedAccessBlobPolicy();
      SharedAccessBlobPolicy list = new SharedAccessBlobPolicy();
      SharedAccessBlobPolicy delete = new SharedAccessBlobPolicy();
      GregorianCalendar calendar =
         new GregorianCalendar(TimeZone.getTimeZone("UTC"));
      SharedAccessBlobPolicy[] policies =
         new SharedAccessBlobPolicy[]
         {read, write, list, delete};
      calendar.setTime(new Date());
      for(SharedAccessBlobPolicy policy : policies)
      {
         policy.setSharedAccessStartTime(calendar.getTime());
      }
      calendar.add(Calendar.HOUR, 1);
      for(SharedAccessBlobPolicy policy : policies)
      {
         policy.setSharedAccessExpiryTime(calendar.getTime());
      }
      read.setPermissions(EnumSet.of(SharedAccessBlobPermissions.READ));
      write.setPermissions(EnumSet.of(SharedAccessBlobPermissions.WRITE));
      list.setPermissions(EnumSet.of(SharedAccessBlobPermissions.LIST));
      delete.setPermissions(EnumSet.of(SharedAccessBlobPermissions.READ,
         SharedAccessBlobPermissions.DELETE));
      containerPermissions.getSharedAccessPolicies().put("r", read );
      containerPermissions.getSharedAccessPolicies().put("w", write);
      containerPermissions.getSharedAccessPolicies().put("l", list);
      containerPermissions.getSharedAccessPolicies().put("d", delete);
      container.uploadPermissions(containerPermissions);
      String[] pr = new String[]{"r", "w", "l", "d"};
      for(String p : pr)
      {
         System.out.println(
            container.generateSharedAccessSignature(new SharedAccessBlobPolicy(),p));
      }
   }
}

Pendant la période applicable de la SAP de stratégie, toute application en possession de la SAP de stratégie et de l'URL de base pour le conteneur d'objets blob peut utiliser les autorisations associées à la stratégie d'accès stockée heath. Votre application peut utiliser la SAP de stratégie exactement comme une SAP de base. Remplacez simplement la chaîne de SAP de stratégie par la chaîne de SAP de base dans les exemples fournis précédemment pour que votre application contrôle l'accès au niveau du conteneur à container1 en utilisant la stratégie heath.

Voir aussi

Afficher:
© 2015 Microsoft