Как я могу продлить аутентификацию ServiceStack
Я использую аутентификацию ServiceStack с ServiceStack.OrmLite (SqlServer). У меня есть разные типы пользователей, такие как ученик, учитель, директор. Все типы пользователей будут связаны с другими таблицами базы данных. Какова лучшая практика для ее реализации?
A) Добавьте необходимые поля в таблицу UserAuth и создайте Black Magic.(После создания UserAuth добавьте необходимую дополнительную информацию в таблицу вручную).
B) Student:UserAuth (все поля в UserAuth будут клонированы)
C) взаимная ссылка Student.UserAuthId, UserAuth.Meta[UserType.Student,StudentId]
D) Расширить XService, XFeature или??
PS: Как насчет добавления полей Владелец и Тип в таблицу ServiceStack UserAuth.
1 ответ
Существует несколько стратегий добавления дополнительных метаданных в таблицы UserAuth и UserAuthDetails.
Если вы хотите расширить схему UserAuth вашими собственными POCO, вам нужно создать подкласс 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>
методы, которые также поддерживают блобирование сложных типов:
userAuth.Set(new Address { ... });
var address = userAuth.Get<Address>();
Связывание ссылочных данных с полями RefId и RefIdStr
UserAuth
а также UserAuthDetails
таблицы также включают int? RefId
и string RefIdStr
поля, которые вы можете использовать для ссылки на внешние данные, такие как ваши собственные пользовательские таблицы, на каждую запись аутентификации пользователя или регистрацию пользователя OAuth.
Извлечение информации UserAuth в ваши собственные таблицы
Другой вариант - сделать то, что делает пример демонстрации SocialBootstrapApi, и извлечь информацию UserAuth в ваши собственные пользовательские таблицы, переопределив хук OnAuthenticated в вашей собственной пользовательской сессии UserSession, которая вызывается каждый раз, когда пользователь успешно проходит аутентификацию.
Вот пример SocialBootstrapApi копирования данных сеанса в пользовательский POCO и сохранения их в другой таблице.
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);
}
}
}