Объектно-ориентированная функциональность входа

Функциональность входа пользователя очень распространена для многих приложений. Я хотел бы посмотреть, как люди реализуют эту функциональность в Object oriented way.

У меня есть Пользователь, и мне нужно проверить идентификатор пользователя и пароль на систему (это может быть ldap, database и т.д.). Итак, какие классы и операции вы создадите для достижения этой функциональности?

Или OO - плохой выбор для разработки этой функции?

Я собираюсь запустить новый проект, поэтому хочу собрать хорошие варианты.


Я знаю, что есть рамки, которые уже предоставляют это решение. Я использовал их в предыдущих проектах. То, что я пытался увидеть, - это то, как люди реализуют это способом OO.

Я прочитал ответы, и все предложили отдельную службу учетных данных и аутентификации. Если вместо Credentials я использую имя класса как "Пользователь", то не должен ли пользовательский класс иметь метод "login"? Точно так же, как объект Person будет иметь метод напитка вместо DrinkService, или я ошибаюсь, понимая это правильно?

Ответ 1

Точно, насколько это необходимо для расширения? Я бы определил абстрактный класс, Credentials, который инкапсулирует необходимую информацию аутентификации для данной системы. Подкласс для конкретных типов систем. Примером может быть BasicCredentials, который содержит только имя пользователя и пароль. Затем определите интерфейс, который определяет методы аутентификации. Возможно, я бы также определил абстрактный класс Host, который включает дополнительную информацию о хосте. Это может быть слишком много абстракции, в зависимости от того, что вы предполагаете для аутентификации.

Этот примерный код - С# 3.0.

public abstract class Credentials
{
}

public class BasicCredentials : Credentials
{
    public String Username { get; set; }
    public String Password { get; set; }
}

public abstract class Host
{
}

public class IPHost : Host
{
    public IPAddress Location { get; set; }
}

public interface IAuthenticate
{
    bool Authenticate(Credentials creds, Host host);
}

public class BasicAuthenticator : IAuthenticate
{
    public bool Authenticate(Credentials creds, Host host)
    {
        // Check to make sure we're given the right type of parameters
        if (creds is BasicCredentials && host is IPHost)
        {
            // Do your magic here
        }
    }
}

Ответ 2

Или OO - плохой выбор для разработки этой функции?

Я не думаю, что использование OO ограничивает вас каким-либо образом, поэтому, скорее, вопрос должен быть, могу ли я построить эту часть с OO? Другие стили могут быть намного быстрее.

Что, сказав, я бы создал следующие классы:

  • Полномочия
  • AuthenticationService

Кроме того, для класса User потребуется функция getCredentials(). Этот подход означает, что вы всегда аутентифицируетесь с использованием имени пользователя/пароля. Для более широкого подхода позвольте службе AuthenticationService работать с самим объектом User.

Ответ 3

Если вы хотите использовать OO-решение, я бы пошел на использование языка OO и написав несколько классов; -).

Но если серьезно, на базовом уровне вам понадобится база данных для хранения данных входа в систему, позвоните по телефону "Login". Затем я отправился на службу, предоставляющую аутентификацию, и позвонил в эту службу "AuthenticationService". Наконец, вы можете предоставить конкретные реализации каждого из различных типов схем аутентификации, которые вам нужны. Итак, у вас будет что-то вроде:

public class Login {
    private String loginName;
    private String password;

    /* getters / setters */
}

public interface AuthenticationService {
    public boolean isLoginValid(Login login);
}

public class LdapAuthenticationService implements AuthenticationService {
    public boolean isLoginValid(Login login) {
        /* LDAP specifics here */
    }
}

public class DatabaseAuthenticationService implements AuthenticationService {
    public boolean isLoginValid(Login login) {
        /* database specifics here */
    }
}

Используйте зависимость-инъекцию, чтобы получить требуемую конкретную реализацию в вашей системе в зависимости от ваших текущих потребностей.

Ответ 4

Объектно-ориентированный подход заключается в использовании предоставленных классов или поиске библиотеки и подкласса, если он еще не делает то, что вы хотите:)

Ответ 5

Аутентификация также включает в себя получение учетных данных, и вы захотите включить способ доступа к учетным данным в вашей системе проверки подлинности. Это может быть даже более важным, чем уже выделен класс Authenticator.

class CredentialsAccessor {
  public bool hasCredentials(){};
  public Credentials getCredentials();
}
class FormAccessor : CredentialsAccessor {
    // get credentials from a webapp or form
}
class CookieAccessor : CredentialsAccessor {
    // get credentials based on cookie
}
class SessionAccessor : CredentialsAccessor {
    // get credentials from user session
}
class CredentialAccessManager 
{
   list<CredentialsAccessor> m_Credentials;

   Credentials getCredentials() 
   {
     foreach( CredentialsAccessor l_accessor in m_Credentials )
     {
         if( l_accessor.hasCredentials() ) return l_accessor.credentials();
     }
   }
}

Вы подключаете все объекты-аксессоры в список в правильном порядке, и ваш пользователь будет входить в журнал каждый раз.