Académique Documents
Professionnel Documents
Culture Documents
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
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 ; }
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 ( }
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 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 ( }
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
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
@ 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