Configurar spring-security con Liberty Profile

Si deseamos tener autenticación delegada en el contenedor con spring security (esto es para verSpring_Framework_logosión 4) y el servidor liberty profile de ibm aquí os dejo el contenido de los ficheros de configuración para que lo hagais en un periquete.

Esto de lo que se trata es muy sencillo, un proceso de validación de usuario se compone de 2 tareas independientes, la autenticación y la autorización.

La autenticación es decir “si, este usuario existe” y la autorización es “¿este usuario que hemos comprobado que existe tiene permisos para acceder a esta página?”.

Con esta configuración delegamos la autenticación en el servidor, aquí están configurados los usuarios directamente en el server.xml pero podrías configurar un openldap por ejemplo y funcionaría igualmente.

La autorización como podeis ver está configurada a través del fichero de configuración de spring asignando diferentes accesos dependiendo de los roles que nos haya devuelto la autenticación.

spring-security.xml


<beans:beans xmlns:sec="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.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.2.xsd">

<sec:authentication-manager alias="authenticationManager">
<sec:authentication-provider ref='preAuthenticatedAuthenticationProvider' />
</sec:authentication-manager>

<beans:bean id="preAuthenticatedAuthenticationProvider"    class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
<beans:property name="preAuthenticatedUserDetailsService" ref="preAuthenticatedUserDetailsService" />
</beans:bean>

<beans:bean id="preAuthenticatedUserDetailsService" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedGrantedAuthoritiesUserDetailsService" />

<beans:bean id="springSecurityFilterChain" class="org.springframework.security.web.FilterChainProxy">
<sec:filter-chain-map path-type="ant">

<sec:filter-chain pattern="/*" filters="sif,j2eePreAuthFilter,logoutFilter,etf,fsi" />
</sec:filter-chain-map>
</beans:bean>

<beans:bean id="sif"
class="org.springframework.security.web.context.SecurityContextPersistenceFilter" />
<h2></h2>
<beans:bean id="j2eePreAuthFilter" class="org.springframework.security.web.authentication.preauth.j2ee.J2eePreAuthenticatedProcessingFilter" >
<beans:property name="authenticationManager" ref="authenticationManager" />
<beans:property name="authenticationDetailsSource">
<beans:bean class="org.springframework.security.web.authentication.preauth.j2ee.J2eeBasedPreAuthenticatedWebAuthenticationDetailsSource">
<beans:property name="mappableRolesRetriever">
<beans:bean class="org.springframework.security.web.authentication.preauth.j2ee.WebXmlMappableAttributesRetriever" />
</beans:property>
<beans:property name="userRoles2GrantedAuthoritiesMapper">
<beans:bean class="org.springframework.security.core.authority.mapping.SimpleAttributes2GrantedAuthoritiesMapper">
<beans:property name="convertAttributeToUpperCase" value="true" />
</beans:bean>
</beans:property>
</beans:bean>
</beans:property>
</beans:bean>

<beans:bean id="logoutFilter" class="org.springframework.security.web.authentication.logout.LogoutFilter">
<beans:constructor-arg value="/index" />
<beans:constructor-arg>
<beans:list>
<!-- Si se implementa el logout salta un classcastexception. El error del logout es un bug de liberty profile
http://www-01.ibm.com/support/docview.wss?uid=swg1PM90897
-->
<beans:bean class="org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler" />
</beans:list>
</beans:constructor-arg>
</beans:bean>

<beans:bean id="preAuthenticatedProcessingFilterEntryPoint" class="org.springframework.security.web.authentication.Http403ForbiddenEntryPoint" />

<beans:bean id="etf" class="org.springframework.security.web.access.ExceptionTranslationFilter">
<beans:property name="authenticationEntryPoint" ref="preAuthenticatedProcessingFilterEntryPoint" />
</beans:bean>

<beans:bean id="roleVoter" class="org.springframework.security.access.vote.RoleVoter" />

<beans:bean id="httpRequestAccessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased">
<beans:property name="allowIfAllAbstainDecisions" value="false" />
<beans:property name="decisionVoters">
<beans:list>
<beans:ref bean="roleVoter" />
</beans:list>
</beans:property>
</beans:bean>

<beans:bean id="fsi" class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor">
<beans:property name="authenticationManager" ref="authenticationManager" />
<beans:property name="accessDecisionManager" ref="httpRequestAccessDecisionManager" />
<beans:property name="securityMetadataSource">

<sec:filter-invocation-definition-source>
<sec:intercept-url pattern="/admin/*" access="ROLE_ADMINS" />
<sec:intercept-url pattern="/usuarios/*" access="ROLE_USUARIOS" />
</sec:filter-invocation-definition-source>
</beans:property>
</beans:bean>

</beans:beans>

server.xml


<featureManager>
<!-- AUTENTICACION DELEGADA EN CONTENEDOR -->
<feature>ssl-1.0</feature>
<feature>ldapRegistry-3.0</feature>
<feature>appSecurity-2.0</feature>
<feature>localConnector-1.0</feature>
</featureManager>

<!-- AUTENTICACION BASICA -->
<basicRegistry id="basic" realm="customRealm">
<user name="admin" password="{xor}Pi0uKjYrOjwrKi0+" />
<user name="user" password="{xor}Pi0uKjYrOjwrKi0+" />
<group name="admins">
<member name="admin"  />
</group>
<group name="usuarios">
<member name="user" />
</group>
</basicRegistry>
<administrator-role>
<user>admin</user>
<group>admin</group>
</administrator-role>

<webApplication contextRoot="SpringArquitectura" id="spring-sample-app-web"
location="spring-sample-app-web.war" name="spring-sample-app-web">
<application-bnd>
<security-role name="ROLE_USUARIOS">
<group name="usuarios" />
</security-role>
<security-role name="ROLE_ADMINS">
<group name="admins" />
</security-role>
</application-bnd>
</webApplication>

web.xml


<!-- Spring Security -->

<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<security-constraint>
<display-name>Only employees allowed</display-name>
<web-resource-collection>
<web-resource-name>All resources</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>ROLE_USUARIOS</role-name>
<role-name>ROLE_ARQUITECTOS</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>
<realm-name>customRealm</realm-name>
<form-login-config>
<form-login-page>/login</form-login-page>
<form-error-page>/loginfailed</form-error-page>
</form-login-config>
</login-config>
<security-role>
<role-name>ROLE_USUARIOS</role-name>
</security-role>
<security-role>
<role-name>ROLE_ADMINS</role-name>
</security-role>

Anuncios

Historia de AJAX

Para quien no sepa que es AJAX se lo explicaré brevemente..Gmail,Google Map,Calendar, etc etc etc..¿os suenan? Son nuestros queridos servicios de google que nos hacen la vida tan facil y que poseen esa interfaz tan rápida y estupenda creada a partir de AJAX.

AJAX, acrónimo de Asynchronous JavaScript And XML (JavaScript y XML asíncronos, donde XML es un acrónimo de eXtensible Markup Language), es una técnica de desarrollo web para crear aplicaciones interactivas. Éstas se ejecutan en el cliente, es decir, en el navegador del usuario, y mantiene comunicación asíncrona con el servidor en segundo plano. De esta forma es posible realizar cambios sobre la misma página sin necesidad de recargarla. Esto significa aumentar la interactividad, velocidad y usabilidad en la misma.

AJAX es una combinación de tres tecnologías ya existentes:

  • XHTML (o HTML) y hojas de estilos en cascada (CSS) para el diseño que acompaña a la información.
  • Document Object Model (DOM) accedido con un lenguaje de scripting por parte del usuario, especialmente implementaciones ECMAScript como JavaScript y JScript, para mostrar e interactuar dinámicamente con la información presentada.
  • El objeto XMLHttpRequest para intercambiar datos asincrónicamente con el servidor web. En algunos frameworks y en algunas situaciones concretas, se usa un objeto iframe en lugar del XMLHttpRequest para realizar dichos intercambios.
  • XML es el formato usado comúnmente para la transferencia de vuelta al servidor, aunque cualquier formato puede funcionar, incluyendo HTML preformateado, texto plano, JSON y hasta EBML.

Como el DHTML, LAMP o SPA, AJAX no constituye una tecnología en sí, sino que es un término que engloba a un grupo de éstas que trabajan conjuntamente.

Tabla de contenidos

Historia de Ajax

A pesar de que el término “Ajax” fuese creado en 2005, la historia de las tecnologías que permiten Ajax se remonta a una década antes con la iniciativa de Microsoft en el desarrollo de Scripting Remoto. Sin embargo, las técnicas para la carga asíncrona de contenidos en una página existente sin requerir recarga completa remontan al tiempo del elemento iframe (introducido en Internet Explorer 3 en 1996) y el tipo de elemento layer (introducido en Netscape 4 en 1997, abandonado durante las primeras etapas de desarrollo de Mozilla). Ambos tipos de elemento tenían el atributo src que podía tomar cualquier dirección URL externa, y cargando una página que contenga javascript que manipule la página paterna, pueden lograrse efectos parecidos al Ajax.

El Microsoft’s Remote Scripting (o MSRS, introducido en 1998) resultó un sustituto más elegante para estas técnicas, con envío de datos a través de un applet Java el cual se puede comunicar con el cliente usando JavaScript. Esta técnica funcionó en ambos navegadores, Internet Explorer versión 4 y Netscape Navigator versión 4. Microsoft la utilizó en el Outlook Web Access provisto con la versión 2000 de Microsoft Exchange Server.

La comunidad de desarrolladores web, primero colaborando por medio del grupo de noticias microsoft.public.scripting.remote y después usando blogs, desarrollaron una gama de técnicas de scripting remoto para conseguir los mismos resultados en diferentes navegadores. Los primeros ejemplos incluyen la librería JSRS en el año 2000, la introducción a la técnica imagen/cookie[1] en el mismo año y la técnica JavaScript bajo demanda (JavaScript on Demand)[2] en 2002. En ese año, se realizó una modificación por parte de la comunidad de usuarios[3] al Microsoft’s Remote Scripting para reemplazar el applet Java por XMLHttpRequest.

Frameworks de Scripting Remoto como el ARSCIF[4] aparecieron en 2003 poco antes de que Microsoft introdujera Callbacks en ASP. NET[5].

Desde que XMLHttpRequest está implementado en la mayoría de los navegadores, raramente se usan técnicas alternativas. Sin embargo, todavía se utilizan donde se requiere una mayor compatibilidad, una reducida implementación, o acceso cruzado entre sitios web. Una alternativa, el Terminal SVG[6] (basado en SVG), emplea una conexión persistente para el intercambio continuo entre el navegador y el servidor.

Navegadores que permiten AJAX

Debe tenerse en cuenta que ésta es una lista general, y el soporte de las aplicaciones AJAX dependerá de las características que el navegador permita.

Navegadores que no permiten AJAX

  • Opera 7 y anteriores
  • Microsoft Internet Explorer para Windows versión 4.0 y anteriores
  • Microsoft Internet Explorer para Macintosh, todas las versiones
  • Dillo
  • Navegadores basados en texto como Lynx y Links
  • Navegadores para incapacitados visuales (braille)

Véase también

Referencias

  1. Using a GIF as a Data Pipe, explicación y ejemplo de uso de la técnica imagen/cookie (en inglés).
  2. Remote scripting with javascript, Explicación y ejemplo de procesar un archivo JavaScript bajo demanda (en inglés).
  3. microsoft.public.scripting.remote, sustitución del applet Java por el objeto XMLHttpRequest (en inglés).
  4. ARSCIF, A Framework for Asynchronous Remote–Script Callback Invocation (en inglés)
  5. Script Callbacks in ASP.NET (en inglés)
  6. protocolo SVGT (en inglés).

Enlaces externos

Extraido de http://es.wikipedia.org

Como registrarse en 1000 webs y no ser spameado en el intento

Un gran problema que tenemos en muchas webs a las que accedemos son esos temidos registros…¿qué harán con nuestros mails? ¿Los venderán? ¿Los usarán para vender viagra?¿droga? ¿enlarge your pennis quizá?.

Bueno para solucionar esto tenemos este interesante plugin para Firefox que nos permitirá crear un correo temporal para poder registrarnos en una web. Este plugin se basa en los diferentes servicios de este tipo que existen como temporaryinbox, afrobacon, etc etc… que evitan que tengamos que dar nuestros datos privados a cualquier foro o página que aparece por ahí.

Este plugin se integra con el navegador pudiendo con un par de clicks generar un mail temporal donde nos podrán enviar la clave de registro. Este plugin indispensable para nuestro navegador lo podeis descargar de aquí.

Problema compilando en Java5…

He empezado hace poquito con Java5 y ya empiezo a tener problemillas…quiero poder usar la nueva forma de implementar las colecciones, de forma que para crear un Map lo hago de esta forma:

Map<String, String> parameters = new HashMap<String, String>();
parameters.put(“cadena1″,”cadena2”);

Pues al compilar me sale este bonito error…

[javac] /devspace/workspace/mmPlayPortal/src/java/mmplayportal/filters/vft/LoginMobileFilter.java:128: not a statement
[javac] Map<String, String> parameters = new HashMap<String, String>();
[javac] ^
[javac] /devspace/workspace/mmPlayPortal/src/java/mmplayportal/filters/vft/LoginMobileFilter.java:128: ‘;’ expected
[javac] Map<String, String> parameters = new HashMap<String, String>();
[javac] ^
[javac] 2 errors

Ke alguien me ayudeeeeeeeeeeeeeeeeeeeeeeeeeee

Buscar texto dentro de ficheros en Linux

Bueno muchas veces nos encontramos con los típicos problemas de aplicaciones que usan un puerto cuando queremos usar otro, properties que no sabemos de donde salen, configuraciones que nos gustaría cambiar pero no sabemos como, etc etc etc…

Normalmente esto suele venir en archivos de configuración que nos costará horas y horas de google hasta que damos con el maldito archivo en cuestión, para buscar texto en todos los archivos a partir de un directorio podemos usar este comando de consola que nos vendrá de maravilla:

find . -exec grep -l texto_a_buscar {} \;

Espero que esto os ayude a resolver bastantes quebraderos de cabeza.

Optimizador de código en Java (PMD)

PMD escanea el código Java en busca de problemas potenciales como :

  • Posibles bugs – try/catch/finally/switch incompletos.
  • Código que no se usa : variables locales, parámetros y métodos privados.
  • Código poco optimo – mejor uso de String/StringBuffer
  • Expresiones redundantes – if innecesarios, for loops que podrían ser while loops…
  • Código duplicado – código copiado y pegado significa bugs copiados y pegados

Puedes descargarlo desde aquí y puedes conseguir un resumen de todas las reglas en la página de reglas.

PMD está integrado JDeveloper, Eclipse, JEdit, JBuilder, BlueJ, CodeGuide, NetBeans/Sun Java Studio Enterprise/Creator, IntelliJ IDEA, TextPad, Maven, Ant, Gel, JCreator y Emacs.

Para instalarlo en Eclipse la solución mas sencilla es seguir estos pasos…

Nos vamos a actualizaciones de software y buscar:

Añadiremos un nuevo sitio:

Una vez instalado ya tendremos en nuestro menú derecho la opción de PMD:

Tanto en las preferencias del proyecto como en las principales podemos parametrizar PMD y visualizar y administrar las reglas:

Podremos pinchar con el botón derecho encima de una clase o proyecto y en el menú contextual de PMD elegir la opción que más nos interese (yo creo que Check Code with PMD es la nuestra). Esto nos mostrará un listado de los bugs o códigos factibles de ser mejorados.

Extraido de pmd.sourceforge.net y http://www.adictosaltrabajo.com