Je voudrais créer une classe qui ajoute des méthodes personnalisées à utiliser dans le langage d'expression de sécurité Spring pour l'autorisation basée sur une méthode via des annotations.
Par exemple, je voudrais créer une méthode personnalisée comme 'customMethodReturningBoolean' à utiliser d'une manière ou d'une autre comme ceci:
@PreAuthorize("customMethodReturningBoolean()")
public void myMethodToSecure() {
// whatever
}
Ma question est la suivante. Si c'est possible, quelle classe dois-je sous-classer pour créer mes méthodes personnalisées, comment procéder pour la configurer dans les fichiers de configuration xml de printemps et que quelqu'un me donne un exemple d'une méthode personnalisée utilisée de cette manière?
java
spring
spring-security
Paul D. Eden
la source
la source
Réponses:
Vous devrez sous-classer deux classes.
Tout d'abord, définissez un nouveau gestionnaire d'expression de méthode
myMethodSecurityExpressionHandler
sera une sous-classeDefaultMethodSecurityExpressionHandler
dont les remplacementscreateEvaluationContext()
, définissant une sous-classe deMethodSecurityExpressionRoot
sur leMethodSecurityEvaluationContext
.Par exemple:
la source
MethodSecurityExpressionRoot
être privé de paquets ?Aucune des techniques mentionnées ne fonctionnera plus. Il semble que Spring ait fait de grands efforts pour empêcher les utilisateurs de remplacer SecurityExpressionRoot.
EDIT 11/19/14 Setup Spring pour utiliser les annotations de sécurité:
Créez un haricot comme celui-ci:
Ensuite, faites quelque chose comme ça dans votre jsp:
Ou annoter une méthode:
De plus, vous pouvez utiliser Spring Expression Language dans vos
@PreAuthorize
annotations pour accéder à l'authentification actuelle ainsi qu'aux arguments de méthode.Par exemple:
Ensuite, mettez
@PreAuthorize
à jour votre pour qu'il corresponde à la nouvelle signature de méthode:la source
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
pour obtenir le jeton d'authentification actuel.Merci ericacm , mais cela ne fonctionne pas pour plusieurs raisons:
Les différences sont que nous appelons la méthode createEvaluationContext existante , puis ajoutons notre objet racine personnalisé. Enfin, je viens de retourner un type d' objet StandardEvaluationContext car MethodSecurityEvaluationContext ne résoudrait pas dans le compilateur (ils proviennent tous deux de la même interface). C'est le code que j'ai actuellement en production.
Faites en sorte que MethodSecurityExpressionHandler utilise notre racine personnalisée:
Cela remplace la racine par défaut en étendant SecurityExpressionRoot . Ici, j'ai renommé hasRole en hasEntitlement:
Enfin, mettez à jour securityContext.xml (et assurez-vous qu'il est référencé à partir de votre applcationContext.xml):
Remarque: l'annotation @Secured n'acceptera pas ce remplacement car elle s'exécute via un gestionnaire de validation différent. Donc, dans le xml ci-dessus, je les ai désactivés pour éviter toute confusion ultérieure.
la source