Rotina de autenticação

Olá !
Estou para montar uma aplicação e uma das coisas que haverá é a autenticação de usuários.

Como não é nada elegante - e funcional - meter lá na classe Usuario o campo login,senha - pensei no seguinte:

classe Usuario - atributos do usuário e sua relação no sistema
classe Login - dados para autenticação
classe FoobarAutenticador - haveria métodos - a principio 1 só - para autenticação deste usuário

Resumidamente seria: FoobarAutenticador.autentica(Login) : Usuario
Tenta encontrar o usuário com o objeto Login, caso o encontre, retorna o Usuario com suas devidas informações para as camadas superiores.

Neste caso o FoobarAutenticador atuaria como uma espécie de Serviço - juro que eu consigo vê-lo também como uma Facade, não sei…

O que acham ?

Opa !
Cara, gostei da sua ideia !

Depois que estive vendo o livro do Fowler onde ele diz que - particularmente não gosta de Services, mesmo não tendo nada contra - fiquei a pensar em como eu poderia melhor desenhar as aplicações evitando ao máximo os Services.

Desta forma que você colocou eu estaria evitando aquele ciclo: Entidade; Service.metodo(recebeEntidade) : retornaEntidade.

Diga-me uma coisa: porque optou por fazer do autenticador uma variável de instância de Usuario ? Não poderia simplemente instanciá-la no Usuario.login() e um abraço ?

Valeu !

Creio que a autenticação no sistema não seja “obrigação” de um objeto Usuario.
Portanto, a responsabilidade de fazer isso pertence ao sistema.

No seu caso, separar as obrigações faz muito sentido, mas, eu faria um pouco diferente.

Imagine o cenário:

class Usuario {
  Autenticador autenticador = new Autenticador();
  // atributos
  boolean login() {
    return autenticador.validarLogin(this);
  }
}

Acho que o uso de componentização nesse caso faria mais sentido.

O Usuario nao sabe autenticar, mas sabe quem faz isso (no caso o autenticador).

At.

[quote=hlegius]Opa !
Cara, gostei da sua ideia !

Depois que estive vendo o livro do Fowler onde ele diz que - particularmente não gosta de Services, mesmo não tendo nada contra - fiquei a pensar em como eu poderia melhor desenhar as aplicações evitando ao máximo os Services.

Desta forma que você colocou eu estaria evitando aquele ciclo: Entidade; Service.metodo(recebeEntidade) : retornaEntidade.

Diga-me uma coisa: porque optou por fazer do autenticador uma variável de instância de Usuario ? Não poderia simplemente instanciá-la no Usuario.login() e um abraço ?

Valeu ![/quote]

Services podem até ser úteis, desde que bem utilizados em seus casos específicos.

Deixar o autenticador como membro da classe te permite utilizar outros métodos específicos dele em outras parte da classe Usuario.
Apenas como mero exemplo, imagine a classe Usuario como segue:

class Usuario {  
  Autenticador autenticador = new Autenticador();  
  // atributos  
  boolean login() {  
    return autenticador.validarLogin(this);  
  }  
  void logout() {
    autenticador.finalizarSessao(this);
  }
}

Se voce deixar para instanciar o autenticador dentro do método login() por exemplo, teria que criar uma nova instancia dentro do método logout().
Fazendo assim, voce pode perfeitamente reutilizar seus objetos.

At.