Как я могу продлить аутентификацию 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);
        }
    }
}
Другие вопросы по тегам