我正在使用ServiceStack.OrmLite(SqlServer)进行ServiceStack身份验证。我有不同的用户类型,如学生,教师,校长。所有用户类型将与其他Db表有关系。 实施它的最佳做法是什么?
A)向UserAuth表添加必要的字段并制作Black Magic。(创建UserAuth后,手动向表中添加必要的额外信息)
B)学生:UserAuth(将克隆UserAuth中的所有字段)
C)Student.UserAuthId,UserAuth.Meta [UserType.Student,StudentId]互引用
D)扩展XService,XFeature或??
PS:如何将所有者和类型字段添加到ServiceStack UserAuth表。
答案 0 :(得分:25)
有几种策略可以将附加元数据附加到 UserAuth 和 UserAuthDetails 表格,
如果你想用你自己的自定义POCO扩展UserAuth的模式,你需要继承OrmLiteAuthRepository<T,T>
类,包括你的自定义POCO,例如查看OrmLiteAuthRepository的来源:
public class OrmLiteAuthRepository
: OrmLiteAuthRepository<UserAuth, UserAuthDetails>, IUserAuthRepository
{
public OrmLiteAuthRepository(IDbConnectionFactory dbFactory)
: base(dbFactory) { }
}
同时,AuthUserSession ServiceStack's支持扩展并提供类型化的自定义Authentication Feature是推荐的方法,因为用户会话刚刚在{{3}中受到限制(即不在RDBMS中),其无模式持久性特征,轻松支持扩展类型。
对于次要扩展,您可以使用每个表上的 Meta 字符串字典字段,这些字段是专门为支持自定义元数据而添加的。它们还包括有用的Get<T>
和Set<T>
方法,这些方法也支持blobbing复杂类型:
userAuth.Set(new Address { ... });
var address = userAuth.Get<Address>();
UserAuth
和UserAuthDetails
表格还包含int? RefId
和string RefIdStr
字段,您可以使用这些字段针对每个用户身份验证记录引用外部数据,例如您自己的自定义表格或用户OAuth注册。
另一种选择是执行Caching Provider正在做的事情,并通过覆盖您自己的自定义UserSession中的 OnAuthenticated 挂钩将UserAuth信息提取到您自己的自定义表中,每次调用时都会调用它用户成功进行身份验证。
以下是将会话数据复制到自定义用户POCO并将其保存在其他表中的SocialBootstrapApi example demo。
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);
}
}
}