Pues yo sigo poniendo articulitos traducidos por el que os escribe. Son pildorillas de informaci贸n t茅cnica sobre tecnolog铆as (Java) que creo que van bien para saber que existen y para qu茅 sirven. Esta vez es un art铆culo sobre las annotations en aplicaciones web, que podr茅is encontrar en Enterprise Tech Tips de Sun y que est谩 escrito por Shing Wai Chan.
Bueno, vamos a empezar con Using Annotations in Web Applications.
La quinta versi贸n de Java EE (Enterprise Edition) introdujo las llamadas “annotations”, una forma de simplificar el desarrollo y configuraci贸n de aplicaciones empresariales. En el art铆culo Using Security Annotations in Enterprise Beans, publicado el 31 de marzo pasado, se mostr贸 como usar las “anotaciones” para simplificar el desarrollo de aplicaciones seguras que usan enterprise beans. Algunas de las annotations de Java EE 5 son espec铆ficar para las aplicaciones web. Ejemplos de este tipo son @Resource, @EJB, y @WebServiceRef. Otras anotaciones, como @RunAs y @DeclareRoles, est谩n relacionados con la seguridad. Las anotaciones que se relacionan con la seguridad fueron presentados en la “propina” Using Security Annotations in Enterprise Beans.
Aunque se pueden especificar anotaciones en varios componentes de una aplicaci贸n web, no se puede especificar una anotaci贸n en una p谩gina JSp (JavaServer Pages). Sin embargo, las annotations est谩n soportadas en librer铆as web. Esto quiere decir que se pueden especificar anotaciones en librer铆as de tags y filtros de servlets, entre otros sitios. Esto nos suministra un modo de dar seguridad a p谩ginas web y servlets, aunque eso s铆, es necesario especificar la informaci贸n de seguridad adecuada en el fichero web.xml de la aplicaci贸n web.
Este art铆culo muestra como hacer una aplicaci贸n web segura con servlets y p谩ginas JSP. Configurando el fichero web.xml de la aplicaci贸n web, puedes proteger los servlets y p谩ginas JSP que est谩n por encima de una “Secure Sockets Layer connection”. Este es un m茅todo com煤n en un entorno web de producci贸n.
Este art铆culo va acompa帽ado de una ejemplo de paquete de aplicaci贸n web. Los ejemplos de c贸digo del art铆culo est谩n sacados del c贸digo fuente de ejemplo.
El Servlet
Vamos a empezar examinando el servlet de la aplicaci贸n web. En este ejemplo, el servlet invoca un bean de empresa (en este caso, un bean de sesi贸n sin estado) con una interfaz local SlessLocal. El servlet pasa un objeto de mensaje como un atributo de la petici贸n y lo redirige a la p谩gina JSP, display.jsp. Aqu铆 tenemos la mayor parte del c贸digo del servlet:
@DeclareRoles({"arole"})
@RunAs("myrole")
public class TestServlet extends HttpServlet {
private @EJB SlessLocal slessLocal;
public void service(
HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
if (req.isUserInRole("arole")) {
String message = slessLocal.hello("World");
req.setAttribute("EJB_MESSAGE", message);
}
RequestDispatcher rd =
req.getRequestDispatcher("display.jsp");
rd.forward(req, resp);
}
}
La anotaci贸n @EJB se usa para buscar un enterprise bean con la interfaz correspondiente de modo que el bean pueda ser usado por el servlet. La anotaci贸n @DeclareRoles define el rol que usar谩 HttpServletRequest.isUserInRole(String role). El m茅todo isUserInRole determina si el usuario autenticado est谩 incluido en el rol especificado. En este caso, s贸lo un usuario con el rol “arole” har谩 que el servlet devuelva el string de mensaje y los establezca como un atributo de HttpServletRequest.
La annotation @RunAs especifica que el rol “myrole” deber铆a ser usado para acceder al m茅todo SlessLocal.hello(String message) del bean de empresa.
El Enterprise Bean
Aqu铆 est谩 la mayor parte del c贸digo del bean de sesi贸n sin estado:
@Stateless
@Local({SlessLocal.class})
public class SlessBean implements SlessLocal {
@RolesAllowed(value={"myrole"})
public String hello(String message) {
return "Hello, " + message + ", " + new Date();
}
}
Hay que notar que el m茅todo hello est谩 protegido por el uso de la anotaci贸n @RolesAllowed. La anotaci贸n especifica que s贸lo los usuarios autenticados en el rol “myrole” pueden acceder al m茅todo hello.
La JSP y la librer铆a de Tags
La p谩gina JSP, display.jsp, invoca una acci贸n de una librer铆a de tags para JSP y pasa el atributo EJB_MESSAGE como un par谩metro del HttpServletRequest. Aqu铆 ten茅is un trozo del c贸digo de la p谩gina JSP:
<%@taglib prefix="di"
uri="http://java.sun.com/techtip/webann/test-taglib"%>
...
<di:displayInfo ejbMessage="${requestScope.EJB_MESSAGE}"/>
...
El tag handler para el tag lee el valor del par谩metro ejbMessage y lo muestra en HTML. Adem谩s muestra el timeout de login para el DataSource. Aqu铆 est谩 el pertinente c贸digo del tag handler:
public class DisplayInfoTagHandler extends SimpleTagSupport {
private @Resource(name="jdbc/__default") DataSource ds;
...
public void doTag() throws JspException, IOException {
try {
JspWriter out = getJspContext().getOut();
int timeout = ds.getLoginTimeout();
if (ejbMessage != null && ejbMessage.length() > 0)
{
out.println(
"<li> Ejb Message: " + ejbMessage);
}
out.println(
"<li> DataSource login timeout: " + timeout);
...
}
public void setEjbMessage(String ejbMessage) {
this.ejbMessage = ejbMessage;
}
}
La anotaci贸n @Resource en el tag handler se usa para buscar el DataSource con el nombre JNDI, “jdbc/__default”. Este nombre JNDI corresponde a la base de datos Derby por defecto. Si se quiere acceder a la conexi贸n de la base de datos, se puede a帽adir el c贸digo ds.getConnection() al tag handler.
N贸tese tambi茅n que el tag handler define un m茅todo “setter” para el par谩metro ejbMessage.
Dando seguridad al Servlet y a la p谩gina JSP
Este ejemplo da seguridad a la aplicaci贸n mediante el requerimiento de dar un username y un password y usando SSL en la capa de transporte. El username y el password se env铆an como texto plano. No hay nacesidad de modificar el c贸digo Java o la p谩gina JSP de la aplicaci贸n. Para asegurar el servlet y la JSP lo que hay que hacer es configurar el web.xml tal que as铆:
<security-constraint>. Esto protege una URL de modo que un rol especificado pueda acceder a ella. N贸tese que se pueden definir uno o m谩s m茅todos HTTP a los que la restricci贸n de seguridad se puede aplicar usando elementos <http-method> en la restricci贸n de seguridad. Si quieres que la restricci贸n de seguridad se aplique a todos los m茅todos HTTP, simplemente no uses ning煤n elemento <http-method>.<user-data-constraint> y dentro de 茅l un elemento <transport-guarantee>. Establece el valor del elemento <transport-guarantee> a CONFIDENTIAL.<login-config> y dentro de 茅l un elemento <auth-method>. Establece el valor de este elemento a BASIC.Aqu铆 ten茅is un trozo del c贸digo del web.xml:
<security-constraint>
< web-resource-collection>
<web-resource-name>Servlet Application
</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>ttrole</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL
</transport-guarantee>
</user-data-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>default</realm-name>
</login-config>
<security-role>
<role-name>ttrole</role-name>
</security-role>
En este ejemplo, s贸lo los usuarios del rol “ttrole” pueden acceder al servlet y a la JSP. Es m谩s, s贸lo los usuarios que tambi茅n son del rol “arole” podr谩n llamar al bean SlessLocal.
El entorno Java EE usa los roles para autorizaci贸n. Sin embargo, en muchos sistemas operativos, los usuarios est谩n asociados a grupos. La correspondencia rol-seguridad da un enlace entre los conceptos de roles de usuarios y grupos. En un servidor de aplicaciones para Java EE 5 como Sun Java System Application Server del Java EE 5 SDK, se define el security-role-mapping en el fichero sun-application.xml. Aqu铆 tenemos un ejemplo:
<sun-application>
<security-role-mapping>
<role-name>myrole</role-name>
<principal-name>myuser</principal-name>
</security-role-mapping>
<security-role-mapping>
<role-name>ttrole</role-name>
<group-name>ttgroup</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>arole</role-name>
<principal-name>ttuser</principal-name>
</security-role-mapping>
</sun-application>
Ejecutar el c贸digo de ejemplo
<appserv_install_dir>/bin/asadmin start-domain domain1 donde <appserv_install_dir> es el directorio d贸nde se haya instalado el Sun Java System Application Server.User Id: ttuser
Group List: ttgroup
New Password: ttpassword
Confirm New Password: ttpassword
Una vez creado el usuario, crea un segundo usuario del mismo grupo entrando la siguiente info:
User Id: ttuser2
Group List: ttgroup
New Password: ttpassword
Confirm New Password: ttpassword
Esto construye el fichero ear, web.ear, y lo pone en el directorio webann/dist.
Tambi茅n puedes desplegar el fichero ear a trav茅s de la consola de administraci贸n as铆:
Adem谩s puedes desplegar el fichero ear introduciendo el siguiente comando en la linea de comandos:
asadmin deploy webann.ear
Hello, ttuser
Ejb Message: Hello, World, Sat Jun 30 12:04:46 PDT 2007
DataSource login timeout: 0
Si te “logeas” como ttuser2, deber铆as ver algo como:
Hello, ttuser2
DataSource login timeout: 0
La diferencia de la respuesta se debe a los roles de cada uno de los usuarios. El usuario ttuser tiene los roles “ttrole” y “arole”. El usuario ttuser2 tiene s贸lo el rol “ttrole”. En esta aplicaci贸n, s贸lo los usuarios del rol “arole” est谩n autorizados a invocar el m茅todo SlessLocal.hello(String message), el m茅todo que crea el mensaje “Hello, World”.
Cuando finalizas la aplicaci贸n, la puedes replegar (desinstalar) y eliminar los usuarios creados as铆:
Y ya est谩, aqu铆 tenemos otro peque帽o ejemplo de uso de Java EE. A ver si le sirve de utilidad a alguien.
Fuente: Enterprise Tech Tips
[…] Aqu铆 ten茅is el enlace al art铆culo. […]