2009-10-23 10 views
3

J'ai une action struts2 avec un @Secured({"ROLE_ADMIN"}) pour sécuriser la méthode d'exécution. Dans la méthode execute j'attribue un message à une variable membre de l'action, puis renvoie SUCCESS et finit sur la page jsp. Sur la page, je récupère la variable membre actions avec <sproperty>.Ressort de sécurité et Struts 2

private String greeting; 

public String execute() throws Exception { 
    this.greeting="Hello"; 
    return SUCCESS; 
} 

// getters and setters for greeting 
... 

<s:property value="greeting" /> 

Le problème est lorsque l'annotation est sécurisée présente l'jsp ne montre rien pour la variable membre mais quand on enlève @Secured la chose se comporte correctement et affiche le message qui a été mis dans la variable membre.

Il semble que la sécurité réelle fonctionne bien, mais lorsqu'elle est activée via l'annotation, la variable membre (ou peut-être l'instance de l'action) ne fait pas son chemin sur la pile de valeurs.

Je ne peux pas voir les messages d'erreur.

+0

Je n'ai pas utilisé Spring Security avec une application S2, mais la balise de propriété appellera 'getGreeting()', est-il possible que cela soit aussi annoté? Si oui, pourrait vouloir considérer 'ModelDriven'. –

Répondre

1

Vous devez vous assurer qu'avant d'exécuter le <s:property value="greeting" />, vous avez le "ROLE_ADMIN" présent comme autorité accordée dans le SecurityContextHolder.getContext(). En outre, si vous utilisez la stratégie par défaut "thread local" pour stocker le contexte de sécurité, assurez-vous que les droits accordés sont correctement stockés dans chaque thread de demande. Par exemple, si vous stockez des informations sur les informations d'identification de l'utilisateur dans la session http, vous avez besoin d'une configuration HttpSessionContextIntegrationFilter. En dernier recours, si vous en avez la possibilité, vous pouvez effectuer une session de débogage étape par étape dans le Spring Security Interceptor que vous utilisez et vérifier quel est le problème.