JAAS ou Spring Security?

Bom dia a todos, estou querendo implementar login com segurança no meu site, a duvida é, qual desses dois usar e qual é o mais ágil de implementar para usuários advindos do banco de dados (não pretendo usar XML e sim Anotações)
Meu sistema é Java, JSF, Hibernate, JPA
Obrigado

No título seria JAAS ao invés de SAAS, não?

O JSF possui uma interface chama PhaseListeners, implementando-a você consegue fazer a autorização de qualquer usuário, utilizando código java mesmo.

"Para as aplicações escritas em JavaServer Faces, além da opção de usar servlets filters, estas podem se utilizar de um recurso especifico do JSF chamado da phase listener que é responsável por interceptar e oferecer mecanismos de manipulações referentes as mudanças de eventos ocorridas no ciclo de vida da especificação. Relacionado ao contexto de autenticação e autorização, ela se encaixa perfeitamente para a implementações de controle de usuários, oferendo ao projetista da aplicação mais uma opção arquitetural. Segue abaixo links sobre opções de implementações:

http://www.rodrigolazoti.com.br/?p=56
http://ciromacedo.blogspot.com/2008/06/controle-de-acesso-no-jsf.html
http://archsofty.blogspot.com/2008/11/login-autenticao-e-autorizao-usando.html"

Texto retirado de: https://fernandofranzini.wordpress.com/2009/09/09/autenticacao-e-autorizacao/

PhaseListener além de ser próprio do JSF, é simples de ser utilizado.

Bom dia Mike, obrigado pela resposta! Quanto a segurança ela está em um mesmo patamar que os frameworks que eu citei?

Um PhaseListener é disparado apenas em uma solicitação JSF (isto é, uma solicitação HTTP que chama o FacesServlet). Ele não é disparado quando uma solicitação não-JSF é executada e, portanto, expõe um possível vazamento de segurança em solicitações não-JSF.

Atualmente eu não tive nenhum problema…

1 curtida

A segurança estará na sua programação.

Evite salada de frameworks, se estivesse usando a stack Spring tudo bem, mas você está usando a stack Oracle/Sun com JSF. Nunca usei JSF, mas se o que o @Mike falou permite isso dentro do que já é disponível, entao melhor usar.

2 curtidas

Aqui tem um exemplo utilizando PhaseListener.(Acabei de faze-lo)

Como eu disse, é algo do próprio JSF.

import javax.faces.application.NavigationHandler;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;

public class AutorizacaoPhaseListener implements PhaseListener
{
    private static final long serialVersionUID = 1L;

    @Override
    public void afterPhase(PhaseEvent event)
    {
    	FacesContext facesContext = event.getFacesContext();
    	NavigationHandler nh = facesContext.getApplication().getNavigationHandler();
    	Usuario usuario = (Usuario) facesContext.getExternalContext().getSessionMap().get("usuario");/*Pega o usuário da sessão, é possivel injetar um bean que tenha o usuário, mas se o bean tiver x atributos, o processamento ficará mais pesado atoa*/
    		
    	String paginaAtual = facesContext.getViewRoot().getViewId();
    		
    	if(paginaAtual.contains("/area-do-cliente-logado.xhtml"))
    	{
    		if(usuario == null)//Se for nulo, o usuario tem que logar antes de acessar a sua area
    		{
    			nh.handleNavigation(facesContext, null, "/login.xhtml?faces-redirect=true");
    		}
    		else //Se tiver logado
    		{
    			if(usuario.getAdmin()) //A página é destinada a clientes,  se for admin, será redirecionado a outra página
    			{
    				nh.handleNavigation(facesContext, null, "/admin/index.xhtml?faces-redirect=true");
    			}
    			else//Se não for admin e estiver acessando a area de cliente
    			{
    				//Mantém na página
    			}
    		}
    			
    	}
    	else if(paginaAtual.contains("/admin/index.xhtml"))//área destinada a administradores
    	{
    		if(usuario == null)
    		{
    			nh.handleNavigation(facesContext, null, "/login.xhtml?faces-redirect=true");
    		}
    		else
    		{
    			if(!usuario.getAdmin())//Se NÂO for admin e estiver tentando acessar a area de admin, redirecione para a area do cliente
    			{
    				nh.handleNavigation(facesContext, null, "/area-do-cliente.xhtml?faces-redirect=true");
    			}
                else //Se for admin e esta tentando acessar a area de admin
                {
                     //Mantém na página
                }
    	    }
    	}
    }
}
1 curtida

O problema é que isso é, de certa forma, padrão.
Já tive o desprazer de trabalhar em projetos que mesclavem, inclusive, Primefaces e Richfaces, só por que o Rich tem uns botões diferentões.

A respeito do tópico, faz uns anos já que não vejo quase nada em termos de JAAS. Sem falar que ele é 100% razão dos argumentos do Spring: depende da plataforma onde você roda.
Além disso, eu ainda acho o Spring Security extremamente verboso, nada intuitivo.
O PhaseListener é, ao meu ver, a opção mais tranquila.

Concordando com o que o @javaflex disse, se você está usando JSF, tente aplicar algo que o JSF já encaixa sem maiores dificuldades.
Agora, se a ideia é utilizar algum SSO ou OAUTH, aí sim, pense em Spring security

3 curtidas

Terminei de implementar o spring security, ele vem causando alguns bugs na minha aplicacao por exemplo na hora de calcular o total de itens e valor total do carrinho, fiz uma pesquisa rapida sobre o OAuth e por ser uma ferramenta do Google e dedicada ao Java vou repensar minha implementação. Quanto ao phaseListener achei ele um pouco simples demais, posso ter pesquisado pouco sobre ele… Mas a implementação do OAuth me pareceu bastante oportuna Obrigado a todos por responderem meu topico.