Vous êtes sur la page 1sur 15

T A G A RCHI V E S : S E G URI DA D JS F

Java Series Autenticacin y Autorizacin en J2EE con Glassfish


Posted on March 24, 2012 En el 2011 escrib un post muy parecido a ste, sobre cmo manejar autenticacin y autorizacin a travs filtros; ahora vamos a mejorar la situacin y vamos a manejar la autenticacin a travs de jdbcRealms con el servidor web glassfish, aunque el esquema puede ser utilizado en otros servidores web, y la autorizacin con security-constraints en el web.xml El objetivo? pues lo mismo de siempre; proteger los recursos web a travs de restricciones de seguridad; viendolo a gran escala: Se tienen las tablas de rol, usuario y roles por usuario en una base de datos relacional (a los roles se los conoce como grupos en ste mbito) Se define en el archivo web.xml los recursos protegidos (security-constraint) y se indica que roles tienen acceso a estos recursos (authorization-constraint), los roles que se definen aqu no necesariamente deben coincidir con el nombre del grupo en la base de datos. En el archivo sun-web.xml se hace el mapeo entre rol definido en el archivo web.xml y el grupo (rol) en la base de datos Se crea en el servidor web un Security Realm donde configuramos la base de datos, y las tablas que contienen los datos de usuario y rol Creamos un formulario web, e invocamos al metodo login de la clase HttpServletRequest que por debajo intenta autenticarse contra las tablas de usuario y rol configuradas en el realm. El modelo entidad relacin que espera la configuracin es el siguiente:

Pero lo mas comn es tener un esquema as:

Para hacerlo transparente simplemente hacemos una vista de las tablas de la siguiente manera: 1 2 3 4 S E L E C T F R O M d b o . [ u s e r ] . u s e r n a m e ,d b o . [ u s e r ] . p a s s w o r d ,d b o . r o l e . r o l e d b o . [ u s e r ]I N N E RJ O I N d b o . u s e r _ r o l eO Nd b o . u s e r _ r o l e . u s e r n a m e=d b o . [ u s e r d b o . r o l eO Nd b o . u s e r _ r o l e . r o l e _ i d=d b o . r o l e . i d

Al hacer un select sobre la vista debe devolver los usuarios con sus roles asignados:

Ahora vamos a configurar el glassfish; lo primero es considerar tener el driver jdbc en el classpath del servidor, lo recomendable es colocarlos en la carpeta: [ruta_instalacin_glassfish]/glassfish/domains/tu_domain/lib/ext Ahora accedemos a la consola de administracin, que por defecto se accede por http://localhost:4848 , comenzamos creando un pool de conexiones, dentro de

Resources-JDBC-JDBC Connection Pools creamos un pool, que consta de 2 pasos: En el paso 1 le damos un nombre al pool y definimos a que tipo de base de datos se va a conectar

En el paso 2 colocamos los datos para la conexin:

Una vez creado el pool, comprobamos que todo esta correcto validando con un ping desde la consola de glassfish:

Una vez definido el pool creamos un recurso jdbc dentro de Resources-JDBC-JDBC Resources, simplemente le asignamos un nombre y como pool seleccionamos al pool de conexiones creado anteriormente:

Finalmente nos falta crear el realm de seguridad dentro de Configurations-server_configSecurity-Realms, lo primero es darle un nombre, el cual vamos a utilizar luego en la configuracin del web-xml de la aplicacin web, la configuracin va de la siguiente manera:

Lo que se debe tomar en cuenta: En classname debemos escoger com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm , en el JAASContext debemos colocar jdbcRealm , en el JNDI colocamos el nombre del JDBCResource creado anteriormente, en los campos User Table y Group Table colocamos el nombre de la vista que hicimos de las tablas de autenticacin, as mismo con los nombres de los campos de user, password y group (rol); y los datos de user y password para la conexin a la base de datos. Ahora creamos un proyecto web en eclipse configurado para hacer deployment en glassfish, la estructura del sitio consta de la seccin para administradores (admin) y la seccin para editores (editor), en el web.xml debemos configurar todo lo referente a autenticacin y autorizacin: 1 2 3 4 5 6 7 8 < l o g i n c o n f i g > < a u t h m e t h o d > F O R M < / a u t h m e t h o d > < r e a l m n a m e > d e m o S e c u r i t y R e a l m < / r e a l m n a m e > < f o r m l o g i n c o n f i g > < f o r m l o g i n p a g e > / l o g i n . j s p x ? f a c e s r e d i r e c t = t r u e < / f o r m l o g i n p a g e > < f o r m e r r o r p a g e > / l o g i n e r r o r . j s p x < / f o r m e r r o r p a g e > < / f o r m l o g i n c o n f i g > < / l o g i n c o n f i g >

9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 3 0 3 1 3 2 3 3 3 4

< s e c u r i t y r o l e > < r o l e n a m e > w e b A d m i n < / r o l e n a m e > < / s e c u r i t y r o l e > < s e c u r i t y r o l e > < r o l e n a m e > w e b E d i t o r < / r o l e n a m e > < / s e c u r i t y r o l e > < s e c u r i t y c o n s t r a i n t > < w e b r e s o u r c e c o l l e c t i o n > < w e b r e s o u r c e n a m e > a d m i n a r e a < / w e b r e s o u r c e n a m e > < u r l p a t t e r n > / a d m i n / * < / u r l p a t t e r n > < / w e b r e s o u r c e c o l l e c t i o n > < a u t h c o n s t r a i n t > < d e s c r i p t i o n > a d m i n ss h o u l db ea l l o w e dt oa c c e s st h i sr e s o u r c e s < / d e s c r i p t i o n < r o l e n a m e > w e b A d m i n < / r o l e n a m e > < / a u t h c o n s t r a i n t > < / s e c u r i t y c o n s t r a i n t > < s e c u r i t y c o n s t r a i n t > < w e b r e s o u r c e c o l l e c t i o n > < w e b r e s o u r c e n a m e > e d i t o r a r e a < / w e b r e s o u r c e n a m e > < u r l p a t t e r n > / e d i t o r / * < / u r l p a t t e r n > < / w e b r e s o u r c e c o l l e c t i o n > < a u t h c o n s t r a i n t > < d e s c r i p t i o n > e d i t o r ss h o u l db ea l l o w e dt oa c c e s st h i sr e s o u r c e s < / d e s c r i p t i o n < r o l e n a m e > w e b E d i t o r < / r o l e n a m e > < / a u t h c o n s t r a i n t > < / s e c u r i t y c o n s t r a i n t >

El detalle de las configuraciones: El modo de autenticacin configurado es FORM, el realm-name es el realm que creamos dentro de glassfish Creamos 2 tags de security-role, estos roles pueden ser o no los mismos nombres que los que se encuentran en la base de datos, luego vemos donde realizamos el mapeo, por ahora estn definidos 2 roles: webAdmin y webEditor Creamos 2 tags de security-constraint para las areas de administradores y editores, en el auth-constraint colocamos los nombres de los roles definidos en los tags de securityrole, respectivamente para cada seccin Finalmente en el archivo sun-web.xml debemos mapear los nombres de los roles definidos en el archivos web.xml con los roles de la base de datos: 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 < s u n w e b a p pe r r o r u r l = " " > < c o n t e x t r o o t > / J 2 E E S e c u r i t y R e a l m < / c o n t e x t r o o t > < s e c u r i t y r o l e m a p p i n g > < r o l e n a m e > w e b A d m i n < / r o l e n a m e > < g r o u p n a m e > A d m i n i s t r a t o r < / g r o u p n a m e > < / s e c u r i t y r o l e m a p p i n g > < s e c u r i t y r o l e m a p p i n g > < r o l e n a m e > w e b E d i t o r < / r o l e n a m e > < g r o u p n a m e > E d i t o r < / g r o u p n a m e > < / s e c u r i t y r o l e m a p p i n g > < c l a s s l o a d e rd e l e g a t e = " t r u e "/ > < j s p c o n f i g > < p r o p e r t yn a m e = " k e e p g e n e r a t e d "v a l u e = " t r u e " > < d e s c r i p t i o n > K e e pac o p yo ft h eg e n e r a t e ds e r v l e tc l a s sj a v ac o d e . < / < / p r o p e r t y > < / j s p c o n f i g >

1 7

< / s u n w e b a p p >

El sun-web.xml es muy sensible incluso en el orden de los tags, as que tomenlo en cuenta. Finalmente queda hacer la pgina para autenticarnos y probar que funciona todo lo realizado previamente. 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 < h : b o d ys t y l e = " h e i g h t :1 0 0 % ; " > < f : v i e w > < h : f o r mi d = " f o r m " > < h : p a n e l G r i dc o l u m n s = " 2 " > < h : o u t p u t L a b e li d = " u s e r " > U s e r : < / h : o u t p u t L a b e l > < h : i n p u t T e x tv a l u e = " # { l o g i n B e a n . u s e r n a m e } " > < / h : i n p u t T e x t < h : o u t p u t L a b e li d = " p a s s w o r d " > P a s s w o r d : < / h : o u t p u t L a b e l > < h : i n p u t S e c r e tv a l u e = " # { l o g i n B e a n . p a s s w o r d } " > < / h : i n p u t S e c r e t < h : c o m m a n d B u t t o na c t i o n = " # { l o g i n B e a n . l o g i n } "v a l u e = " L o g i n " < / h : p a n e l G r i d > < h : m e s s a g e si d = " e r r o r M e s s a g e s " > < / h : m e s s a g e s > < h : p a n e l G r i dr e n d e r e d = " # { r e q u e s t . g e t U s e r P r i n c i p a l ( )! =n u l l } " < ah r e f = " a d m i n / a d m i n I n d e x . j s p x " > A d m i nZ o n e < / a > < ah r e f = " e d i t o r / e d i t o r I n d e x . j s p x " > E d i t o rZ o n e < / a > < / h : p a n e l G r i d > < / h : f o r m > < / f : v i e w > < / h : b o d y >

Detras tenemos un managed bean que se va a encargar de autenticarnos: 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 3 0 < / p r e > @ M a n a g e d B e a n ( n a m e = " l o g i n B e a n " ) @ R e q u e s t S c o p e d p u b l i cc l a s sL o g i n B e a n{ p r i v a t eS t r i n gu s e r n a m e ; p r i v a t eS t r i n gp a s s w o r d ; p u b l i cS t r i n gg e t U s e r n a m e ( ){ r e t u r nu s e r n a m e ; } p u b l i cv o i ds e t U s e r n a m e ( S t r i n gu s e r n a m e ){ t h i s . u s e r n a m e=u s e r n a m e ; } p u b l i cS t r i n gg e t P a s s w o r d ( ){ r e t u r np a s s w o r d ; } p u b l i cv o i ds e t P a s s w o r d ( S t r i n gp a s s w o r d ){ t h i s . p a s s w o r d=p a s s w o r d ; }

p u b l i cv o i dl o g i n ( ) { H t t p S e r v l e t R e q u e s tr e q u e s t=( H t t p S e r v l e t R e q u e s t )F a c e s C o n t e x t . g e t C u r r e n t I n s t a n c e ( ) . g e t r y{ r e q u e s t . l o g i n ( u s e r n a m e ,p a s s w o r d ) ; }c a t c h( E x c e p t i o ne ){ F a c e s C o n t e x t . g e t C u r r e n t I n s t a n c e ( ) . a d d M e s s a g e ( " " , n e wF a c e s M e s s a g e ( F a c e s M e s s a g e . S E V E R I T Y _ E R R O R ," I n v a l i dc r e d e n t i a l s ,t r ya g a i n " } }

3 1 3 2 3 3 3 4 3 5 3 6 3 7 3 8 3 9 4 0 4 1 4 2 4 3 4 4

p u b l i cv o i dl o g o u t ( )t h r o w sS e r v l e t E x c e p t i o n ,I O E x c e p t i o n { H t t p S e r v l e t R e q u e s tr e q u e s t=( H t t p S e r v l e t R e q u e s t )F a c e s C o n t e x t . g e t C u r r e n t I n s t a n r e q u e s t . g e t S e s s i o n ( ) . i n v a l i d a t e ( ) ; r e q u e s t . l o g o u t ( ) ; F a c e s C o n t e x t . g e t C u r r e n t I n s t a n c e ( ) . g e t E x t e r n a l C o n t e x t ( ) . r e d i r e c t ( }

p u b l i cS t r i n gg e t L o g g e d U s e r ( ) { H t t p S e r v l e t R e q u e s tr e q u e s t=( H t t p S e r v l e t R e q u e s t )F a c e s C o n t e x t . g e t C u r r e n t I n s t a n c e ( ) . g e i f ( r e q u e s t . g e t U s e r P r i n c i p a l ( )! =n u l l ) r e t u r nr e q u e s t . g e t U s e r P r i n c i p a l ( ) . g e t N a m e ( ) ; r e t u r n" " ; } }

El mtodo principal del bean es el login donde como vemos de manera transparente ejecutamos request.login y esto automagicamente nos trata de autenticar utilizando el security realm definido en el glassfish, si tratamos de acceder a las secciones de admin o editor nos hace una especie de redirect a la pagina de login, pero como vemos mantiene la url:

Si nos autenticamos con credenciales correctas la pgina de login nos presenta el men para acceder a las distintas secciones, ya que estamos utilizando la propiedad rendered del panel para indicarle cuando mostrarse:

Si el usuario con el que nos autenticamos tiene un rol que tiene acceso a las secciones

definidas con los security-constraints internamente el servidor le dara acceso sin problemas, automticamente hace la validacion entre los roles asignados en la base de datos con la autorizacin que tienen los mismos en el web.xml.

En este caso el usuario gishac tiene ambos roles, si se autentican con un usuario que tiene un rol que no tiene acceso a la seccin el servidor le niega el acceso al recurso, para el ejemplo me autentico con el usuario editor que solo tiene el rol Editor.

En asp.net hay una caracterstica que la maneja de modo automtica la plataforma, cuando un usuario que no esta autenticado trata de acceder a una zona protegida y es enviado a la pgina de login y se autentica, automticamente es redirigido a la pgina que le fue negado el acceso, en jsf hay que usar un pequeno artificio, el cual consiste en crear en el bean una

propiedad que contiene el valor de la pgina a redirigir, y en el metodo login validamos si tiene algun valor para redirigirlo; finalmente el cdigo del bean queda as: 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 3 0 3 1 3 2 3 3 3 4 3 5 3 6 3 7 3 8 3 9 4 0 4 1 4 2 4 3 4 4 4 5 4 6 4 7 4 8 4 9 5 0 5 1 5 2 5 3 5 4 5 5 5 6 5 7 5 8 @ M a n a g e d B e a n ( n a m e = " l o g i n B e a n " ) @ R e q u e s t S c o p e d p u b l i cc l a s sL o g i n B e a n{ p r i v a t eS t r i n gu s e r n a m e ; p r i v a t eS t r i n gp a s s w o r d ; @ M a n a g e d P r o p e r t y ( v a l u e = " # { p a r a m . f r o m } " ) p r i v a t eS t r i n gf r o m ; p u b l i cS t r i n gg e t F r o m ( ){ r e t u r nf r o m ; } p u b l i cv o i ds e t F r o m ( S t r i n gf r o m ){ t h i s . f r o m=f r o m ; } p u b l i cS t r i n gg e t U s e r n a m e ( ){ r e t u r nu s e r n a m e ; } p u b l i cv o i ds e t U s e r n a m e ( S t r i n gu s e r n a m e ){ t h i s . u s e r n a m e=u s e r n a m e ; } p u b l i cS t r i n gg e t P a s s w o r d ( ){ r e t u r np a s s w o r d ; } p u b l i cv o i ds e t P a s s w o r d ( S t r i n gp a s s w o r d ){ t h i s . p a s s w o r d=p a s s w o r d ; }

p u b l i cv o i dl o g i n ( ) { H t t p S e r v l e t R e q u e s tr e q u e s t=( H t t p S e r v l e t R e q u e s t )F a c e s C o n t e x t . g e t C u r r e n t I n s t a n t r y{ r e q u e s t . l o g i n ( u s e r n a m e ,p a s s w o r d ) ; i f ( f r o m! =n u l l ) { F a c e s C o n t e x t . g e t C u r r e n t I n s t a n c e ( ) . g e t E x t e r n a l C o n t e x t ( ) . r e d i r e c t ( f r o m ) ; } }c a t c h( E x c e p t i o ne ){ F a c e s C o n t e x t . g e t C u r r e n t I n s t a n c e ( ) . a d d M e s s a g e ( " " , n e wF a c e s M e s s a g e ( F a c e s M e s s a g e . S E V E R I T Y _ E R R O R ," I n v a l i dc r e d e n t i a l s , } }

p u b l i cv o i dl o g o u t ( )t h r o w sS e r v l e t E x c e p t i o n ,I O E x c e p t i o n { H t t p S e r v l e t R e q u e s tr e q u e s t=( H t t p S e r v l e t R e q u e s t )F a c e s C o n t e x t . g e t C u r r e n t I n s t a n r e q u e s t . g e t S e s s i o n ( ) . i n v a l i d a t e ( ) ; r e q u e s t . l o g o u t ( ) ; F a c e s C o n t e x t . g e t C u r r e n t I n s t a n c e ( ) . g e t E x t e r n a l C o n t e x t ( ) . r e d i r e c t ( }

p u b l i cS t r i n gg e t L o g g e d U s e r ( ) { H t t p S e r v l e t R e q u e s tr e q u e s t=( H t t p S e r v l e t R e q u e s t )F a c e s C o n t e x t . g e t C u r r e n t I n s t a n i f ( r e q u e s t . g e t U s e r P r i n c i p a l ( )! =n u l l ) r e t u r nr e q u e s t . g e t U s e r P r i n c i p a l ( ) . g e t N a m e ( ) ; r e t u r n" " ; }

Y en el xhtml de la pgina de login colocamos un input hidden: 1

< i n p u tt y p e = " h i d d e n "n a m e = " f r o m "v a l u e = " # { r e q u e s t S c o p e [ ' j a v a x . s e r v l e t . f o r w a r d . r e q u e s t _ u r

El ejemplo puede ser portado a otro servidor web (servlet container, etc etc), por ejemplo tomcat, slo tienen que crear el jdbcRealm en el mismo. Saludos, gish@c Descargar fuentes Posted in J2EE, java , java series, jsf, security, software development, web security | Tagged autenticacion, authentication, authorization, autorizacion jsf, glassfish, java security, login jsf, seguridad java , seguridad jsf | 4 Replies

Java Series Authentication y Authorization en J2EE


Posted on February 28, 2011 Si hay algo de lo que no se pueden quejar las personas que desarrollan en web con asp.net es sobre lo fcil que es el manejo de seguridad a recursos protegidos (authorization) y lo intuitivo de los tipos de autenticacin que ofrece .net (authentication), pero suele ocurrir que por razones laborales/educativas etc dan el salto a otra plataforma de desarrollo y oh! sorpresa donde esta esa seccin de configuracin para proteger los accesos??? Y as empieza la odisea El post de hoy expone justamente el manejo de seguridad en J2EE. Para el ejemplo vamos a crear un proyecto web (El proyecto est con JSF 2) y vamos a definir directorios donde van a estar las pginas de administracin para 2 roles de usuario: Administrador y Super Administrador, controlando el acceso al recurso que le corresponda. La estructura para el ejemplo es la siguiente:

Como se visualiza en el grfico estn claramente definidas las carpetas, en las cuales se supondra que estn las pginas a las que slo se puede tener acceso con ciertos privilegios. Adicionalmente el proyecto cuenta con la pgina forbidden.xhtml que para el caso es la pgina a la que es redirigido el request cuando se trata de acceder a una seccin protegida sin tener las credenciales requeridas, y la pgina index.xhtml que es la pgina de login. El estndar casi por omisin para seguridad en J2EE es Spring Security, pero para alguien que viene de otra plataforma le introduce otro milln mas de conceptos (lo cual no es malo, slo que a veces son tan amplios que nos apartan totalmente el camino de lo que realmente queremos implementar), as que desde la especificacin de Servlets 2.3 tenemos un feature que permite interceptar los requests y de esa manera determinar quien est tratando de acceder a los recursos de la aplicacin; este feature son los Filters. Muchos son los casos de uso en los que nos sirve interceptar requests, pero vamos a enfocarnos en autenticacion y autorizacin. Para definir un filtro simplemente, creamos una clase que implemente la interfaz javax.servlet.Filter, e implementamos los mtodos que nos exige: 1 2 3 4 5 p u b l i cv o i di n i t ( F i l t e r C o n f i gf i l t e r C o n f i g ) ;

p u b l i cv o i dd o F i l t e r ( S e r v l e t R e q u e s tr e q u e s t ,S e r v l e t R e s p o n s er e s p o n s e ,F i l t e r C h a i nc h a i n p u b l i cv o i dd e s t r o y ( ) ;

Tenemos definido el filtro y para interceptar los requests tenemos que configurarlo en el web.xml y mapear las rutas en las que va actuar el mismo, para hacerlo colocamos la

siguiente configuracin: 1 2 3 4 5 6 7 8 < f i l t e r > < f i l t e r n a m e > A u t h A d m i n F i l t e r < / f i l t e r n a m e > < f i l t e r c l a s s > d e m o . s e c u r i t y . A u t h A d m i n F i l t e r < / f i l t e r c l a s s > < / f i l t e r > < f i l t e r m a p p i n g > < f i l t e r n a m e > A u t h A d m i n F i l t e r < / f i l t e r n a m e > < u r l p a t t e r n > / a d m i n i s t r a t i o n / * < / u r l p a t t e r n > < / f i l t e r m a p p i n g >

El primer elemento filter-name es referencial, lo que si es importante es en filter-class colocar el nombre completo de la clase que est implementando el filtro, luego en el siguiente filtername se hace referencia a la declaracin anterior y colocamos la ruta que queremos que el filtro administre, al colocar * cualquier pgina que est dentro de ese contexto ser validada. Para validar en el filtro si el usuario est autenticado y el rol que tiene, en la pantalla de login, una vez validadas las credenciales vamos a almacenar una variable de sesin con un objeto de tipo UserBean, que basicamente tiene el id del usuario y el rol: 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 F a c e s C o n t e x tc o n t e x t=F a c e s C o n t e x t . g e t C u r r e n t I n s t a n c e ( ) ; E x t e r n a l C o n t e x te x t C o n t e x t=c o n t e x t . g e t E x t e r n a l C o n t e x t ( ) ; S t r i n gu r l=" " ; i f ( i s A d m i n ( u s e r ,p a s s w o r d ) ) { u r l=e x t C o n t e x t . e n c o d e A c t i o n U R L ( c o n t e x t . g e t A p p l i c a t i o n ( ) . g e t V i e w H a n d l e r ( ) . g e t A c t i o n U R L ( c o n t e x t ," / a d m i n i s t r a t i o n / a d m i n P a n e l . j s p x " ) ) ; e x t C o n t e x t . g e t S e s s i o n M a p ( ) . p u t ( U S E R _ K E Y ,n e wU s e r B e a n ( u s e r ," a d m i n " e x t C o n t e x t . r e d i r e c t ( u r l ) ; r e t u r n ; } i f ( i s S u p e r A d m i n ( u s e r ,p a s s w o r d ) ) { u r l=e x t C o n t e x t . e n c o d e A c t i o n U R L ( c o n t e x t . g e t A p p l i c a t i o n ( ) . g e t V i e w H a n d l e r ( ) . g e t A c t i o n U R L ( c o n t e x t ," / s u p e r a d m i n / s u p e r A d m i n P a n e l . j s p x " ) ) ; e x t C o n t e x t . g e t S e s s i o n M a p ( ) . p u t ( U S E R _ K E Y ,n e wU s e r B e a n ( u s e r ," s u p e r a d m i n " e x t C o n t e x t . r e d i r e c t ( u r l ) ; r e t u r n ; } }

En el cdigo mostrado se valida si las credenciales son vlidas, si es as lo redirige a la seccin de administracin correspondiente, y finalmente pone en una variable de sesin el objeto de usuario. Como tenemos 2 secciones que queremos validar los requests vamos a crear 2 filtros, uno para validar si es admin y otro para validar si es super admin, por lo tanto configuramos otro filtro en el web.xml: 1 2 3 < f i l t e r > < f i l t e r n a m e > A u t h S u p e r A d m i n F i l t e r < / f i l t e r n a m e > < f i l t e r c l a s s > d e m o . s e c u r i t y . A u t h S u p e r A d m i n F i l t e r < / f i l t e r c l a s s >

4 5 6 7 8

< / f i l t e r > < f i l t e r m a p p i n g > < f i l t e r n a m e > A u t h S u p e r A d m i n F i l t e r < / f i l t e r n a m e > < u r l p a t t e r n > / s u p e r a d m i n / * < / u r l p a t t e r n > < / f i l t e r m a p p i n g >

Hasta ahora tenemos el mapeo de las urls a los filtros que van a validar los request, ahora veamos el desarrollo de las clases que implementan el Filtro de los requests: Filtro para Seccin de Administradores 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 p u b l i cc l a s sA u t h A d m i n F i l t e ri m p l e m e n t sF i l t e r{ p r i v a t eF i l t e r C o n f i gc o n f i g u r a t i o n ; @ O v e r r i d e p u b l i cv o i di n i t ( F i l t e r C o n f i gf i l t e r C o n f i g )t h r o w sS e r v l e t E x c e p t i o n{ t h i s . c o n f i g u r a t i o n=f i l t e r C o n f i g ; }

@ O v e r r i d e p u b l i cv o i dd o F i l t e r ( S e r v l e t R e q u e s tr e q u e s t ,S e r v l e t R e s p o n s er e s p o n s e ,F i l t e r C h a i n i f( ( ( H t t p S e r v l e t R e q u e s t )r e q u e s t ) . g e t S e s s i o n ( ) . g e t A t t r i b u t e ( A u t h B e a n . U S E R _ K E Y )= =n u l l ){ ( ( H t t p S e r v l e t R e s p o n s e )r e s p o n s e ) . s e n d R e d i r e c t ( " . . / f o r b i d d e n . j s p x " }e l s e{ c h a i n . d o F i l t e r ( r e q u e s t ,r e s p o n s e ) ; } } @ O v e r r i d e p u b l i cv o i dd e s t r o y ( ){ c o n f i g u r a t i o n=n u l l ; }

Filtro para Seccin de Super Administradores 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 p u b l i cc l a s sA u t h S u p e r A d m i n F i l t e ri m p l e m e n t sF i l t e r{ p r i v a t eF i l t e r C o n f i gc o n f i g u r a t i o n ; @ O v e r r i d e p u b l i cv o i di n i t ( F i l t e r C o n f i gf i l t e r C o n f i g )t h r o w sS e r v l e t E x c e p t i o n{ t h i s . c o n f i g u r a t i o n=f i l t e r C o n f i g ; }

@ O v e r r i d e p u b l i cv o i dd o F i l t e r ( S e r v l e t R e q u e s tr e q u e s t ,S e r v l e t R e s p o n s er e s p o n s e ,F i l t e r C h a i n

i f( ( ( H t t p S e r v l e t R e q u e s t )r e q u e s t ) . g e t S e s s i o n ( ) . g e t A t t r i b u t e ( A u t h B e a n . U S E R _ K E Y )= =n u l l| |! ( ( U s e r B e a n ) ( ( H t t p S e r v l e t R e q u e s t )r e q u e s t A u t h B e a n . U S E R _ K E Y ) ) . g e t R o l e ( ) . e q u a l s ( " s u p e r a d m i n " )){ ( ( H t t p S e r v l e t R e s p o n s e )r e s p o n s e ) . s e n d R e d i r e c t ( " . . / f o r b i d d e n . j s p x " }e l s e{ c h a i n . d o F i l t e r ( r e q u e s t ,r e s p o n s e ) ; }

@ O v e r r i d e

2 3 2 4 2 5 2 6 2 7

p u b l i cv o i dd e s t r o y ( ){ t h i s . c o n f i g u r a t i o n=n u l l ; } }

Ambas implementaciones son casi idnticas salvo por el caso de que en la de superadmin validamos que adems de que exista en sesin la variable que nos indica que est autenticado, el usuario tenga el rol de superadmin, en caso que no cumpla la condicin se lo redirige a la seccin de acceso restringido. Bueno, eso es todo en el post para ver el ejemplo pueden descargar el cdigo fuente desde aqu, es un proyecto netbeans 6.9 con glassfish. Saludos, gish@c Posted in desarrollo, J2EE, java , java series, jsf, netbeans, security, software development, web security, web2.0 | Tagged autenticacion, authentication, authorization, autorizacion jsf, j2ee , java security, jsf, jsf filter, jsf2, jsf2 authentication, jsf2 authorization, security, seguridad, seguridad j2EE, seguridad java , seguridad jsf | 2 Replies

Vous aimerez peut-être aussi