hook_form_alter or overriding the routing and UserLoginForm class
I would definitely go for the second option. In my opinion the form_alter hooks are reserved for 'minor' changes to a form. I always use custom forms as much as possible (extending the original form).