Quiero crear un filtro de autorización para mi aplicación web (Para poder restringir el acceso a ciertas páginas).Analizando un documento XML simple con JAXP (JEE6)
he creado un archivo .xml sencillo con las páginas que se permite a cada usuario a visitar:
<access>
<buyer>
<page>buyoffer.xhtml</page>
<page>faq.xhtml</page>
<page>index.jsp</page>
<page>login.xhtml</page>
<page>main.xhtml</page>
<page>registrationSucceded.xhtml</page>
</buyer>
<seller>
<page>sellerpanel.xhtml</page>
<page>faq.xhtml</page>
<page>index.jsp</page>
<page>login.xhtml</page>
<page>main.xhtml</page>
<page>registrationSucceded.xhtml</page>
</seller>
<administrator>
<page>sellerpanel.xhtml</page>
<page>faq.xhtml</page>
<page>index.jsp</page>
<page>login.xhtml</page>
<page>main.xhtml</page>
<page>registrationSucceded.xhtml</page>
</administrator>
</access>
Entonces tengo que hacer el análisis para extraer el valor de las páginas, para poder crear las condiciones para permitir o redirigir (Dependiendo). Solo necesito que alguien diga cómo extraer los valores de esas páginas del xml. Esto es lo que hice hasta ahora:
public class RestrictPageFilter implements Filter {
private FilterConfig fc;
private DocumentBuilder builder;
private Document document;
public void init(FilterConfig filterConfig) throws ServletException {
// The easiest way to initialize the filter
fc = filterConfig;
// Get the file that contains the allowed pages
File f = new File("/allowedpages.xml");
// Prepare the file parsing
try {
builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
document = builder.parse(f);
} catch (ParserConfigurationException e) {
e.printStackTrace();
} catch (SAXException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
HttpServletResponse resp = (HttpServletResponse) response;
HttpSession session = req.getSession(true);
String pageRequested = req.getRequestURL().toString();
// Get the value of the current logged user
Role currentUser = (Role) session.getAttribute("userRole");
if (currentUser != null) {
if(currentUser.getType().equals("BUYER")) {
//Loop BUYER Element of the .xml
//if pageRequested.contains(value of the page at buyer element)
// chain.doFilter(request, response);
// Else
// Redirect the user to the main page
}
else if(currentUser.getType().equals("SELLER")) {
//Same as above just for seller element
}
else if(currentUser.getType().equals("ADMINISTRATOR")) {
//Same as above just for administrator element
}
}
}
public void destroy() {
// Not needed
}
}
En los comentarios dentro del método doFilter se explica lo que tengo que hacer. ¿Podría alguien darme un consejo sobre cómo debo repetir el archivo para encontrar los nombres de página para cada uno de los tipos de usuario? Intento seguir ejemplos de JAXP de Internet, pero son más complejos de lo que necesito.
actualización el XML se almacena en WEB-INF/classes
+1 para la seguridad de la homegrowing no es la mejor práctica – ahvargas
Me encantaría usar la seguridad administrada por contenedor, porque sé que es mejor, es solo que tengo dificultades para implementarlo en mi escenario. Creo que hasta que aprenda un poco más me mantendré en este enfoque. P.S ¿Debo agregar algo al archivo web.xml? – sfrj
Nada. Lo anterior es realmente todo lo que necesita hacer para leer el XML. JAXB ya viene incluido con contenedores Java EE 6 (sé que estás usando Glassfish). En Tomcat, tendrías que instalarlo y configurarlo por separado. – BalusC