19

我将 ServiceStack 身份验证与 ServiceStack.OrmLite (SqlServer) 一起使用。我有不同的用户类型,如学生、教师、校长。所有用户类型都与其他 Db 表有关系。实施它的最佳实践是什么?

A)将必要的字段添加到 UserAuth 表并制作 Black Magic。(在创建 UserAuth 后手动将必要的额外信息添加到表中)

B)学生:UserAuth(UserAuth中的所有字段都将被克隆)

C) Student.UserAuthId, UserAuth.Meta[UserType.Student,StudentId] 相互引用

D) 扩展 XService、XFeature 或 ??

PS:如何将 Owner 和 Type 字段添加到 ServiceStack UserAuth 表。

4

1 回答 1

26

有几种策略可以将额外的元数据附加到UserAuthUserAuthDetails表中,

如果您想用您自己的自定义 POCO 扩展UserAuth的模式,您需要对OrmLiteAuthRepository<T,T>包括您的自定义 POCO 的类进行子类化,例如查看OrmLiteAuthRepository的源代码:

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

使用您自己键入的自定义会话扩展 UserAuthSession

同时扩展和提供一个类型化的、自定义的AuthUserSession是推荐的方法,因为它受到ServiceStack 的 身份验证功能的支持,因为用户会话只是在缓存提供程序(即不在 RDBMS 中)中,它的无模式持久性特征很容易支持扩展类型。

向元字典字段添加额外的元数据

对于次要扩展,您可以使用每个表上的字符串字典字段,这些字段是专门为支持自定义元数据而添加的。它们还包括有用的Get<T>Set<T>方法,这些方法也支持 blobbing 复杂类型:

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

将参考数据与 RefId 和 RefIdStr 字段链接

UserAuthUserAuthDetails表还包括一个int? RefId和一个字段,您可以使用这些string RefIdStr字段来引用外部数据,例如针对每个用户身份验证记录或用户 OAuth 注册的自定义表。

将 UserAuth 信息提取到您自己的自定义表中

另一种选择是执行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 回答