Cela execute la vraie méthode qui était sensée être appelée.
Cela s'appelle un "point de coupe".
Et oui pour une seule méthode ca devrait etre : execution(public * foo.bar.ManagerUser.getUser(..))
comme tu peux le comprendre cela correspond à "visibilité retour package.class.method(args)"
Cela correspond au pattern décorateur. En fait quand tu vas demander à Spring le bean ManagerUser... il ne va pas te retourner un simple objet ManagerUser, mais un ManagerUser "enrobé" avec le fameux MethodInterceptor. Il faut imaginer les intercepteur comme des poupées russes.
Il y a plusieurs type d'interception de méthode. Before, After, Around... dans ce cas ci, c'est "Around". Tout ça est expliqué dans la doc de Spring.
http://static.springframework.org/sp...tml#aop-schema
Around est le plus "puissant", c'est celui qui permet de placer du code "autour", avant et apres le proceed(), meme de décider de ne pas l'appeler.
Pour aller plus loin : dans le cadre de gestion de droits, il faut que tu injectes dans le SecurityMethodInterceptor, un autre manager qui sait controler les autorisations en lui passant un utilisateur et un nom de methode, et qui peut retourner true ou false (par exemple).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
public class SecurityMethodInterceptor implements MethodInterceptor {
private AuthorizationManager authManager;
public void setAuthorizationManager(AuthorizationManager authManager) {
this.authManager = authManager;
}
public Object invoke(....) {
// ...
if( ! authManager.checkResource(invocation.getMethod().getName(), user) {
throw new RuntimeException("forbidden");
} else {
return invocation.proceed();
}
} |
Je ne te cache pas que c'est le principe même d'Acegi que l'on a évoqué plus haut.
Partager