2009-02-18 4 views
2

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

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

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

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


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

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

+0

Какой язык? В некоторых средах предусмотрены рамки для этой экспресс-цели, например. JAAS в Java. –

+0

Java, Python и Ruby являются объектно-ориентированными языками. Каждый из них имеет несколько веб-фреймворков, которые это делают. Какой язык? Какая структура? Поскольку это уже сделано, вы должны найти источник. Что вы действительно спрашиваете? –

+0

Это хорошие вопросы. Ответы ниже хорошо, но не используйте их, если у вас нет уже имеющегося решения или пытаетесь учиться. –

ответ

2

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

Этот пример кода C# 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 и написал несколько классов ;-).

Но если серьезно, на базовом уровне вам понадобится база данных для хранения данных для входа, давайте назовем это «Логин». Затем я отправился на службу, которая обеспечивает аутентификацию, назовем это «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 */ 
    } 
} 

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

0

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

+0

Нет, это называется хорошей инженерией. :) –

3

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

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

что сказавший, я бы создать следующие классы:

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

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

+0

Что вы хотите сказать быстрее? Быстрее создать? –

+0

Нет, быстрее выполнение. Если приложение предназначено для быстрого и аутентификация используется чрезмерно, это может быть более эффективным для обработки в одной функции. Хорошо, чрезмерное использование аутентификации * делает звук немного странным :) – soulmerge

+0

Честно говоря, мне очень трудно полагать, что ООП и процедурный когда-либо будут иметь значение для аутентификации, которая почти всегда зависит от сети. Это преждевременная оптимизация до крайности. –

0

Аутентификация также включает в себя получение учетных данных, и вы захотите включить способ доступа к учетным данным в вашей системе проверки подлинности. Это может быть даже более важным, чем класс 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(); 
    } 
    } 
} 

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