Bueno, sigo con la seguridad de Spring 2.0 o el conocido como el antiguo Acegi Security, ahora voy a proponer una alternativa para generar una seguridad con un componente de RichFaces, el dropDownMenu. ToolBar y menuItem.
Primero te recomiendo sigas la configuración de Spring con JDBC, o con LDAP, como tu lo desees, porque de todas formas todos los Roles ( o Permisos) quedan almacenados en la misma variable de Spring. También si deseas integrarlo con Facelest, aqui tenes los pasos a seguir.
Lo primero que hay que hacer, es construir el menú, para eso usamos un Tool Bar:
<rich:toolBar>
<rich:dropDownMenu >
<f:facet name="label">
<h:panelGroup>
<h:graphicImage value="#{initParam['rootimages']}/images/icons/contexthelp.png" />
<h:outputText value="JotaDeveloper" />
</h:panelGroup>
</f:facet>
<rich:menuItem submitMode="ajax" value="Articulos"></rich:menuItem>
<rich:menuItem submitMode="ajax" value="Tutoriales"></rich:menuItem>
<rich:menuItem submitMode="ajax" value="Ayuda"></rich:menuItem>
</rich:dropDownMenu>
</rich:toolBar>
El código es bien sencillo, no hace falta explicar mucho, solo que para poder colocar un dropDownMenu , es necesario el toolBar, y para el menuItem , debe estar dentro de un dropDownMenu.
Depues de esto, y espero que hayas leido los 3 articulos que sugerí anteriormente, vamos a crear un Bean, donde tendremos la logica de nuestra seguridad con el dropDownMenu.
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.security.Authentication;
import org.springframework.security.GrantedAuthority;
import org.springframework.security.context.SecurityContext;
import org.springframework.security.context.SecurityContextHolder;
import org.springframework.security.ui.WebAuthenticationDetails;
public class JotaDeveloperMenuBean {
// Un objeto Booleano por cada elemento del Menu
private Boolean rootJotaDeveloper;
private Boolean rootTutoriales;
private Boolean rootArticulos;
private Boolean rootAyuda;
// Objetos Spring Security
private Object seguridadAcegi;
// El GrantedAuthority es un Array con todos los Roles que recupera de la BD
private GrantedAuthority[] listaAutoridades;
private SecurityContext contexto;
private Authentication autenticacion;
private List<string> ListAutoridades = new ArrayList<string>();
private String nombreUsuario;
private Boolean estaAutenticado;
private WebAuthenticationDetails webAu;
/**
* Constructor que accede a toda la información de Spring Security
*/
public JotaDeveloperMenuBean() {
this.seguridadAcegi = SecurityContextHolder.getContext()
.getAuthentication().getPrincipal();
this.contexto = SecurityContextHolder.getContext();
this.autenticacion = SecurityContextHolder.getContext()
.getAuthentication();
this.listaAutoridades = SecurityContextHolder.getContext()
.getAuthentication().getAuthorities();
convertirArrayAuthoritiesToListAuthorities();
this.nombreUsuario = this.autenticacion.getName();
this.estaAutenticado = this.autenticacion.isAuthenticated();
}
/**
* Este metodo convierte el Array de Roles poco manejable en un List
*/
private void convertirArrayAuthoritiesToListAuthorities() {
int it_cont;
for (it_cont = 0; it_cont < listaAutoridades.length; it_cont++) {
String ROL = listaAutoridades[it_cont].toString();
ListAutoridades.add(ROL);
}
}
/**
* Comprueba si existe determinado Rol en la Lista de Autoridades del
* Usuario Logeado
*
* @param cadena
* ROL
* @return El resultado de la Busqueda
*/
private Boolean comprobarRol(String cadena) {
Integer id = ListAutoridades.indexOf(cadena);
// Si el Id es -1, el valor no fue encontrado.
if (id != -1) {
return false;
} else {
return true;
}
}
/**
* Los Getters que va leer cada elemento del Menu
*/
public Boolean getRootJotaDeveloper() {
return rootJotaDeveloper = comprobarRol("ROLE_ROOT_JOTADEVELOPER");
}
public Boolean getRootTutoriales() {
return rootTutoriales = comprobarRol("ROLE_ROOT_TUTORIALES");
}
public Boolean getRootAyuda() {
return rootArticulos = comprobarRol("ROLE_ROOT_AYUDA");
}
public Boolean getRootArticulos() {
return rootAyuda = comprobarRol("ROLE_ROOT_ARTICULOS");
}
}
Despues de esto y incluir el Bean el el ManageBean de faces-config.xml, solo agregamos a la propiedad disabled del MenuItem el get del Bean.
<rich:toolBar>
<acegijsf:authorize ifAllGranted="ROLE_ROOT_JOTADEVELOPER">
<rich:dropDownMenu >
<f:facet name="label">
<h:panelGroup>
<h:graphicImage value="#{initParam['rootimages']}/images/icons/contexthelp.png" />
<h:outputText value="JotaDeveloper" />
</h:panelGroup>
</f:facet>
<rich:menuItem submitMode="ajax" value="Articulos" disabled="#{jotaDeveloperMenuBean.rootArticulos}"></rich:menuItem>
<rich:menuItem submitMode="ajax" value="Tutoriales" disabled="#{jotaDeveloperMenuBean.rootTutoriales}"></rich:menuItem>
<rich:menuItem submitMode="ajax" value="Ayuda" disabled="#{jotaDeveloperMenuBean.rootAyuda}"></rich:menuItem>
</rich:dropDownMenu>
</acegijsf:authorize>
</rich:toolBar>
El resultado de todo esto, es que cuando inices sesión, el GrantedAuthority que genera en la sesión del usuario Spring Security, lo convertimos en un List, luego cada elemente del menu que tu crees, va preguntarle al List si existe, si Existe, regresa True, sino, False, y apareceran los menus cuales el usuario no tenga permiso desactivados, ademas de eso, no podra acceder via URL, si has configurado correctamente el security.xml del Spring Security.
Últimos comentarios