É incrível como você aprende com a experiência. Saca só a jornada que tive para aprender a implementar segurança na web…
Quando comecei minha carreira como programador, lá por volta de 2005, e tive que implementar meu primeiro controle de acesso eu só sabia fazer isso de uma forma, e era jogando os dados do usuário logado diretamente na sessão:
public String logar(String login, String senha) {
Usuario usuario = this.autentica(login, senha);
if (usuario != null) {
Session sessao = this.getSession();
sessao.setAttribute("usuarioLogado", usuario); // coloca usuario na sessão
return "/home.jsp";
}
return "/login.jsp";
}
Um dos problemas chatos dessa abordagem é que eu tinha que ficar testando se o usuário existia na sessão antes de fazer minhas lógicas de segurança – um saco! Era algo muito parecido com o código abaixo:
Usuario usuario = sessao.getAttribute("usuarioLogado");
if (usuario != null && usuario.getTipo() == ADMIN) {
// logica de negocio...
}
Daí o tempo passou e depois aprendi outra forma mais esperta, que era deixando o usuário logado dentro do controller, no caso do JSF eu deixava dentro do managed bean:
@ManagedBean
@SessionScoped // managed bean na sessão
public class LoginBean {
// outros atributos
private Usuario usuarioLogado;
public String logar() {
// lógica para autenticar usuário e setar atributo usuarioLogado
}
}
Resolveu? Ahhh… não!
Essa abordagem também trazia problemas sutis que eu levei alguns anos pra enxergar, apesar de sutis eles foram bem sérios e sobrecarregaram a memoria do servidor. Por esse motivo, para você não cometer os erros que eu cometi, eu bloguei sobre como representar o usuário logado no meu sistema mas desta vez tirando proveito da OO de verdade:
[Post] OO na prática: representando usuário logado no sistema
Após ler o post sobre essa prática você vai se perguntar porque diabos você não fez isso antes, afinal de contas, basta usar OO para modelar conceitos em objetos, que é algo que fazemos dia a dia para nossas entidades mas que ignoramos quando falamos de segurança.
E aí, como você tem feito pra guardar os dados do usuário logado?