J'ai du faire face au même problème que toi il y a quelques temps. Tu devrais pouvoir y arriver en utilisant ta méthode (vérifies que tu ais les bons champs dans les autres modeles de User : mail, username, password).
Sinon voilà comment moi j'ai procédé et ce n'est pas une mauvaise pratique, juste séparer la logique appli de la logique métier :
Un User est pour moi un utilisateur du site/appli, toute la connection est faite ici avec un couple email/mot de passe.
Un User peut avoir différents profils, comme Student ou Teacher ou les deux. Donc mon modèle a un champ teacher_id et student_id qui sont NULL par défaut.
Lorsque l'User se connecte, il est très simple de savoir si c'est un Student ou un Teacher ou les deux.
Si un User se barre de l'appli et supprime son profil, les données de Student ou Teacher sont conservées (tu peux garder un historique).