Archive

Posts Tagged ‘Java’

Disponible RichFaces 3.3 Beta4

Diciembre 17th, 2008

El dia 9 de Diciembre se liberó y ya puedes descargarlo, esta versión 3.3 trae algunas novedades, dos componenetes muy interesantes, ademas de corregir varios bugs, puedes ver el detalle aqui.

  • rich:editor - editor WYSIWYG que permite introducir texto formateado. Mas Info
  • a4j:queue. Mecanismos de colas Globales por Defecto seran implementadas. Separando coponentes de las colas de definicion creadas. Mas Info

Puedes descargar las nuevas librerias aquí.

http://repository.jboss.org/maven2/org/richfaces/ui/richfaces-ui/3.3.0.BETA4/

Tags: Java, RichFaces

Java, Programación, RichFaces ,

La Seguridad Perfecta con Spring y el dropDownMenu de RichFaces

Diciembre 7th, 2008

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.

Tags: Ajax, Java, RichFaces, spring security

Java, RichFaces , , ,

Configuración Spring Security 2.0 con JDBC

Noviembre 21st, 2008

Esta configuración funciona perfectamente, con Spring Security 2.0 y JDBC, despues de varios dias probando configuraciones diferentes, puedo concluir dos cosas, que la versión de Spring Security tiene un bug en su versión 2.0.8.

Yo usé mis propias tablas, pero para los nuevos, pueden usar las que trae por defecto programadas, las que estan aabajo de este artículo, yo cree unas similares, pero en mi caso necesitaba otras moficiaciones, tablas con mas columnas para mi aplicación. El problema, es que si tu usar la nueva caracteristica de esta versión group-authorities-by-username-query vas a tener un problema, pues aunque pongas tu propia configuración necesitas tener las tablas de groups,group_authorities y group_members en tu base de datos, aunque no estén siendo usadas, porque sinó, no te funcionará. Abajo les dejo la configuración que usé.

En el web.xml

contextConfigLocation
 
        /WEB-INF/applicationContext*.xml
 
    springSecurityFilterChain
    org.springframework.web.filter.DelegatingFilterProxy
 
    springSecurityFilterChain
    /*

applicationContext-security.xml

 
   <!--  CONFIGURACION VALIDA PARA SPRING SECURITY 2.0 con JDBC 
          Author: www.jotadeveloper.com
           http://blog.jotadeveloper.com/2008/11/21/configuracion-spring-security-20-con-jdbc/
 --> 
<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/security"
	xmlns:beans="http://www.springframework.org/schema/beans" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
						http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
                        http://www.springframework.org/schema/security 
                        http://www.springframework.org/schema/security/spring-security-2.0.1.xsd">
 
   <!--  CONFIGURACION VALIDA PARA SPRING SECURITY 2.0 con JDBC   --> 
 
  <http auto-config="true" access-denied-page="/web/error.do">
   	<intercept-url pattern="/" access="IS_AUTHENTICATED_ANONYMOUSLY" />
		<intercept-url pattern="/login.do" access="IS_AUTHENTICATED_ANONYMOUSLY" />
		<intercept-url pattern="/j_spring_security_switch_user"
			access="ROLE_SUPERVISOR" />		
		<intercept-url pattern="/web/css/**" access="ROLE_WEBMASTER" />
		<intercept-url pattern="/templates/**" access="ROLE_WEBMASTER" />
		<intercept-url pattern="/web/error/**" access="ROLE_USER" />	
 
    <form-login login-page="/login.do" default-target-url='/web/index.do'
			authentication-failure-url="/login.do?login_error=1"  />
    <logout logout-success-url="/" invalidate-session="true"/>
      </http>
 
  <authentication-provider user-service-ref="userService" />
 
  <!-- MYSQL -->
 
  <beans:bean id="securityDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <beans:property name="driverClassName" value="org.gjt.mm.mysql.Driver" />
    <beans:property name="url" value="jdbc:mysql://localhost/test" />
    <beans:property name="username" value="root" />
    <beans:property name="password" value="" />
  </beans:bean>  
  <jdbc-user-service id="userService" 
	data-source-ref="securityDataSource"	
	 group-authorities-by-username-query="SELECT
                      g.nombre,
                      a.rol
                    FROM
                      dbo.bm_usuario u
                      INNER JOIN dbo.bm_grupo_usuario ug ON (u.id_usuario = ug.id_usuario)
                      INNER JOIN dbo.bm_grupo g ON (ug.id_grupo = g.id_grupo)
                      INNER JOIN dbo.bm_grupos_roles ON (g.id_grupo = dbo.bm_grupos_roles.id_grupo)
                      INNER JOIN dbo.bm_roles a ON (dbo.bm_grupos_roles.id_rol = a.id_rol)
                    WHERE
                      u.nombreUsuario = ? "
		users-by-username-query="SELECT 
					  u.nombreUsuario AS Login,
					  u.password AS Password,
					  u.enabled AS Enabled
					FROM
					  dbo.bm_usuario u
					WHERE
					  u.nombreUsuario = ?"
		authorities-by-username-query="SELECT 
					   u.nombreUsuario,
					    au.rol
					FROM
					  dbo.bm_usuario_roles ua
					  INNER JOIN dbo.bm_usuario u ON (ua.id_usuario = u.id_usuario)
					  INNER JOIN dbo.bm_roles au ON (ua.id_rol = au.id_rol)
					WHERE
					  u.nombreUsuario = ? " />
 
 
</beans:beans>

Las tablas para que esto funcione. OJO, aviso que este SQL no es el mismo que yo usé en mi ejemplos, es similar pero para SQL Server, con algunas modfiicaciones a las tablas originales.

 <!-- SQL -->
CREATE TABLE users(
username varchar_ignorecase(50) NOT NULL PRIMARY KEY,
password varchar_ignorecase(50) NOT NULL,
enabled BOOLEAN NOT NULL);
<!--Tabla de Roles -->
CREATE TABLE authorities (
username varchar_ignorecase(50) NOT NULL,
authority varchar_ignorecase(50) NOT NULL,
constraint fk_authorities_users FOREIGN KEY(username) REFERENCES users(username));
CREATE UNIQUE INDEX ix_auth_username ON authorities (username,authority);
 
CREATE TABLE groups (
id bigint generated BY DEFAULT AS identity(start WITH 0) PRIMARY KEY,
group_name varchar_ignorecase(50) NOT NULL);
<!--Tabla de Grupos Roles-->
CREATE TABLE group_authorities (
group_id bigint NOT NULL,
authority varchar(50) NOT NULL,
constraint fk_group_authorities_group FOREIGN KEY(group_id) REFERENCES groups(id));
<!--Tabla de Grupos Usuarios-->
CREATE TABLE group_members (
id bigint generated BY DEFAULT AS identity(start WITH 0) PRIMARY KEY,
username varchar(50) NOT NULL,
group_id bigint NOT NULL,
constraint fk_group_members_group FOREIGN KEY(group_id) REFERENCES groups(id));
Tags: acegi, Java, security, spring

Java , , ,

Integrando JSF + Facelets + Spring Security 2.0

Octubre 20th, 2008

Facelets es un sistema de plantillas, parecido a Tiles para Struts, el problema de este toolkit para JSF es la poca integración que tiene con otros frameworks, uno de ellos es Spring Security 2.0, no dispone de tagslibs para trabajarlo con los .xhtml, yo encontre una solucion bastante buena, se llama acegi-jsf con integracion para Spring Security 2.0.

Puedes descargarla aqui.

Ya con Facelest configurado, solo tienes que poner lo siguiente en el faces-config.xml.

<component>
   <component-type>net.sf.jsfcomp.acegijsf.Authorize</component-type>
   <component-class>net.sf.jsfcomp.acegijsf.Authorize</component-class>
</component> 
<component>
   <component-type>net.sf.jsfcomp.acegijsf.Authentication</component-type>
   <component-class>net.sf.jsfcomp.acegijsf.Authentication</component-class>
</component>

Lo siguiente que tienes que hacer, es usar las etiquetas, por ejemplo esta:

 <acegijsf:authorize ifAllGranted="ROLE_ADMIN">
   Agregar los componentes que solo seran visibles para ROLE_ADMIN.
</acegijsf:authorize>

Otra lista de atributos son:

  • ifAllGranted = El usuario debe tener todos los roles
  • ifAnyGranted = El usuario debe tener algun rol
  • ifNotGranted = No necesita roles

Visto en
http://vigilbose.blogspot.com/2008/06/integrating-spring-security-with.html

Tags: acegi, Facelets, Java, spring

Articulos, Facelets, Java , , ,

Modelando Java con UML I : Clases

Octubre 8th, 2008

A muchos programadores, sobretodo en Nicaragua, se lanzan al ruedo sin saber analizado tan si quiera lo mas minimo un sistema, web o de escritorio, mi experiencia es en el ambiente web, y como analista y programador, como a muchos les debe de pasar, las empresas nunca tienen tiempo para dedicarle al Análisis, luego vienen los clavos, y la culpa, siempre del Programador.

La mejor forma de analizar es con la Metodología , UML, existen varias metodologias de desarrollo de software, yo anteriormente presente una Metodología muy buena, que use en mi Monografia, Fusión.

Pero lo dificiles para muchos, sobre todo los que inician programando y luego usan UML como herramienta de documentacion (mala idea), se les hace dificil modelar.

Iniciare con algo sencillo.

Herencia

La herencia, lo mas usado en Java, simplemente se dibuja como una Generalización en UML y se representa en Java como un extends.

package org.jp.developer.test;
 
public class Padre {
 
}
 
public class Hijo extends Padre {
 
}

Asociación

Las asociaciones son instancias de clases dentro de otras clases, pero sin ninguna relacion directa o indirecta, solo estan relacionadas.

//Asociacion Directa
public class Hijo {
	Padre padre;
}
Asociacion Directa

En este ejemplo, Padre e Hijo, Padre es el cabeza de familia, pero la Vida del Hijo no depende de la del padre, solo tiene una relacion familiar, por eso la relación directa, se dibuja una flecha de Hijo->Padre, pues Hijo es el que tiene relacion con el Padre. Si en el caso que Padre tuviese una instancia de Hijo la relacion seria Bidireccional y se dibuja como una linea recta.

Asociaciones con Multiplicidad

Existe multiplicidad, cuando existen Objetos como Array, List, Vector, Collection, donde representa que se pueden almacenar uno o muchos objetos, en este caso Padre.

//Asociacion 0 a Muchos
public class Hijo {
	private List<Padre> ListaPadres;
}

Agregación y Composición

La agregación y la composición pueden ser un poco confusas, una agregación en Java se representa como una Asociación, pero tiene un enfoque diferente, la agregacion representa una parte de un todo, pero no necesariamente tiene que existir para que el todo exista, es el caso de Aplicacion y Base de Datos, una aplicación puede existir sin ella, igualmente una Base de Datos no necesita una Aplicación para existir. En el caso de la composición, es diferente, en el ejemplo puse la clase Codigo, que es parte de la composición de Aplicación, que no puede existir sin Código, por eso se dibujo como una Composición.

package org.jp.developer.test;
 
public class Aplicacion {
	private Codigo codigo;
	private BaseDeDatos bd;
}
public class Codigo {
}
public class BaseDeDatos {
}

Tags: asociacion, desarrollo de software, fusion, herencia, Java, multiplicidad, programadores, reingenieria, UML

Articulos , , , , , , , ,