2013-06-27 5 views
1

J'ai un problème où ma méthode Controller avec @RolesAllowed fonctionne correctement mais si j'essaie d'utiliser @Secured, j'obtiens une exception AccessDeniedException. Bien que je préfère utiliser l'annotation @RolesAllowed, il a été déclaré que pour ce projet, nous devrions utiliser @Secured parce que le nom est moins confus lorsqu'il est mappé à nos droits d'accès hérités.Spring Security @RolesAllowed Works mais @Secured me donne AccessDeniedException au printemps 3.2 avec Spring Security 3.1

J'ai l'annotation configuré comme suit:

<security:global-method-security jsr250-annotations="enabled" secured-annotations="enabled" pre-post-annotations="enabled" /> 

Quand j'utilise @RolesAllowed("COMPANY_SEE_REPORTS") que mon utilisateur, il fonctionne correctement. Quand j'utilise @Secured("COMPANY_SEE_REPORTS"), j'obtiens une exception AccessDeniedException. Juste pour m'assurer que @RolesAllowed fonctionnait correctement, j'ai changé le rôle pour un rôle qui n'existait pas et à ce moment @RolesAllowed a jeté. Donc, ma question est comment puis-je @Secured fonctionner correctement?

Répondre

2

Essayez d'utiliser un rôle de sécurité avec un nom qui se termine par ROLE

From Spring Security Reference:

RoleVoter

Le AccessDecisionVoter le plus couramment utilisé fourni avec Spring La sécurité est la RoleVoter simple, qui traite les attributs de configuration comme des noms de rôle simples et des votes pour accorder l'accès si l'utilisateur s'est vu attribuer ce rôle.

Il votera si tout ConfigAttribute commence par le préfixe ROLE_. Il votera pour accorder l'accès s'il y a un GrantedAuthority qui renvoie une représentation de chaîne (via la méthode getAuthority()) exactement égale à un ou plusieurs ConfigAttributes commençant par le préfixe ROLE_. Si il n'y a pas de correspondance exacte de n'importe quel ConfigAttribute commençant par ROLE_, le RoleVoter votera pour refuser l'accès. Si aucun ConfigAttribute ne commence avec ROLE_, l'électeur s'abstiendra.

Mais vous pouvez modifier le préfixe RoleVoter RoleVoter#setRolePrefix(String rolePrefix)

+0

Ce n'est pas vraiment une option pour notre système. La signification du rôle ne s'applique pas tout à fait ici et dans notre système ils l'appellent un droit (avec un rôle étant une collection ou des droits). Nous avons un modèle de sécurité trop fin et nous voulons activer les droits individuels et pas seulement au niveau des rôles. – haskovec

+0

Avez-vous essayé le workarround avec "ROLE" à la fin? – Ralph

+0

Je n'ai pas essayé le travail parce que du point de vue de mon entreprise, ils ne considèrent pas cela comme un droit (puisque nous avons des droits très fins ici). Nous utilisons simplement l'option des rôles autorisés pour le moment. Je peux creuser dans la source de printemps plus tard pour voir si elles ont besoin de rôle pour utiliser @Secured. – haskovec