Java – Filter url-pattern

marzo 4, 2011

En un proyecto, en el que necesitaba autorización, utilicé un filtro para no tener que modificar mis servlets(RPC, REST, etc). De esta manera el acceso a ciertos recursos, que requieren autorización, pasarían por este filtro.

Los recursos para los que requería autorización eran básicamente servicios -las imágenes, hojas de estilo y demás son de acceso público-

Para crear el filtro solo hay que implementar la interfaz javax.servlet.Filter y luego configurar el archivo web.xml

El problema es que el elemento url-pattern no acepta expresiones regulares y sólo permite usar los comodines como prefijo o sufijo, no en la parte intermedia ni en ambas1. Así que no podría autorizar, por ejemplo, los recursos en “/rest/*/confidencial/*”. Lo que podemos hacer para lograr esto es que todos los Requests pasen por nuestro filtro y en el código del filtro poner la lógica de expresiones regulares.

Así quedaría nuestro archivo web.xml

 <filter>
 <filter-name>AuthorizationFilter</filter-name>
 <filter-class>tsj.web.os.server.security.AuthorizationFilter</filter-class>
 <init-param>
 <param-name>UrisRequiringAuthorization</param-name>
 <param-value><![CDATA[.*/rest/.*/confidencial/.*]]></param-value>
 </init-param>
 </filter>
 <filter-mapping>
 <filter-name>AuthorizationFilter</filter-name>
 <url-pattern>/*</url-pattern>
 </filter-mapping>

Y la clase AuthorizationFilter

public class AuthorizationFilter implements Filter {
 FilterConfig config;

 @Override
 public void init(FilterConfig config) throws ServletException {
 this.config = config;
 }

 @Override
 public void destroy() {
 }

 @Override
 public void doFilter(ServletRequest req, ServletResponse resp,
 FilterChain chain) throws IOException, ServletException {
 try {
 HttpServletRequest request=(HttpServletRequest) req;
 boolean authorized = true;
 String authorizationRequired=this.config.getInitParameter("UrisRequiringAuthorization");
 if(request.getRequestURI().matches(authorizationRequired)){
 authorized = checkAuthorization(request);
 }
 if (authorized) {
 chain.doFilter(req, resp);
 } else {
 ((HttpServletResponse) resp)
 .sendError(HttpServletResponse.SC_UNAUTHORIZED);
 }
 } catch (Exception e) {
 e.printStackTrace();
 ((HttpServletResponse) resp).sendError(
 HttpServletResponse.SC_INTERNAL_SERVER_ERROR,
 "Error in authorization process");
 }
 }
}

Fuentes:

  1. http://stackoverflow.com/
  2. http://regexpal.com/
Anuncios

2 comentarios to “Java – Filter url-pattern”

  1. fer Says:

    Hola estimado ..
    Y no sabes si puedo lograr aplicar un filtro para un proyecto que esta basado solo en JSPS?

    • cirovladimir Says:

      Sería lo mismo para autorizar o no el accesos a tus jsp’s. Por ejemplo, si sólo necesitas revisar la autorizacion sobre los jsp’s situados bajo un directorio /admin/ en el archivo web.xml pondrías:
      UrisRequiringAuthorization

      Si lo que preguntabas es si puedes implementar el filtro en un jsp, la respuesta es no. Tienes que implementar la clase Filter en un Servlet, en el método “checkAuthorization” verificarías los permisos del usuario.


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: