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