Autenticação de Usuário e Controle de Acesso Restrito

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?

Eficaz, se programado corretamente, todo mundo é.

Portável diria que SpringSecurity, PhaseListener e Filter.

Se quiser um exemplo de login com filer, que ao meu ver é o mais simples, tem aqui: Aplicação Web Completa Tomcat JSF Primefaces JPA Hibernate.

[quote=jakefrog]Eficaz, se programado corretamente, todo mundo é.

Portável diria que SpringSecurity, PhaseListener e Filter.

Se quiser um exemplo de login com filer, que ao meu ver é o mais simples, tem aqui: Aplicação Web Completa Tomcat JSF Primefaces JPA Hibernate.[/quote]

Opa vlw, ja dei uma olhada… muito bom, aliás ja fiz essa app tb :slight_smile: seguindo seu post, na verdade ja fiz quase todos uhAHUAhuAHuAUHAHUA…

Alguem saberia indicar algum tutorial bem explicativo sobre o spring security? procurei e os que achei, não foram satisfatórios!

Tenho não. Sorry.