Bienvenido a re-orientation! Esperamos que encuentres lo que buscas

Implementando el controlador con Spring MVC. La clase GeneralController


Parte del manual paso a paso para desarrollar una aplicación web con Spring Framework + Spring Security contra una base de datos MySQL.

Ya tenemos nuestra clase de acceso a datos con la consulta personalizada y la clase de usuario personalizado con los nuevos atributos, nos queda implementar las redirecciones en función de los roles de usuarios autenticados y los recursos (las páginas) a los que accederán en cada caso.

Para esto crearemos la clase GeneralController, en la que especificamos mediante el estereotipo @Controller que se trata de un controlador de la capa web.

En este controlador vamos a crear un método para implementar lo que sucede cuando un usuario, una vez autenticado correctamente, accede al recurso “/secured/access.htm”. Ya que como vimos en el security-context, todos los usuarios, una vez autenticados de manera correcta, serán redirigidos a este recurso.

En nuestro ejemplo hemos usado anotaciones para indicarlo:

	@RequestMapping(value="/secured/access.htm")
	public String loginAction(Model model) {
			/* cuerpo del método */
	}

La clase GeneralController quedaría así. En función de los roles que tiene el usuario, es redirigido a una ruta u a otra. Las redirecciones están “enmascaradas” en una ruta base (/secured/) que previamente hemos habilitado desde el security-context.

package com.reor.app01.web;

import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.reor.app01.security.SecurityContextFacade;
import com.reor.app01.type.AllowedAuthorities;

@Controller
public class GeneralController {

	private static final Logger logger = Logger.getLogger(GeneralController.class);
	
	@RequestMapping(value="/index.htm")
	public String index() {
		return "index";
	} 
	
	@RequestMapping(value="/secured/access.htm")
	public String loginAction(Model model) {
		
		String paginaInicio = "main/index"; 
		try {
				paginaInicio = "index";

				if (SecurityContextFacade.hasAuthenticatedUserRole(AllowedAuthorities.ROLE_ADMIN)) {
					paginaInicio = "redirect:/secured/adm/index.htm";
				} else if (SecurityContextFacade.hasAuthenticatedUserRole(AllowedAuthorities.ROLE_STAFF)) {
					paginaInicio = "redirect:/secured/stf/index.htm";
				} else if (SecurityContextFacade.hasAuthenticatedUserRole(AllowedAuthorities.ROLE_USER)) {
					paginaInicio = "redirect:/secured/usr/index.htm";
				} 
		} catch (Exception e) { logger.error(e.getMessage(), e); }
		return paginaInicio;
	}

	@RequestMapping(value="/secured/adm/index.htm")
	public String adminsHome() {
		return "foradmins/index";
	} 
	@RequestMapping(value="/secured/stf/index.htm")
	public String staffsHome() {
		return "forotherusers/index";
	} 	
	@RequestMapping(value="/secured/usr/index.htm")
	public String usersHome() {
		return "forotherusers/index";
	} 	
}

Las páginas a la que se accederá en cada caso se indican sin la extensión, ya que previamente en el fichero de configuración hemos especificado que la extensión será jsp.

A raíz de esto, lo habitual es separar los controladores siguientes por perfiles/roles de usuario y que ya dentro de las páginas de administradores o empleados se acceda a controladores específicos. Agrupar los controladores por criterios funcionales es una práctica bastante extendida (por ejemplo, crearíamos StaffController y UserController donde estarían las acciones asociadas en cada caso).

Como se ve en la línea siguiente de GeneralController , nos apoyamos en un objeto enum (Enumeration) que utilizamos para preguntar por los roles específicos.

  SecurityContextFacade.hasAuthenticatedUserRole(AllowedAuthorities.ROLE_ADMIN)

La clase com.reor.app01.type.AllowedAuthorities que utilizamos es la siguiente:

package com.reor.app01.type;

public enum AllowedAuthorities {
	ROLE_ADMIN,
	ROLE_STAFF,
	ROLE_USER,
	ROLE_GUEST
}

En el siguiente post crearemos las JSPs en las rutas que hemos especificado y ejecutaremos la aplicación.

Terminos Tecnología: