Galera, estou com uma dúvida sobre como autenticar um usuário no meu sistema inteiro. Eu criei uma classe para fazer o login, que pesquisa as informações no banco utilizando JPA (TopLink).
A dúvida: como chamar essa classe antes de qualquer coisa sem ter que colocar uma chamada dela em todas as classes do meu sistema?
Após o login ser feito pela primeira vez, as informações do usuário vão estar em session, e eu queria verificar se essas informações ainda são válidas antes de fazer qualquer coisa.
Atomus,
Adicione em seu web.xml um filtro.
...
...
...
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<filter>
<filter-name>SecurityFilter</filter-name>
<filter-class>br.com.seupacote.view.util.SecurityFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SecurityFilter</filter-name>
<url-pattern>*.jsp</url-pattern>
</filter-mapping>
<filter-mapping>
<filter-name>SecurityFilter</filter-name>
<url-pattern>*.jspx</url-pattern>
</filter-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
...
...
...
Defina a classe SecurityFilter como exemplificado abaixo.
public class SecurityFilter implements Filter {
// A página de login
private static final String LOGIN_PAGE_URI = "/faces/sistema/login.jspx";
// Objeto para registro de LOG
private Log logger = LogFactory.getLog(this.getClass());
// Um conjunto de recursos restritos
private Set restrictedResources;
/**
* Inicializa Filtro.
*/
public void init(FilterConfig filterConfig) throws ServletException {
// Adicione nesse conjunto as páginas que deverão ser acessadas após login.
this.restrictedResources = new HashSet();
this.restrictedResources.add("/faces/sistema/login.jspx");
this.restrictedResources.add("/faces/sistema/home.jspx");
this.restrictedResources.add("/faces/sistema/cliente.jspx");
}
/**
* Objeto Padrão doFilter.
*/
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException,
ServletException {
this.logger.debug("doFilter");
String contextPath = ((HttpServletRequest)req).getContextPath();
String requestURI = ((HttpServletRequest)req).getRequestURI();
if (requestURI.contains(LOGIN_PAGE_URI) && this.authorize((HttpServletRequest)req)) {
logger.debug("Usuário já foi autorizado.");
((HttpServletRequest)req).getRequestDispatcher(HOME_PAGE_URI).forward(req, res);
} else if (this.contains(requestURI, contextPath) && !this.authorize((HttpServletRequest)req)) {
logger.debug("Falha na autorização");
((HttpServletRequest)req).getRequestDispatcher(LOGIN_PAGE_URI).forward(req, res);
} else {
logger.debug("Autorização bem sucedida");
chain.doFilter(req, res);
}
}
public void destroy() { }
private boolean contains(String value, String contextPath) {
Iterator ite = this.restrictedResources.iterator();
while (ite.hasNext()) {
String restrictedResource = (String)ite.next();
if ((contextPath + restrictedResource).contains(value)) {
return true;
}
}
return false;
}
private boolean authorize(HttpServletRequest req) {
LoginBean acesso = (LoginBean)req.getSession().getAttribute("LoginBean");
if (acesso != null && acesso.getLoggedIn()) {
return true;
} else {
return false;
}
}
}
@braços,