2016-01-07 3 views
2

J'utiliseJava est-il entièrement compatible lors de la vérification des autorisations sur un support samba?

Files.isWritable(file) 

dans mon application Java pour vérifier si j'ai des autorisations pour modifier le fichier avant de le modifier.

Cela fonctionne normalement bien mais j'ai eu un client se plaindre que, bien qu'il ait donné la permission complète à ses fichiers, il ne fonctionnait toujours pas. La configuration des clients consistait en un lecteur linux à distance monté avec Samba sur sa machine Windows, et mon logiciel fonctionnait sur la machine Windows.

Il s'est avéré qu'il avait donné des autorisations complètes sur le dossier et les fichiers pour un utilisateur particulier, mais pas le groupe d'utilisateurs ou quelqu'un d'autre sur Linux.

S'il a changé les permissions sur Linux de 700 à 777 alors ça a marché mais je ne suis pas sûr qu'il devrait le faire? windows permissions linux permissions

Y at-il un problème avec Java lorsque les autorisations de contrôle sur une samba monter

+0

Comment le serveur Samba est-il configuré pour mapper les autorisations? Comment le serveur Samba mappe l'utilisateur Windows à un utilisateur sur le système Linux pour le contrôle d'accès? Il existe des discordances d'impédance non triviales entre Windows et Linux et Samba est une tentative de mieux faire pour combler le fossé. Ce n'est pas parfait et toute solution est un compromis. –

+0

Je ne sais vraiment pas à propos de Samba, mais ils ont un utilisateur alex sur linux et ils semblent utiliser l'utilisateur alex pour se connecter sous Windows, n'est-ce pas assez? –

+0

Sans avoir accès à l'ensemble de la configuration, il est impossible de le savoir. Vous devriez parler à celui qui est responsable de la gestion du serveur Samba. –

Répondre

0

Cela dépend.

Les mécanismes de contrôle d'accès sous UNIX et Windows ont traditionnellement été différents. Auparavant, comme pour samba3, vous disposiez d'un mappage plutôt grossier entre ces autorisations, ce qui fonctionnait dans les cas les plus simples, mais rencontrait des problèmes dans les cas plus difficiles. Vous pouvez trouver de nombreux tutoriels, des messages sur le forum et des listes de diffusion traitant de ces cas particuliers.

De nos jours, les choses se sont améliorées, car il existe des listes de contrôle d'accès dans le style NFSv4. Les avantages sont multiples:

  • Il est comme une interface: Vous avez les mêmes autorisations « idées » pour les systèmes différents et qu'ils mettent en œuvre leurs propres détails à charge du système de fichiers, qui signifie que vous (ou Java) juste avoir à travailler avec le trucs de haut niveau.
  • Il est beaucoup plus souple que les anciennes autorisations UNIX de base, incorporant des choses comme créer nouveau fichier ou créer un nouveau sous-répertoire, l'héritage détaillé des fichiers et/ou répertoires, ou refuser et que des règles d'autorisation en combinaison.
  • Malgré son nom, il fonctionne non seulement avec NFS version 4, mais aussi avec les permissions Windows actuelles, l'implémentation de Solaris 10/illumos CIFS sur ZFS et samba4 sur les systèmes Linux (je crois).

Vous utilisez normalement ACLFileAttributeView comme indiqué dans l'exemple court:

// lookup "joe" 
UserPrincipal joe = file.getFileSystem().getUserPrincipalLookupService() 
    .lookupPrincipalByName("joe"); 

// get view 
AclFileAttributeView view = Files.getFileAttributeView(file, AclFileAttributeView.class); 

// create ACE to give "joe" read access 
AclEntry entry = AclEntry.newBuilder() 
    .setType(AclEntryType.ALLOW) 
    .setPrincipal(joe) 
    .setPermissions(AclEntryPermission.READ_DATA, AclEntryPermission.READ_ATTRIBUTES) 
    .build(); 

// read ACL, insert ACE, re-write ACL 
List<AclEntry> acl = view.getAcl(); 
acl.add(0, entry); // insert before any DENY entries 
view.setAcl(acl); 

Dans votre cas, il serait suffisant pour interroger la vue de la deuxième étape pour les autorisations que vous souhaitez examiner. Pour un aperçu détaillé, j'aime utiliser ce documentation from Oracle - alors que les exemples sont de chmod, les autorisations elles-mêmes sont les mêmes en Java (mais il existe aussi le JavaDoc plus court pour eux, AclEntryPermission Enums).