Boa tarde senhores,
Estou em um dilema, e gostaria da ajuda dos senhores, estou implementando a autenticação de usuários em meu projeto JSF, controle de acesso a conteúdo restrito e etc…
Pois bem, gostaria de saber dos senhores, qual seria a solução mais viável.
Bem conheço as seguintes soluções:
- JAAS
- Utilizando PhaseListener
- Utilizando Filter
- Spring Security
Dilema:
-
JAAS, pelo que pude ver ele é dependente do servidor de aplicação, logo se adotar esta implementação teria de configurar meu servidor correto?
-
PhaseListener, ja consegui desenvolver alguma coisa aqui, porém não consigo fazer com que ele trabalhe com redirect, e se for para trabalhar sem o redirect, não é interessante para minha realidade. Segue abaixo uma implementação básica que já utilizei:
Minha Implementação do PhaseListener
public class ListenerFasesJSF implements PhaseListener {
/**
*
*/
private static final long serialVersionUID = 7972814894436142484L;
@Override
public void beforePhase(PhaseEvent fase) {
// System.out.println("Antes Fase: "+fase.getPhaseId());
if (fase.getPhaseId().equals(PhaseId.RENDER_RESPONSE)) {
LoginBean loginBean = (LoginBean) FacesContextUtil
.getSessionAttribute("loginBean");
if (loginBean == null || !loginBean.getAutenticado()) {
//Aqui irá redirecionar para meu navigation-rule, porém quando coloco redirect no navigation-rule, ele não funciona :(
FacesContextUtil.setNavegacao("login");
}
}
if (fase.getPhaseId().equals(PhaseId.RESTORE_VIEW)) {
Session session = HibernateUtil.getSessionFactory().openSession();
session.beginTransaction();
FacesContextUtil.setRequestSession(session);
}
}
@Override
public void afterPhase(PhaseEvent fase) {
// System.out.println("Depois Fase: "+fase.getPhaseId());
if (fase.getPhaseId().equals(PhaseId.RENDER_RESPONSE)) {
Session session = FacesContextUtil.getRequestSession();
try {
session.getTransaction().commit();
} catch (Exception e) {
System.out.println("Erro no commit da transação");
System.out.println(e.getMessage());
e.printStackTrace();
if (session.getTransaction().isActive()) {
session.getTransaction().rollback();
}
} finally {
session.close();
}
}
}
@Override
public PhaseId getPhaseId() {
return PhaseId.ANY_PHASE;
}
}
Minha implementação do FaceContextUtil, que contém o método de navegação
public class FacesContextUtil {
private static final String HIBERNATE_SESSION = "hibernate_session";
public static void setRequestSession(Session session) {
FacesContext.getCurrentInstance().getExternalContext().getRequestMap()
.put(HIBERNATE_SESSION, session);
}
public static Session getRequestSession() {
return (Session) FacesContext.getCurrentInstance().getExternalContext()
.getRequestMap().get(HIBERNATE_SESSION);
}
public static void setMensagemErro(String mensagem) {
FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_FATAL,
mensagem, mensagem);
FacesContext.getCurrentInstance().addMessage(null, fm);
}
public static Object getSessionAttribute(String nomeAtributo) {
return ((HttpSession) FacesContext.getCurrentInstance()
.getExternalContext().getSession(true))
.getAttribute(nomeAtributo);
}
public static void setSessionAttribute(String nomeAtributo, Object bean) {
((HttpSession) FacesContext.getCurrentInstance().getExternalContext()
.getSession(true)).setAttribute(nomeAtributo, bean);
}
public static void setNavegacao(String outcome) {
FacesContext
.getCurrentInstance()
.getApplication()
.getNavigationHandler()
.handleNavigation(FacesContext.getCurrentInstance(), null,
outcome);
}
}
- Utilização de Filter: é a solulção que utilizo atualmente, porém não consegui fazer com que ao expirar uma sessão, o usuário ao usar alguma ação com ajax, seja redirecionado para a página de login.
public class FiltroSeguranca implements Filter {
public FiltroSeguranca() {
// TODO Auto-generated constructor stub
}
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest req, ServletResponse res,
FilterChain chain) throws IOException, ServletException {
HttpSession session = ((HttpServletRequest) req).getSession();
LoginBean login = (LoginBean) session.getAttribute("loginBean");
if (login == null || !login.getAutenticado()) {
((HttpServletResponse) res).sendRedirect("../login.jsf");
} else {
chain.doFilter(req, res);
}
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
Web.xml
<filter>
<filter-name>Filtro Seguranca</filter-name>
<filter-class>br.com.projeto.controller.filtros.FiltroSeguranca</filter-class>
</filter>
<filter-mapping>
<filter-name>Filtro Seguranca</filter-name>
<url-pattern>/css/*</url-pattern>
<url-pattern>/princ/*</url-pattern>
</filter-mapping>
- Spring Security: vejo muitas pessoas falarem bem dele, porém não tenho conhecimento.
Pois bem gostaria de saber qual é a implementação mais eficaz, e com maior portabilidade?