2011-08-16 1 views
1

L'autorité de l'utilisateur est fréquemment modifiée dans mon service Web.
Dans ce cas, comment vérifier l'autorité de l'utilisateur de manière efficace?Quelle est la meilleure façon de vérifier l'autorité actuelle de l'utilisateur dans les méthodes du contrôleur spring3?

J'ai écrit un code qui vérifie l'autorité de l'utilisateur dans chaque contrôleur temporairement. Mais je pense que ce ne serait pas bon pour la maintenance.

Comment vérifier l'autorité de l'utilisateur sans écrire la méthode de vérification dans chaque contrôleur?

+0

vous pouvez également utiliser les bons emballages ici: http://stackoverflow.com/a/3412166/26510 –

Répondre

1

Vous ne savez pas ce que vous faites - Spring Security garde automatiquement la trace des autorités dans le contexte de sécurité de l'utilisateur. Si vous devez vérifier par programme pour une autre raison, puis implémentez l'interface HandlerInterceptor et dans la méthode preHandle, appelez SecurityContextHolder.getContext().getAuthentication() pour obtenir l'utilisateur actuel. Vous pouvez ensuite vérifier les autorisations de l'utilisateur.

L'intercepteur sera configuré comme suit:

<mvc:interceptors> 
    <bean class="com.my.package.MyInterceptor" /> 
</mvc:interceptors> 
0

Ajouter un élément intercept-url à votre configuration avec le rôle qui est nécessaire, par exemple.

<http auto-config='true'> 
    <intercept-url pattern="/**" access="ROLE_FOO" /> 
</http> 
0

Utilisez HandlerMethodArgumentResolver pour laisser injecter Spring GrantedAuthority dans la méthode du contrôleur. Si un utilisateur peut avoir plus d'une autorité, vous devrez créer une classe pour conserver les droits de l'utilisateur (peut être nommé GrantedAuthorities). Une fois que vous avez terminé, votre méthode de commande ressemblera à quelque chose comme ceci:

@RequestMapping({"/xyz"}) 
public String handleXYZRequest(GrantedAuthorities authorities) { 
    /* use authorities if not null */ 
    ... 
} 

résolveur, vous utiliserez le même code que que vous utilisez actuellement pour obtenir les autorités et il retournera null ou objet GrantedAuthorities. Si vous utilisez une ancienne version de Spring, utilisez WebArgumentResolver et enregistrez-la avec AnnotationMethodHandlerAdapter.

L'approche ci-dessus évite la duplication de code et peut être utilisée pour injecter tout ce dont vous avez besoin de SecurityContextHolder dans les méthodes de contrôleur.

Modifier

Ceci est similaire à l'approche utilisée par effet de serre. S'il vous plaît voir WebConfig, où le principal (qui est l'objet de compte) est injecté dans le contrôleur par le résolveur d'argument.

Questions connexes