19

ServiceStack.OrmLite(SqlServer)でServiceStack認証を使用しています。Student、Teacher、Principalなどのさまざまなユーザータイプがあります。すべてのユーザータイプは、他のDbテーブルと関係があります。それを実装するためのベストプラクティスは何ですか?

A)UserAuthテーブルに必要なフィールドを追加し、Black Magicを作成します(UserAuthの作成後、必要な追加情報を手動でテーブルに追加します)

B)Student:UserAuth(UserAuthのすべてのフィールドが複製されます)

C)Student.UserAuthId、UserAuth.Meta [UserType.Student、StudentId]相互参照

D)XService、XFeature、または??を拡張します。

PS:ServiceStackUserAuthテーブルにOwnerフィールドとTypeフィールドを追加する方法について説明します。

4

1 に答える 1

26

UserAuthテーブルとUserAuthDetailsテーブルに追加のメタデータを追加するための戦略がいくつかあります。

独自のカスタムPOCOを使用してUserAuthのスキーマを拡張する場合は、カスタムPOCOを含むクラスをサブクラス化する必要があります。たとえば、 OrmLiteAuthRepositoryOrmLiteAuthRepository<T,T>のソースを参照してください。

public class OrmLiteAuthRepository 
    : OrmLiteAuthRepository<UserAuth, UserAuthDetails>, IUserAuthRepository
{
    public OrmLiteAuthRepository(IDbConnectionFactory dbFactory) 
        : base(dbFactory) { }
}

独自の型指定されたカスタムセッションでUserAuthSessionを拡張する

同時に、型付きのカスタムAuthUserSessionを拡張して提供することをお勧めします。これは、 ServiceStackの 認証機能でサポートされているためです。これは、ユーザーセッションがキャッシュプロバイダー(つまり、RDBMSではない)でブロブされるだけで、スキーマのない永続性の特性が簡単に得られるためです。拡張型をサポートします。

メタディクショナリフィールドにメタデータを追加する

マイナーな拡張機能の場合、カスタム保持メタデータをサポートするために特別に追加された各テーブルのメタ文字列ディクショナリフィールドを使用できます。また、複雑なタイプのブロビングもサポートする便利なメソッドGet<T>も含まれています。Set<T>

userAuth.Set(new Address { ... });
var address = userAuth.Get<Address>();

参照データをRefIdおよびRefIdStrフィールドにリンクする

およびテーブルにはUserAuth、各ユーザー認証レコードまたはユーザーOAuth登録に対して独自のカスタムテーブルなどの外部データを参照するために使用できるフィールドとフィールドもUserAuthDetails含まれています。int? RefIdstring RefIdStr

UserAuth情報を独自のカスタムテーブルに抽出する

もう1つのオプションは、SocialBootstrapApiサンプルデモが行っていることを実行し、ユーザーが正常に認証されるたびに呼び出される独自のカスタムUserSessionのOnAuthenticatedフックをオーバーライドすることにより、UserAuth情報を独自のカスタムテーブルに抽出することです。

これは、セッションデータをカスタムユーザーPOCOにコピーし、それを別のテーブルに保存するSocialBootstrapApiの例です。

public class CustomUserSession : AuthUserSession
{
    public string CustomId { get; set; }

    public override void OnAuthenticated(IServiceBase authService, IAuthSession session, 
        IAuthTokens tokens, Dictionary<string, string> authInfo)
    {
        base.OnAuthenticated(authService, session, tokens, authInfo);

        //Populate all matching fields from this session to your own custom User table
        var user = session.TranslateTo<User>();
        user.Id = int.Parse(session.UserAuthId);
        user.GravatarImageUrl64 = !session.Email.IsNullOrEmpty()
            ? CreateGravatarUrl(session.Email, 64)
            : null;

        //Resolve the DbFactory from the IOC and persist the user info
        using (var db = authService.TryResolve<IDbConnectionFactory>().Open())
        {
            db.Save(user);
        }
    }
}
于 2012-06-20T11:41:46.773 に答える