Spring Security peut-il utiliser les méthodes @PreAuthorize
sur les contrôleurs Spring?
Réponses
Trop de publicités?Oui, ça marche bien.
Vous avez besoin de <security:global-method-security pre-post-annotations="enabled" />
en ...-servlet.xml
. Cela nécessite également des mandataires CGLIB . Par conséquent, soit vos contrôleurs ne devraient pas avoir d’interfaces, soit vous devez utiliser proxy-target-class = true
.
Voir le Printemps FAQ sur la Sécurité (l'emphase est mienne).
Au Printemps de l'application web, le contexte de l'application qui contient l' Spring MVC de haricots pour le répartiteur de la servlet est souvent séparée de la principales contexte de l'application. Il est souvent défini dans un fichier appelé myapp-servlet.xml où "myapp" est le nom attribué au Printemps DispatcherServlet dans web.xml. Une application peut avoir plusieurs DispatcherServlets, chacune avec sa propre isolé contexte de l'application. Les haricots dans de ces "enfants" contextes ne sont pas visibles par le reste de la application. Le "parent" contexte d'application est chargé par le ContextLoaderListener vous définissez dans votre web.xml et est visible par tous l'enfant contextes. Ce contexte parent est généralement de là que vous définissez votre configuration de sécurité, y compris la l'élément). Suite à toutes les contraintes de sécurité appliquées aux méthodes de ces web haricots ne seront pas appliquées, car les grains ne peuvent pas être vus à partir de la DispatcherServlet contexte. Vous devez déplacer le déclaration pour le contexte web ou déplacé le les haricots que vous voulez sécurisé dans le contexte de l'application.
Généralement, nous recommandons l'application de la méthode de sécurité au service couche plutôt que sur le web individuels des contrôleurs.
Si vous appliquez pointcuts de la couche de service, vous ne devez définir <global-method-security>
dans votre application de contexte de sécurité.
Si vous êtes à l'aide de Printemps 3.1, vous pouvez faire des trucs sympas avec cette. Jetez un oeil à https://github.com/mohchi/spring-security-request-mapping. C'est un exemple de projet qui intègre @exiger une autorisation préalable avec Spring MVC est RequestMappingHandlerMapping de sorte que vous pouvez faire quelque chose comme:
@RequestMapping("/")
@PreAuthorize("isAuthenticated()")
public String authenticatedHomePage() {
return "authenticatedHomePage";
}
@RequestMapping("/")
public String homePage() {
return "homePage";
}
Une demande de "/" lancera un appel authenticatedHomePage() si l'utilisateur est authentifié. Sinon, il va appeler la page d'accueil().