La différence entre le Rôle et GrantedAuthority au Printemps de Sécurité
Il y a des concepts et implémentations dans le Ressort de Sécurité, tels que la GrantedAuthority
interface pour obtenir un autorité pour autoriser/contrôle d'accès.
Je voudrais que les valides, les opérations, telles que createSubUsers, ou deleteAccounts, dont je voudrais permettre à un admin (avec rôle ROLE_ADMIN
).
Je suis confus que l'tutoriels/demos je vois en ligne. J'essaie de me connecter ce que j'ai lu, mais je pense que nous traitons les deux indifféremment.
Je vois hasRole
de la consommation d'un GrantedAuthority
chaîne? J'ai le plus certainement le fais de mal à comprendre. Ce sont ces conceptuellement au Printemps de Sécurité?
Comment dois-je entreposer le rôle d'un utilisateur, distincte de la part des autorités pour ce rôle?
Je suis également à la recherche à la org.springframework.security.core.userdetails.UserDetails
interface qui est utilisée dans l'authentification de fournisseur référencé DAO, qui consomme une User
(noter le dernier GrantedAuthority):
public User(String username,
String password,
boolean enabled,
boolean accountNonExpired,
boolean credentialsNonExpired,
boolean accountNonLocked,
Collection<? extends GrantedAuthority> authorities)
Ou est-il un autre moyen de différencier les deux autres? Ou n'est-il pas pris en charge, et nous devons faire notre propre?
Vous devez vous connecter pour publier un commentaire.
Penser à un GrantedAuthority comme étant une "autorisation" ou "droit". Ces "autorisations" sont (normalement) exprimé sous la forme de chaînes (avec le
getAuthority()
méthode). Ces chaînes permettent d'identifier les autorisations et laisser les électeurs décider s'ils accordent l'accès à quelque chose.Vous pouvez accorder différents GrantedAuthoritys (autorisations) pour les utilisateurs en les mettant dans le contexte de sécurité. Normalement, vous faites que par la mise en œuvre de votre propre UserDetailsService qui renvoie un UserDetails de mise en œuvre qui renvoie à la nécessaire GrantedAuthorities.
Rôles (comme ils sont utilisés dans de nombreux exemples) sont des "autorisations" avec une convention de nommage qui dit qu'un rôle est un GrantedAuthority qui commence par le préfixe
ROLE_
. Il n'y a rien de plus. Un rôle n'est que d'un GrantedAuthority - une "permission" - un "droit". Vous voyez beaucoup d'endroits dans le ressort de la sécurité, où le rôle avec sonROLE_
préfixe est traitée spécialement comme par exemple dans le RoleVoter, où laROLE_
préfixe est utilisé en tant que par défaut. Cela vous permet de fournir les noms de rôle withtout laROLE_
préfixe. Avant le Printemps de sécurité 4, ce traitement spécial des "rôles" n'a pas été suivie très régulièrement et les autorités, et que les rôles étaient souvent traités de la même façon (comme, par exemple, vous pouvez le voir dans la mise en œuvre de lahasAuthority()
méthode dans SecurityExpressionRoot - qui appelle tout simplementhasRole()
). Avec Spring Security 4, le traitement de rôles est plus cohérent et le code qui traite des "rôles" (comme leRoleVoter
, lehasRole
expression etc.) ajoute toujours leROLE_
préfixe pour vous. DonchasAuthority('ROLE_ADMIN')
signifie la même chose quehasRole('ADMIN')
parce que leROLE_
préfixe est ajouté automatiquement. Voir le printemps de sécurité de 3 à 4 guide de migration pour de plus amples informations.Mais encore: un rôle n'est que d'une autorité particulière avec un
ROLE_
préfixe. Donc, au Printemps de sécurité 3@PreAuthorize("hasRole('ROLE_XYZ')")
est le même que@PreAuthorize("hasAuthority('ROLE_XYZ')")
et au Printemps de sécurité 4@PreAuthorize("hasRole('XYZ')")
est le même que@PreAuthorize("hasAuthority('ROLE_XYZ')")
.Au sujet de votre cas d'utilisation:
Vous pourriez vous retrouver dans
GrantedAuthorities
pour les rôles d'un utilisateur appartient à et les opérations qu'un rôle peut effectuer. LeGrantedAuthorities
pour les rôles ont le préfixeROLE_
et les opérations ont le préfixeOP_
. Un exemple pour le fonctionnement des autorités pourrait êtreOP_DELETE_ACCOUNT
,OP_CREATE_USER
,OP_RUN_BATCH_JOB
etc. Les rôles peuvent être ROLE_ADMIN, ROLE_USER etc.Vous pourriez finir par avoir votre entités mettre en œuvre
GrantedAuthority
comme dans cette (pseudo-code) exemple:Les id des rôles et des opérations que vous créez dans votre base de données serait le GrantedAuthority représentation, par exemple, "ROLE_ADMIN", "OP_DELETE_ACCOUNT" etc. Lorsqu'un utilisateur est authentifié, assurez-vous que tous les GrantedAuthorities de tous ses rôles et les opérations correspondantes sont renvoyés à partir de la UserDetails.getAuthorities() la méthode.
Exemple:
Le rôle admin id ROLE_ADMIN a les opérations OP_DELETE_ACCOUNT, OP_READ_ACCOUNT, OP_RUN_BATCH_JOB lui est assigné.
Le rôle de l'utilisateur avec l'id ROLE_USER a l'opération OP_READ_ACCOUNT.
Si un admin journaux dans le contexte de sécurité ont le GrantedAuthorities:
ROLE_ADMIN, OP_DELETE_ACCOUNT, OP_READ_ACCOUNT, OP_RUN_BATCH_JOB
Si un utilisateur se connecte, il aura:
ROLE_USER, OP_READ_ACCOUNT
La UserDetailsService prendrait soin de collecter tous les rôles et toutes les opérations de ces rôles et de les rendre disponibles par la méthode getAuthorities() dans le retour de l'UserDetails instance.
hasRole('xyz')
au Printemps de Sécurité 4 attend de vous que vous avez le ROLE_ préfixe alors que lahasAuthority('xyz')
n'attend pas le préfixe et évalue exactement ce qui est passé en. J'ai utilisé cette solution, mais a été en cours d'exécution dans des problèmes avechasRole('OP_MY_PERMISSION')
depuis le ROLE_ préfixe était nécessaire. Au lieu de cela, j'aurais été à l'aide de lahasAuthority('OP_MY_PERMISSION')
depuis je n'ai pas eu le préfixe.<sec:authorize access="hasRole('ADMIN')">
est le même que<sec:authorize access="hasRole('ROLE_ADMIN')">
OP_
à vos exemples, mais c'est votre convention et n'est pas de faire respecter par le framework n'est-ce pas? ieROLE_
a une signification spéciale et de comportement oùOP_
est juste et ne signifie rien?Autant que je sache GrantedAuthority et les rôles sont les mêmes au printemps de sécurité. GrantedAuthority de getAuthority() string est le rôle (en tant que par défaut, la mise en œuvre SimpleGrantedAuthority).
Pour votre cas peut-être vous pouvez utiliser Hiérarchique des Rôles
N'est pas exactement le sol-ce que vous cherchez, mais espérons que cela aide
Modifier: en Réponse à votre commentaire
Rôle, c'est comme une autorisation au printemps de sécurité. à l'aide d'interception url avec hasRole offre une très bonne granularité de ce fonctionnement est autorisé pour qui le rôle, la permission.
La façon dont nous traitons dans notre application, nous définissons l'autorisation (c'est à dire de rôle) pour chaque opération (ou de repos url) pour, par exemple, view_account, delete_account pour en, add_account etc. Ensuite, nous créons logique des profils pour chaque utilisateur comme administrateur, guest_user, normal_user. Les profils sont juste logique de regroupement des autorisations, indépendant de ressort de sécurité.
Lorsqu'un nouvel utilisateur est ajouté, un profil est assigné (ayant permises autorisations). Maintenant, si jamais l'utilisateur essayez d'effectuer une certaine action, la permission/le rôle pour qui l'action est vérifiée à l'encontre de l'utilisateur grantedAuthorities.
Également la defaultn RoleVoter utilise le préfixe ROLE_, de sorte que toute autorité de départ avec ROLE_ est considéré comme rôle, vous pouvez modifier ce comportement par défaut en utilisant une mesure RolePrefix dans le rôle de l'électeur et de l'utiliser au printemps de sécurité.
Une autre façon de comprendre la relation entre ces concepts est d'interpréter le RÔLE de conteneur des Autorités.
Autorités sont autorisations affinées ciblant une action spécifique couplé avec parfois des données spécifiques à l'étendue ou du contexte. Par exemple, de Lire, d'Écrire, de Gérer, peut représenter différents niveaux de droits d'accès à un compte tenu de l'étendue de l'information.
Aussi, les autorités sont appliquées de profondeur dans le flux de traitement d'une demande, alors que le RÔLE sont filtrées par le filtre de demande de chemin avant d'atteindre le Contrôleur. Les meilleures pratiques de prescrire la mise en œuvre les autorités d'application de passé le Contrôleur dans la couche de gestion.
D'autre part, les RÔLES sont à grain grossier représentation d'un ensemble d'autorisations. Un ROLE_READER serait uniquement en Lecture ou en Vue de l'autorité, tandis qu'un ROLE_EDITOR aurait à la fois en Lecture et en Écriture. Les rôles sont principalement utilisés pour une première projection à la périphérie de la demande de traitement, telles que
http.
...
.antMatcher(...).hasRole(ROLE_MANAGER)
Les Autorités de l'exécution de profondeur dans la demande de flux de processus permet à un grain plus fin à l'application de l'autorisation. Par exemple, un utilisateur peut Lire la permission d'Écriture de premier niveau d'une ressource, mais seulement la Lecture à un sous-ressource. Avoir un ROLE_READER serait de restreindre son droit d'éditer le premier niveau de ressources qu'il a besoin de l'autorisation d'Écriture pour modifier cette ressource mais un @exiger une autorisation préalable de l'intercepteur pourrait bloquer sa tentative de modifier la sous-ressource.
Jake