Успешная аутентификация должна быть "нормальным" случаем, поэтому ошибка аутентификации является исключительным случаем.
Каковы различные строки статуса для пользователя в любом случае. Я вижу только два, успех или неудачу. Любая дополнительная информация является потенциальной проблемой безопасности.
Другое преимущество решения с исключениями состоит в том, что оно не может быть вызвано неверно, и случай сбоя более очевиден. Без исключений, вы пишете:
if (authenticate()) {
// normal behaviour...
}
else {
// error case...
}
Вы можете случайно вызвать метод, игнорируя возвращаемое значение. Код "нормального поведения" затем выполняется без успешной аутентификации:
authenticate();
// normal behaviour...
Если вы используете исключения, это не может произойти. Если вы решили не использовать исключения, по крайней мере назовите метод так, чтобы было ясно, что он возвращает состояние, e. g.:
if (isAuthenticated()) {
//...
}