viernes, 1 de abril de 2011

Autenticación con Glassfish

Agregando autenticación en base de datos para una aplicación web en Glassfish:

Es necesario crear al menos dos tablas. En una tendrá la información del usuario (nombre de usuario y contraseña), en la otra se tendrán los grupos a los que pertenece cada usuario (campos: nombre de usuario y nombre de grupo).

Si es una aplicación jee, hay que crear el acceso a la base de datos, creando los recursos jdbc necesarios (Eso no lo incluiremos aqui).

Como la autenticación será una tarea que realice el servidor de aplicaciones, entonces es necesario agregar en los descriptores de la aplicación, lo siguiente:
- web.xml

<security-constraint>
<display-name>protegido</display-name>
<web-resource-collection>
<web-resource-name>protegido</web-resource-name>
<url-pattern>/faces/protegido/*</url-pattern>
<http-method>GET</http-method>
<http-method>POST</http-method>
<http-method>HEAD</http-method>
<http-method>PUT</http-method>
<http-method>OPTIONS</http-method>
<http-method>TRACE</http-method>
<http-method>DELETE</http-method>
</web-resource-collection>
<auth-constraint>
<role-name>USERS</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>FORM</auth-method>
<realm-name>orclJNDI</realm-name>
<form-login-config>
<form-login-page>/faces/login.xhtml</form-login-page>
<form-error-page>/faces/login_error.xhtml</form-error-page>
</form-login-config>
</login-config>
<security-role>
<role-name>USERS</role-name>
</security-role>


En la sección security-constraint, se agregan los recursos que se protegerán, y dentro se agregará el rol que tiene permiso en esos recursos.
En security-roles se definen los roles existentes en la aplicación.
En la sección login-config, se define el método de autenticación, y como en este caso el método es FORM, también se definen las páginas de login y de error durante el login. En este punto es importante recalcar sobre un detalle: el faces servlet de la aplicación se encarga de responder peticiones /faces/*. Por esta razón, aunque en la estructura de directorios login.xhtml está en la raíz del contenido web, en la configuración del login se debe agregar como /faces/login.xhtml, porque de lo contrario se encontrarán errores como que en IE intenta descargar el recurso en lugar de dibujarlo (render).

- Ahora la pregunta podría ser: hablamos de tablas para usuarios y para grupos, dónde se hablo de roles?. Pues bien, es una característica de glassfish. Entonces, en el archivo sun-web.xml, se agrega el mapping entre roles y grupos:

<security-role-mapping>
<role-name>USERS</role-name>
<group-name>USERS</group-name>
</security-role-mapping>


Pero el archivo de login, en este caso xhtml, debe cumplir con algunas características bastante conocidas, pero que vamos a especificar aqui:
* el action del formulario es el ya conocido
* el campo del usuario: j_username
* el campo de la contraseña: j_password

En el archivo
/glassfish/domains/domain1/config/login.conf
Se debe escribir la información respecto al LoginModule que se va a utilizar, asi:


myRealm {
com.sun.enterprise.security.auth.login.JDBCLoginModule required;
};