2012-01-06 1 views
4

J'ai mis en place la sécurité du ressort dans la méthode du contrôleur.Comment vérifier la sécurité du ressort au niveau de la méthode

Ci-dessous est mon ressort security.xml

->

<!-- URL pattern based security --> 
<security:http auto-config="false" entry-point-ref="authenticationEntryPoint" 
    use-expressions="true"> 
    <custom-filter ref="authenticationFilter" position="FORM_LOGIN_FILTER" /> 
    <security:intercept-url access="hasAnyRole('ROLE_ADMIN','ROLE_USER')" pattern="/common/admin/**" /> 
    <security:intercept-url pattern="/common/accounting/**" access="hasRole('ROLE_USER')" /> 
    <security:logout logout-url="/j_spring_security_logout" invalidate-session="true" logout-success-url="/login"/> 

</security:http> 

Ci-dessous est mon contrôleur

@Secured({"ROLE_ADMIN"}) 
@RequestMapping(value = "/common/admin/addAdmin", method = RequestMethod.GET) 
public String add(ModelMap map) { 
    map.addAttribute(new Administrator()); 
    return "/common/admin/addAdmin"; 
} 

@Secured({"ROLE_ADMIN"}) 
@RequestMapping(value = "/common/admin/addAdmin", method = RequestMethod.POST) 
public String processadd(
     @ModelAttribute("administrator") Administrator administrator) { 
    this.administratorManager.addAdmin(administrator); 
    return "/common/admin/success"; 
} 

J'autorise l'url/commune/admin/** pour le rôle d'administrateur et d'utilisateur. Mais je fais une certaine restriction dans le contrôleur d'administration. Lorsque l'utilisateur se rend dans/common/admin/* comme un rôle d'utilisateur, il peut mais il peut aussi entrer dans la méthode qui est seulement pour le rôle d'administrateur.

Comment puis-je le résoudre?

Merci!

Répondre

3

Vous avez déjà ajouté l'annotation @Secured.

Mais vous devez l'activer:

<!-- secured-annotations = (@Secured("ROLE_ADMIN")) --> 
<!-- jsr250-annotations = (@RunAs @RolesAllowed @PermitAll @DenyAll @DeclareRoles) --> 
<!-- pre-post-annotations = @PreAuthorized("hasAuthority('ROLE_ADMIN')") --> 
<global-method-security 
    secured-annotations="enabled" 
    jsr250-annotations="disabled" 
    pre-post-annotations="disabled">   
</global-method-security> 

@Secured peut prendre un seul ou plusieurs rôles.

  • @Secured("ROLE_USER")
  • @Secured({"ROLE_USER", "ROLE_ADMIN"}) // grand accès si l'utilisateur dispose d'un de ces rôles

BWT: de la sécurité Spring 3 Livre (http://www.springsecuritybook.com/):

l'annotation @Secured est functionallz et syntactiallz les mêmes que @RollesAllowed ... comme @Secured fonctionne de la même que la norme JSR @RollesAllowed il y a reallz pas une raison impérieuse de l'utiliser (@Secured) dans le nouveau code dans ...

(ne forgett pour lui permettre jsr250-annotations="enabled")

+1

salut ralph, j'ai déjà ajouté le dans security.xml. Mais la méthode de vérification de la sécurité ne fonctionne pas. Comment fais-je? – sudo

+0

@sudo: s'il vous plaît décrivez votre problème approprié - dans le texte de la question n'était pas explicite question, aucun indice que quelque chose ne fonctionne pas comme prévu. – Ralph

+0

Je ne suis pas d'accord avec l'affirmation selon laquelle les annotations '@ Secured' sont fonctionnellement identiques à' @ RolesAllowed'. Si vous recherchez simplement l'une des listes de rôles, alors c'est probablement vrai, mais les annotations '@ Secured' sont plus puissantes car elles utilisent le système' 'AccessDecisionManager' de Spring Security et le système des électeurs. Les attributs ne sont pas limités à des rôles simples. –

1

Je crois que vous pourriez avoir plusieurs rôles définis avec l'annotation @Secured. Est-ce ce dont vous avez besoin?

Si tel est le cas, essayez @RolesAllowed

1

Vérifier this FAQ. Assurez-vous que l'élément global-method-security se trouve dans le fichier de contexte Web si vous souhaitez appliquer la sécurité aux contrôleurs Spring MVC.

En outre, vous devrez peut-être activer la classe mandatement, en utilisant

<global-method-security secured-annotations="enabled" proxy-target-class="true" /> 

si votre contrôleur implémente une interface et la méthode que vous sécurisez ne fait pas partie de cette interface (vous aurez également besoin cglib comme supplémentaire dépendance dans votre application pour cela).

0

Si vous voulez utiliser des annotations, mieux vaut mettre ce qui suit dans servlet.xml.Il ne sert à rien d'activer les annotations n spring-security-xml car cela n'aura aucun effet.

mettre au-dessus de servlet.xml fera l'affaire.

Questions connexes