Professional Documents
Culture Documents
,IJ
!"#"$%$&%'#()'$*%+'%!"#"$%&'(')&*($$"++"',-."$/0%12", -$'%*("."%/&'%$0'#()'%/&0$"%1'2'),,,
9)*2%-#()'$*
3'42"5"67* 8'$*))"55" !0$1'#*$
AB:
?')0=04*40;2% ()'@0*
:)"+&440;2
<')10=04*40;2 "%:)&'>*$
:05"1"
E>
*&1'210*
^4'Q:$*"*'5&'."$/(21H-'K0#(*)10+"$%(")%+'$*))"55*+")'$%'2%*410@"L
!#$1-='KTQU'M!VWJ$1/&V(2&*'XN12EV(2&*U' YFKCZU'Q!!7U'M(<(!2$1#%WL?:&$6 Q"-%$"+'5&'(:%&-%12(21H-'6' (22&*"'B!#$1-='!&2:$1%6D R)), S&;'!&$<12&* N&*%'!&$<12&* !"21(+'!!P !!P'BQ(*D MJ8WY1;&$-(%&U'K6I(%1* K"%"$'5&';[*9:&5('&/#$&*($1(+'B!"+$D OFC'BF(+&-5D )1$&221H-'5&'J$"6&2%"*',-."$/0%12"*4 K&%"5"+"=>(*'0=1+&* J(%$"-&*'5&'51*&\" F))
Entrar
David Gmez Garca Titulado en Ingeniera Tcnica en Informtica por la Universidad Politcnica de Madrid en 1998, David ha participado en proyectos para telecomunicaciones, comercio electrnico, banca, defensa y sistemas de transporte terrestre. Ha liderado proyectos de aplicaciones web, infraestructura SOA, aplicaciones java cliente y pasarelas de comunicacin entre sistemas.
Seguir a @dgomezg 453 seguidores
Twitter:
ltimas Noticias
ltimos Tutoriales
Hola Mundo con Spring 3 MVC Ejecucin de tests unitarios con junit en proyectos ant y su integracin en jenkins y sonar para medir la cobertura. Comentando la AOS 2013 El esquema general del proceso de login con OAuth Vamos a utilizar Spring MVC para la aplicacin web. As que comenzamos por definir en el Web.xml el DispatcherServlet de Spring: 1 2 3 4 <?xml
version="1.0"
encoding="UTF-8"?> <web-app
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
?
Soporte en Sonar para un proyecto multi-lenguaje: configuracin desde Jenkins Integracin de Selenium Grid con Jenkins
5 6 7 8 9 10 11 12 13 14 15 16 17
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <servlet> <servlet-name>springWeb</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>springWeb</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app>
Una vez configurado el DispatcherServlet de Spring, configuramos los componentes de infraestructura de Spring MVC en el fichero {servlet-name}-servlet.xml. En este caso, el fichero se llamar springWeb-servlet.xml 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
? <?xml
version="1.0"
encoding="UTF-8"?> <beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">
<mvc:annotation-driven/>
<!--
Rutas
por
defecto
para
los
archivos
estaticos
-->
<mvc:resources
mapping="/js/**"
location="/js/"/>
<mvc:resources
mapping="/img/*"
location="/img/"/>
<mvc:resources
mapping="**.html"
location="/"/>
<mvc:resources
mapping="/css/**"
location="/css/"/>
<bean
id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
<property
name="prefix"
value="/WEB-INF/jsp/"/>
<property
name="suffix"
value=".jsp"/>
</bean>
</beans>
Con la estructura de Spring y de la aplicacin web creadas, utilizaremos como pgina pblica una versin ligeramente modificada de uno de los ejemplos de Twitter Bootstrap, en la que incluimos un botn con un enlace a la pgina privada: 1 <a
class="btn
btn-large
btn-primary
right"
href="/userHome">Entra</a>
?
Ahora definiremos un controlador de Spring MVC que simplemente pondr informacin del perfil del usuario disponible en la vista: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
? package
com.dgomezg.playground.spring.oauth.controller;
import
org.springframework.security.access.annotation.Secured; import
org.springframework.security.core.context.SecurityContextHolder; import
org.springframework.stereotype.Controller; import
org.springframework.web.bind.annotation.RequestMapping; import
org.springframework.web.bind.annotation.RequestMethod; import
org.springframework.web.bind.annotation.ResponseBody;
@Controller public
class
HomeController
{
@RequestMapping(value="/userHome",
method
=
RequestMethod.GET)
public
void
getUserProfile(Model
model)
{
model.addAttribute("user",
SecurityContextHolder.getContext().getAuthentication().getPrincipal());
}
}
Por ltimo, para acabar la estructura bsica de la aplicacin, preparamos la pgina privada donde mostraremos informacin del usuario registrado (en este caso ser solo el perfil del usuario, para mantener el ejemplo sencillo). Esta pgina la crearemos en /WEB-INF/jsp/userHome.jsp 1 2 3 4 5 6 7 8 <html>
<body>
<div>Usuario
Registrado:
<%=user%></div>
</body> </html>
?
Con esta estructura, tendremos ya la aplicacin base sobre la que aadir la seguridad con el proceso de Login delegado en proveedores externos. Es normal que, en este punto, la aplicacin d un error al pulsar en el botn de "Entrar" de la parte pblica. Eso se debe a que no hemos configurado todava los procesos de seguridad. Vamos ahora a ello. Vamos a empezar con integrar la validacin de usuario con Google.
Consola en Google APIs para dar de alta nuestro proyecto Pulsamos en el botn "Create project..." y en la siguiente pantalla podemos seleccionar los servicios que vamos a querer utilizar de Google. En este caso, como slo vamos a utilizar el Login, no es necesario seleccionar ningn servicio adicional; pasamos a obtener el API Key. Para ello, seleccionamos en el men de la izquierda, la opcin API Access:
Creacin de un cliente para el acceso al API de OAuth de Google Pulsamos en el botn "Create an OAUTH 2.0 client ID..." e introducimos los datos de nuestra aplicacin
En el siguiente apartado, especificamos el tipo de aplicacin, en nuestro caso, una aplicacin web, e indicamos, para nuestro tutorial, que la URL es http://localhost
Tipo del cliente para el acceso al API de OAuth de Google Pulsamos en el botn "Create client ID" y nos llevar al panel de control donde podremos ver el API Key generado que tendremos que configurar ms adelante en nuestra aplicacin. En concreto, necesitaremos los valores del "Client ID" y el "Client Secret".
Datos a usar en el cliente para el acceso al API de OAuth de Google Desde esta consola de administracin podremos crear nuevos clientes de autorizacin ("Create another client ID...") o modificar, por ejemplo la URL a la que Google deber devolver la llamada despus de haber realizado la autenticacin ("Edit settings..."). Volveremos sobre esto un poco ms tarde.
Con esta configuracin, se crea un servletFilter (DelegatingFilterProxy) que buscar en el contexto de configuracin de aplicacin de Spring, un bean con id "springSecurityFilterChain" en quien delegar las comprobaciones de seguridad. Esta configuracin de spring la incorporaremos a un fichero de contexto especfico, que nombraremos como spring- security.xml: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <?xml
version="1.0"
encoding="UTF-8"?> <beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:security="http://www.springframework.org/schema/security"
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.1.xsd">
<security:http>
<security:intercept-url
pattern="/userHome"
access="IS_AUTHENTICATED_FULLY"
/>
<security:intercept-url
pattern="/**"
access="IS_AUTHENTICATED_ANONYMOUSLY"
/>
<security:logout
/>
</security:http>
?
16
</beans>
De momento hemos configurado, a travs de la etiqueta security:http, que utilizaremos seguridad a nivel de peticiones http. Al configurar esta etiqueta, Spring crea y configura el bean springSecurityFilterChain y todos los filtros que forman parte de dicha cadena de filtros de seguridad. Tambin hemos aadido dos patrones de URL con las restriciones de seguridad, de forma que la ruta /userHome solo ser accesible para usuarios que estn autenticados y el resto para usuarios annimos (es decir, aquellos que no se hayan identificado todava). Por iltimo, debemos registrar un Listener que permita cargar y configurar este fichero de seguridad, de forma que el DelegatingFilterProxy funcione como esperamos. Para ello, completamos la definicin de nuestro descriptor web.xml 1 2 3 4 5 6 7 8 9
? <context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:/spring-security.xml</param-value> </context-param>
<listener>
<description>Spring
context
loader
listener</description>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
Con esta configuracin, hemos configurado un ContextLoaderListener que se encargar de crear un contexto de Spring con la configuracin de spring-security.xml. Este contexto de Spring quedar asociado al contenedor de Servlets y, por tanto, accesible para el DispatcherServlet o el DelegatingFilterProxy definido en el mismo web.xml Con este apartado, ya tenemos configurada la gestin bsica de seguridad, pero an no hemos especificado cul es el mecanismo de Login que queremos utilizar.
Una vez aadidas las dependencias, podemos complementar la configuracin de spring-security.xml para hacer uso del proveedor de login
? !-- OAuth Authentication Providers definition --> "google2Provider" class="org.scribe.up.provider.impl.Google2Provider"> name="key" value="{pon aqui el Client ID creado en la consola de Google API (en el punto 1)}"/> name="secret" value="{secret Key de la consola de Google API}"/> name="scope" value="EMAIL_AND_PROFILE"/>
"providersDefinition" class="org.scribe.up.provider.ProvidersDefinition"> name="baseUrl" value="http://localhost:8080/j_spring_oauth_security_check" /> name="providers"> ref bean="google2Provider" /> > > "oAuthProvider" class="com.github.leleuj.ss.oauth.client.authentication.OAuthAuthenticationProvider"> name="providersDefinition" ref="providersDefinition" /> "google2EntryPoint" class="com.github.leleuj.ss.oauth.client.web.OAuthAuthenticationEntryPoint"> name="provider" ref="google2Provider" />
- OAUth Authentication filter --> "oAuthFilter" class="com.github.leleuj.ss.oauth.client.web.OAuthAuthenticationFilter"> name="providersDefinition" ref="providersDefinition" /> name="authenticationManager" ref="authenticationManager" />
Por ltimo, configuramos, tambin en spring-security.xml, para que el proveedor de autenticacin de Spring utilice este proveedor que conecta con Google, y configuramos cual es el entry-point por defecto para la seguridad http: 1 2 3 4 5 6 7 8 9 10
<security:authentication-manager
alias="authenticationManager">
<security:authentication-provider
ref="oAuthProvider"/> </security:authentication-manager>
<security:http
entry-point-ref="google2EntryPoint">
<security:custom-filter
after="CAS_FILTER"
ref="oAuthFilter"
/>
<security:intercept-url
pattern="/userHome"
access="IS_AUTHENTICATED_FULLY"
/>
<security:intercept-url
pattern="/**"
access="IS_AUTHENTICATED_ANONYMOUSLY"
/>
<security:logout
/> </security:http>
?
Por ltimo, ser necesario que volvamos a la consola de APIs de Google y modifiquemos, para nuestra aplicacin, la URL a la que debe volver Google una vez que la autenticacin haya sido realizada con xito. Para ello, sobre el CLient ID que creamos en el segundo paso de este tutorial, pulsamos sobre el enlace "Edit Settings..." y aadimos http://localhost:8080/j_spring_oauth_security_check como URL de callback autorizada para el login
La prueba de la aplicacin
Con esta configuracin, podemos probar a desplegar nuestra aplicacin y comprobar que la autenticacin de google funciona correctamente Una vez desplegada la aplicacin, sin estar identificados an en el sistema, accedemos con el navegador a la direccin de la pgina pblica
Pgina de login para nuestra aplicacin Al pulsar en el botn "Entra", debera llevarnos a la url de la pgina protegida, pero saltar el filtro de seguridad que detecta que no estamos autenticados y, por tanto, no cumplimos las restricciones de seguridad especificadas en spring- security.xml. La accin configurada es autenticarnos utilizando el GoogleProvider que, nos llevar a la pgina de autenticacin de Google:
Login con Google Observamos que la URL ha cambiado y estamos identificndonos en el servidor de Google. Esta es una de las ventajas de OAuth, nuestra aplicacin nunca tiene que gestionar el proceso de validacin, siendo el proveedor de autenticacin quin se encarga de ello y nos dar un token de usuario en caso de que dicha validacin sea correcta. AL introducir nuestro usuario y pasword correctos en Google, se nos redirgir de nuevo a la parte protegida de nuestra aplicacin que, en este caso, simplemente muestra el token de seguiridad devuelto por Google (tal y como lo habamos configurado en nuestro controlador)
Pagina privada en nuestra aplicacin A partir de aqu, slo tendramos que ir aadiendo funcionalidad a nuestra aplicacin, aadiendo nuevos controladores a Spring y especificando sus restriciones de seguridad Cuando hemos configurado la autenticacin delegando el registro en proveedores externos, es habitual, permitir a los usuarios de nuestra aplicacin que puedan utilizar distintas cuentas personales (facebook, twitter, Linkedin, Google u otras). Para ello, una vez que hemos llegado a este punto, podriamos modificar ligeramente el proceso de login para permitir conectar con distintos proveedores de OAuth. Pero dejaremos esta modificacin para un segundo tutorial que publicar prximamente. Por ltimo, he dejado disponible el cdigo de este ejemplo en mi repositorio GitHub con ejemplos de Spring
Esta obra est licenciada bajo licencia Creative Commons de Reconocimiento-No comercial-Sin obras derivadas 2.5
Copyright 2003-2013 All Rights Reserved | Texto legal y condiciones de uso | Banners | Powered by Autentia | Contacto