Olá, tudo bem?
Eu estou desenvolvendo um sistema de login e senha orientado a objetos, para estudar apenas, estou com a seguinte dúvida:
Eu criei uma class DAO do usuário que tem a seguinte função:
public function login($senha, $login) {
$sql = 'select * from tb_usuarios where strUsuarioLogin = "' . $login . '" and strUsuarioSenha = "' . $senha . '"';
$executa = mysqli_query($this->conexao->getCon(), $sql);
if(mysqli_num_rows($executa)>0){
return true;
}else{
return false;
}
}
Eu queria adaptar esta função para trazer os dados do usuário, eu sei que eu poderia retornar a ID e simplesmente fazer uma query dentro do meu index.php, porém eu acredito que assim estaria errado (fora dos padrões da oop), então eu tentei modificar da seguinte forma:
public function login($senha, $login) {
$sql = 'select * from tb_usuarios where strUsuarioLogin = "' . $login . '" and strUsuarioSenha = "' . $senha . '"';
$executa = mysqli_query($this->conexao->getCon(), $sql);
if(mysqli_num_rows($executa)>0){
return mysqli_fetch_assoc($executa);
}else{
return false;
}
}
Ele me retornou os dados quando eu jogo isso num var dump, mas se eu eu tento puxar um único dado, tipo $user[''strUsuarioLogin']; ele fala que não existe.
Então ai vai a minha dúvida, como eu posso puxar dados do banco nessa lógica?
Obrigado :D
Se está tentando fazer orientado a objetos, já está fazendo errado. Um método de login, apenas realiza o login. Qualquer coisa além disso, é além da responsabilidade dele. Ou seja, estará violando a S.R.P. (Single Responsibility Principle). Além disso, seu código possui falhas de segurança.
Voltando ao ponto principal, detenha-se a uma interface lógica. Como, por exemplo:
A interface LoginService, define quem gerencia o Login do sistema. Ela fica responsável por cuidar de qualquer aspecto do login (sessão de usuário, quanto tempo expira, se há usuário logado, "lembra-me", etc...).
/**
* Responsible by the login management
* @author Gabriel Heming
**/
interface LoginService
{
/**
* Realize the login of an user
* @param string $username
* @param string $password
* @throws RuntimeExpception If it isn't possible to realize the login
**/
public function login(string $username , string $password) : void;
/**
* Return if an user is logged
* @return boolean
**/
public function hasUserLogged() : bool;
/**
* Return the user authenticated
* @return User
* @throws RuntimeExpception If there isn't user authenticated
**/
public function hasUserAuthenticated() : bool;
}
Perceba que, conforme documentado, o método login não retorna absolutamente nada, apenas lançará uma exception quando não for possível realizar o login. Mostrarei melhor mais para o fim.
Para gerenciar o login, LoginService precisa autenticar um usuário. Para isso, ela faz o uso da interface UserService Essa interface, por sua vez, trata dos aspectos do usuário. Ou seja, toda a regra de negócio que é pertinente a um usuário.
/**
* Manage any aspects of an user
* @author Gabriel Heming
**/
interface UserService
{
/**
* Authenticate the user
* @param string $username
* @param string $password
* @return boolean True if the user exists and the password match
**/
public function auth(string $username , string $password) : bool;
/**
* Return an user by his username
* @param string $username
* @return User The User object
**/
public function getUser(string $username) : User;
}
Já a interface UserService, trata dos aspectos do usuário. O método auth (autenticação), ele pode ser contraditório aonde deve estar. Entretanto, vamos aos "aspectos comuns" de onde ele pode ser utilizado:
- Login;
- Alteração de senha (quando a senha anterior deve ser validada para que uma nova senha seja inserida).
Se for ir mais a fundo:
- Autenticação via serviços (WS, Rest, API, etc...).
Ou seja, o método se preocupa apenas em autenticar o usuário. Ele não precisa informar se o problema é o usuário que não existe ou a senha que não confere, apenas se autenticou ou não.
Isso são interfaces básicas, bem grosseiras mesmo. Entretanto, demonstram o que cada participante deve se preocupar.
Quanto ao uso, bem, a coisa fica bem simples:
try
{
//instância do serviço com injeção de dependencia do storage
$loginService = new LoginService(new mysqli(/**dados de conexão**/));
$loginService->login('usuario' , 'minhasenha');
echo "login realizado com sucesso";
$user = $loginService->getUserAuthenticated();
echo "Usuário logado: ".$user->getNome();
}
catch (\RuntimeException $exception)
{
echo $exception->getMessage();
}
Do ponto de vista de orientação a objetos, o que a classe Login faz não é importante. Internamente, ela está utilizando o UserService para autenticar o usuário e para retornar o usuário que está autenticado, mas isso não é importante para a interface.
Agora, do ponto de vista de segurança é outra história e você precisa saber como está sendo realizado o login. E você pode verificar mais no link abaixo: