I think we shouldn't have the base User model be abstract. If we didn't make it abstract, then we'd only need to have 1 piece of code that handles all the authentication logic, instead of having to check multiple *User tables to see if that user exists.