我怎样才能扩展ServiceStack身份validation
我正在使用ServiceStack身份validation与ServiceStack.OrmLite(SqlServer)。 我有不同的用户types,如学生,教师,校长等。所有用户types都将与其他数据库表有关系。 实施它的最佳做法是什么?
A)添加必要的字段到UserAuth表格并制作Black Magic(在创buildUserAuth之后,手动为表格添加必要的额外信息)
B)学生:UserAuth(UserAuth中的所有字段将被克隆)
C)Student.UserAuthId,UserAuth.Meta [UserType.Student,StudentId]相互参照
D)扩展XService,XFeature或??
PS:如何将业主和types字段添加到ServiceStack UserAuth表。
有几个策略将额外的元数据附加到UserAuth和UserAuthDetails表,
如果你想用你自己定制的POCO来扩展UserAuth的模式,你需要OrmLiteAuthRepository<T,T>
类,包括你自定义的POCO,例如看OrmLiteAuthRepository的源代码 :
public class OrmLiteAuthRepository : OrmLiteAuthRepository<UserAuth, UserAuthDetails>, IUserAuthRepository { public OrmLiteAuthRepository(IDbConnectionFactory dbFactory) : base(dbFactory) { } }
用您自己的types自定义会话扩展UserAuthSession
同时扩展和提供一个types化的自定义AuthUserSession是推荐的方法,因为它受到ServiceStack的 authenticationfunction的支持,因为用户会话只是在caching提供者 (即不在RDBMS中)中被blobbed的地方,支持扩展types。
将其他元数据添加到Meta字典字段
对于次要扩展,您可以使用每个表格上的元string字典字段,这些字段专门添加以支持自定义元数据。 它们还包括有用的Get<T>
和Set<T>
方法,它们也支持blobbing复杂types:
userAuth.Set(new Address { ... }); var address = userAuth.Get<Address>();
将参考数据与RefId和RefIdStr字段链接起来
UserAuth
和UserOAuthProvider
表还包含一个int? RefId
int? RefId
和一个string RefIdStr
字段,您可以使用string RefIdStr
字段来引用外部数据,如针对每个用户身份validationlogging或用户OAuth注册的自定义表。
将UserAuth信息提取到您自己的自定义表中
另一个选项是做SocialBootstrapApi示例演示 ,通过重写自定义的UserSession中的OnAuthenticated挂钩,将UserAuth信息提取到自定义表中,每次用户成功进行身份validation时都会调用该方法。
以下是将会话数据复制到自定义用户POCO并将其保存在其他表中的SocialBootstrapApi示例 。
public class CustomUserSession : AuthUserSession { public string CustomId { get; set; } public override void OnAuthenticated(IServiceBase authService, IAuthSession session, IOAuthTokens 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 authService.TryResolve<IDbConnectionFactory>().Exec(dbCmd => dbCmd.Save(user)); } }