2010-01-27 26 views
7

Me gustaría poder crear un controlador base en mi aplicación Spring que, entre otras cosas, determine si un usuario es un usuario registrado o no. Este controlador base, siguiendo el patrón de diseño de la plantilla, contendría un método abstracto protegido que las subclases de controlador implementarían.Spring: herencia del controlador mediante la anotación @Controller

El método abstracto le hubiera pasado una instancia de Usuario, registrado o no. Sin embargo, no tengo idea de cómo haría esto, ya que parece que al usar controladores usando puramente la anotación @Controller, cada controlador es libre de definir su método de manejo de solicitudes como prefiera.

¿Crear una clase de servicio al usuario que se inyecta en cada controlador y se usa para validar a un usuario es una forma de evitar esto? Esto plantea la pregunta (al menos para mí) ¿cómo puede un controlador obtener una HttpServletRequest o el objeto Session?

Gracias.

Respuesta

1

Creo que el controlador base no es una buena idea si el único código que tiene es para la autenticación del usuario ... en su lugar use la seguridad Spring. Esta es la mejor opcion.

alternativa, puede tener métodos como éste ... echar un vistazo a la referencia de la primavera ..

@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 

} 

¿Le ayudó?

-SB

+0

Gracias SB, lo he considerado pero solo estoy recogiendo algunas opiniones sobre esto ahora mismo. Estoy considerando seriamente Spring Security, pero también quiero evitar la duplicación de código en todas partes; sin embargo, necesito leer acerca de Spring Security. – richever

13
  1. Definir una abstract BaseController, sin anotaciones
  2. Definir concreto y métodos abstractos
  3. llamar a estos métodos de subclases (anotados con @Controller) siempre que sea necesario.
+0

Gracias Bozho, eso es más o menos lo que estaba pensando. Aprecio la respuesta. – richever

+2

Pero, ¿qué pasa si algunos métodos concretos en el BaseController necesitan acceder a algunos servicios de autoconexión? Me imagino un BaseController que tiene un 'userService userService privado @ @Autowired común '. ¿Esto significa que el 'BaseController 'abstracto debe anotarse con' @ Controller' también para que el autoenrutamiento funcione? – bertie

Cuestiones relacionadas