2

ユーザー ログイン機能は、多くのアプリケーションで非常に一般的です。オブジェクト指向の方法でこの機能を実装する方法を知りたいです。

ユーザーがいて、システム (ldap、データベースなど) に対して userId とパスワードを検証する必要があります。では、この機能を実現するには、どのような種類のクラスと操作を作成するのでしょうか?

それとも、OO はこの機能を開発するための悪い選択ですか?

新しいプロジェクトを始めようとしているので、良い選択肢を集めたい.


このソリューションを提供するフレームワークが既にあることは知っています。以前のプロジェクトでそれらを使用しました。私が見ようとしていたのは、人々がこれをOOの方法でどのように実装するかです。

私は答えを読み、誰もが別の資格情報と認証サービスを提案しました。Credentials の代わりにクラス名を User として使用する場合、User クラスには login というメソッドが必要ではないでしょうか? Person オブジェクトが DrinkService の代わりに Drink メソッドを持つように、またはこれを正しく理解するのが間違っていますか?

4

5 に答える 5

3

正確にどの程度の拡張性が必要ですか? 特定のシステムに必要な認証情報をカプセル化する抽象クラス 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
        }
    }
}
于 2009-02-18T11:25:07.553 に答える
2

OO ソリューションが必要な場合は、OO 言語を使用していくつかのクラスを作成します ;-)。

しかし、真剣に、基本的なレベルでは、databean にログイン情報を保存する必要があります。これを「ログイン」と呼びましょう。次に、認証を提供するサービスを探します。それを「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 */
    }
}

現在のニーズに応じて、依存性注入を使用して、必要な具体的な実装をシステムに取得します。

于 2009-02-18T11:25:22.590 に答える
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();
     }
   }
}

すべてのアクセサー オブジェクトを正しい順序でリストに挿入すると、ユーザーは魔法のように毎回ログインします。

于 2009-02-18T23:53:48.657 に答える