2010-01-27 9 views
7

J'aimerais pouvoir créer un contrôleur de base dans mon application Spring qui, entre autres, détermine si un utilisateur est un utilisateur enregistré ou non. Ce contrôleur de base, suivant le modèle de conception de modèle, contiendrait une méthode protégée abstraite que les sous-classes de contrôleur implémenteraient.Spring: héritage du contrôleur utilisant l'annotation @Controller

La méthode abstraite lui aurait passé une instance d'utilisateur, enregistrée ou autre. Cependant, je n'ai aucune idée de comment je ferais cela car il semble qu'en utilisant des contrôleurs utilisant purement l'annotation @Controller, chaque contrôleur est libre de définir leur méthode de gestion des requêtes comme ils l'entendent.

La création d'une sorte de classe de service utilisateur injectée dans chaque contrôleur et utilisée pour valider un utilisateur serait-elle un moyen de contourner ce problème? Cela soulève la question (au moins pour moi) comment un tel contrôleur obtient-il un HttpServletRequest ou l'objet Session?

Merci.

Répondre

1

Je pense que le contrôleur de base n'est pas une bonne idée si le seul code qu'il doit avoir est pour UserAuthentication ... à la place, utilisez la sécurité de printemps. C'est la meilleure solution.

Vous pouvez avoir des méthodes comme celle-ci ... jetez un oeil à la référence de printemps ..

@Controller("loginController") 
public class LoginController {  

    @RequestMapping(value="/login.do", method=RequestMethod.POST) 
    public String login(Model model, HttpServletRequest request) { 

     String userIdFromRequest = (String)request.getParameter("userId"); 
     String password = (String)request.getParameter("password"); 

     boolean verified = ...send userIdFromRequest and password to the user service for 
     verification... 

     if (verified){ 
     request.getSession().setAttribute("userId", userIdFromRequest); 
     } 

    }   

    //More Methods 

} 

at-il aidé?

-SB

+0

Merci SB, j'ai réfléchi à cela mais je viens juste de recueillir quelques opinions à ce sujet maintenant. Je considère sérieusement Spring Security, mais je veux aussi éviter la duplication de code partout - j'ai besoin de lire sur Spring Security cependant. – richever

13
  1. Définir un abstract BaseController, sans annotations
  2. Définir Appel ces méthodes à partir des sous-classes concrètes et des méthodes abstraites
  3. (annotés avec @Controller) en cas de besoin.
+0

Merci Bozho, c'est en quelque sorte ce à quoi je pensais. J'apprécie la réponse. – richever

+2

Mais que se passe-t-il si certaines méthodes concrètes dans le BaseController doivent accéder à certains services autowired? J'imagine un BaseController qui a un 'userService UserService privé '@Autowired commun. Cela signifie-t-il que '' Abstract BaseController' devrait aussi être annoté avec '@ Controller 'pour que l'autowiring fonctionne? – bertie

Questions connexes