Maneira mais segura de fazer login

8 respostas
F

Oi gente, tenho um sistema web que estou fazendo usando hibernate e Jsf,

porém estou com algumas dúvidas no sistema de login, eu preciso fazer um login q autentique dois tipos de usuarios diferentes, eu estou usando a seguinte logica abaixo:

public String fazerLogin() {
        Criteria c = sessao.createCriteria(Usuario.class);
        Criterion _login = Restrictions.eq("usu_nome", getUsu_nome());
        c.add(_login);
        Criterion _senha = Restrictions.eq("usu_senha", getUsu_senha());
        c.add(_senha);
        System.out.println("resultado: " + _login + " - " + getUsu_nome());

        if (c.uniqueResult() != null) {
            validated = true;
        } else {
            validated = false;
        }
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("usuariologado", validated);

        if (validated) {
            return "secBemVindo";
        } else {
            FacesContext.getCurrentInstance().addMessage("FormLogin:logar", new FacesMessage("Login ou senha incorretos!"));
            return null;
        }
    }
[code]

so q este metodo so consegue autenticar o usuario, mas nao o tipo dele, por exemplo, na minha tabela de usuario tem o tipo deste usuario, ele pode ser um usuario "comum" ou um "administrador", e cada um deles tem telas proprias para navegar, nessa logica abaixo, eu acho q é mais facil implementar o filtro para este tipo de usuario, porem eu nao sei se é mais seguro, alguem poderia me esclarecer isso?
public String loginPorID() { sessao = CriadorDeSessaoNovo.getSession(); Criteria listagem_query = sessao.createCriteria(Usuario.class); listagem_query.add(Restrictions.eq("usu_nome", getUsu_nome())); listagem_query.add(Restrictions.eq("usu_senha", getUsu_senha()));

List lista_alunos = listagem_query.list();
int tamanho_lista = lista_alunos.size();
String dados = "";
for (int i = 0; i < tamanho_lista; i++) {
Usuario aluno = lista_alunos.get(i);
dados = dados +
"\n " + aluno.getUsu_id() +
" - " + aluno.getUsu_nome() +
" - " + aluno.getUsu_senha()+
" - " + aluno.getUsu_tipo();;

}
JOptionPane.showMessageDialog(null, dados);
if(tamanho_lista == 1){
System.out.println("validou");
sessao.close();
return "secBemVindo";
}

else {
System.out.println("NÃO validou");
sessao.close();
FacesContext.getCurrentInstance().addMessage("FormLogin:logar", new FacesMessage("Login ou senha incorretos!"));
return null;

}
[code]

8 Respostas

FernandoFranzini

Implementar uma aplicação web segura vai muito além de fazer um managed bean que valida o usuário e um filtro.
[list]Opções para implementação - http://fernandofranzini.wordpress.com/2009/09/09/autenticacao-e-autorizacao/[/list][list]Plano básico de vulnerabilidades - http://fernandofranzini.wordpress.com/2010/12/16/plano-de-vulnerabilidades/[/list]

F

Achei muito interessante seus artigos, principalmente o segundo q fala sobre as várias maneiras de como podemos ser atacados, mas ainda tenho dúvidas sobre a minha forma de autenticar usúario, caso alguém possa opinar, ficaria muito grato, t+

FernandoFranzini

Basicamente falando:

  1. Implemente autenticação com um managed bean (como vc fez)
  2. Implemente autorização
  • para recurso (URL) use um filtro servlet.
  • para funções (partes das paginas) use a propriedade rendered do JSF.
    Veja que no artigo tem varios exemplos diferentes de fazer a mesma coisa.
    A sua duvida esta aonde?
F

a minha duvida esta na maneira de validar o usuario usando o managed bean, tenho dois metodos para faze-lo e gostaria de saber qual é a melhor ou mais seguro,

o diferencial do primeiro esta no

if (c.uniqueResult() != null)

e o do segundo esta no

if(tamanho_lista == 1)

primeira forma

public String fazerLogin() {
        Criteria c = sessao.createCriteria(Usuario.class);
        Criterion _login = Restrictions.eq("usu_nome", getUsu_nome());
        c.add(_login);
        Criterion _senha = Restrictions.eq("usu_senha", getUsu_senha());
        c.add(_senha);
        System.out.println("resultado: " + _login + " - " + getUsu_nome());

        if (c.uniqueResult() != null) {
            validated = true;
        } else {
            validated = false;
        }
        FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("usuariologado", validated);

        if (validated) {
            return "secBemVindo";
        } else {
            FacesContext.getCurrentInstance().addMessage("FormLogin:logar", new FacesMessage("Login ou senha incorretos!"));
            return null;
        }
    }

segunda forma

public String loginPorID() {
        sessao = CriadorDeSessaoNovo.getSession();
        Criteria listagem_query = sessao.createCriteria(Usuario.class);
        listagem_query.add(Restrictions.eq("usu_nome", getUsu_nome()));
        listagem_query.add(Restrictions.eq("usu_senha", getUsu_senha()));

        List<Usuario> lista_alunos = listagem_query.list();
        int tamanho_lista = lista_alunos.size();        
        
        if(tamanho_lista == 1){
            System.out.println("validou");
            sessao.close();
            return "secBemVindo";
        }
            
        else {
            System.out.println("NÃO validou");
            sessao.close();
            FacesContext.getCurrentInstance().addMessage("FormLogin:logar", new FacesMessage("Login ou senha incorretos!"));
            return null;

        }
        
    }
FernandoFranzini

Não tem diferença nenhuma relacionado com segurança nestes 2 códigos amigo kkkkkk

F

OK, obrigado por ajudar, a pergunta é besta, mas eu tava com medo da segunda forma ser insegura, kkkkkkkkkk

FernandoFranzini

Nos 2 casos vc pegou uma collection…e vc usou user e senha com AND na consulta.
Então fica na mesma :wink:

F

Vc domina mesmo, obrigado pela explicação detalhada, ja comecei a usar o segundo metodo pois achei mais facil de implementar( pois estou acostumado), através dele eu consigo recuperar o tipo de usuario e enviar pra pagina q ele tem aceeso, valeu

Criado 24 de maio de 2011
Ultima resposta 25 de mai. de 2011
Respostas 8
Participantes 2