Galera,
É o seguinte: preciso criar permissão de acesso. Exemplo: usuario tipo Administrador acessa X páginas, usuário tipo Manager acessa Y páginas.
Logo, estudando e lendo um pouco, eu apliquei o conceito de filtros no meu web.xml para garantir uma autenticação segura. E sei também que de alguma forma (e é o que desejo compreender), que utilizando estes filtros eu consigo fazer a permissão de acesso. Logo, como descrito no meu web.xml abaixo, eu fiz três filtros (três perfis: admin, manager e user). Porém quando eu logo como manager por exemplo, a autenticação é realizada e é redirecionada para a página desejada. Porém, o conteúdo dela não é exibido e sim, está sendo requisitado o login novamente. No meu entendimento, quando mapeamos no filtro manager a tag /pages/* significa que todas as paginas contidas no diretorio pages serão permitidas. Mas não é o que ocorre, fazendo com que a autenticação seja solicitada sempre e nunca a página esperada é exibida, pq é redirecionada para a página de login. No filtro de administrador por exemplo, possuo um outro problema, onde o administrador deveria ter acesso a tudo, e ele não consegue tb acessar o que está dentro dos diretorios ‘pages’ e ‘user’. Estou fazendo a permissão de acesso corretamente? Como fazer com que o filtro seja respeitado de acordo com o perfil do usuário?
Obrigado pela atenção e tenham um ótimo dia!
Web.xml
<filter>
<filter-name>AuthManager</filter-name>
<filter-class>resources.AuthManager</filter-class>
</filter>
<!-- Entity Manager Filter declaration -->
<filter>
<filter-name>AuthUser</filter-name>
<filter-class>resources.AuthUser</filter-class>
</filter>
<filter>
<filter-name>AuthAdmin</filter-name>
<filter-class>resources.AuthAdmin</filter-class>
</filter>
<!-- Entity Manager Filter declaration -->
<filter-mapping>
<filter-name>AuthManager</filter-name>
<url-pattern>/pages/*</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>AuthUser</filter-name>
<url-pattern>/user/*</url-pattern>
</filter-mapping>
<!-- Filter is setup on all requests -->
<filter-mapping>
<filter-name>AuthAdmin</filter-name>
<url-pattern>/admin/*</url-pattern>
</filter-mapping>
AuthAdmin.java
public class AuthAdmin implements Filter {
/** Logger */
protected Logger log = Logger.getLogger(AuthAdmin.class.getName());
private EntityManagerFactory entityManagerFactory;
/**
* @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
* @param config
* @throws javax.servlet.ServletException
*/
public void init(FilterConfig config) throws ServletException {
}
/** (non-Javadoc)
* @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
* @param request
* @param response
* @param chain
* @throws javax.servlet.ServletException
* @throws java.io.IOException
*/
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
HttpSession session = ((HttpServletRequest) request).getSession();
String isAdmin = (String) session.getAttribute("isAdmin");
if (isAdmin == null) {
((HttpServletResponse) response).sendRedirect(session.getServletContext().getContextPath() + "/login.jsf");
} else {
chain.doFilter(request, response);
}
}
/**
* @see javax.servlet.Filter#destroy()
*/
public void destroy() {
entityManagerFactory = null;
}
}
AuthManager.java
public class AuthManager implements Filter {
/** Logger */
protected Logger log = Logger.getLogger(AuthManager.class.getName());
private EntityManagerFactory entityManagerFactory;
/**
* @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
* @param config
* @throws javax.servlet.ServletException
*/
public void init(FilterConfig config) throws ServletException {
}
/**
* @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain)
* @param request
* @param response
* @param chain
* @throws javax.servlet.ServletException
* @throws java.io.IOException
*/
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws ServletException, IOException {
HttpSession session = ((HttpServletRequest) request).getSession();
String manager = (String) session.getAttribute("isManager");
if (manager == null) {
((HttpServletResponse) response).sendRedirect(session.getServletContext().getContextPath() + "/login.jsf");
} else {
chain.doFilter(request, response);
}
}
/**
* @see javax.servlet.Filter#destroy()
*/
public void destroy() {
entityManagerFactory = null;
}

do teste condicional para cliente, quando eu adicionei isto, o perfil de Manager “foi aceito” exibindo a página corretamente ao invés do filtro redirecionar para a tela de login. Porém, como vemos, é um furo do sistema, pois, depois da inserção desta linha, o perfil de cliente vai ter acesso a urls que somente Admin teria. O que não desejamos. Bom, agora, eu preciso saber o que eu posso fazer pra consertar a gambiarra ou fazê-la bunita de vez.