#servicestack
#servicestack
Вопрос:
Я хочу переопределить средство проверки регистрации по умолчанию, которое включается при добавлении функции регистрации. Я добавил свой собственный CustomRegistrationValidator в соответствии с документацией ServiceStack (основные правила на данный момент, будут расширены позже):
public class CustomRegistrationValidator : RegistrationValidator
{
public CustomRegistrationValidator()
{
RuleSet(ApplyTo.Post, () =>
{
RuleFor(x => x.FirstName).NotEmpty();
RuleFor(x => x.LastName).NotEmpty();
RuleFor(x => x.Email).NotEmpty();
RuleFor(x => x.Password).NotEmpty();
});
}
}
Я переопределил средство проверки регистрации по умолчанию в моем методе настройки в соответствии со следующим фрагментом:
Plugins.Add(new AuthFeature(
() => new AuthUserSession(),
new IAuthProvider[] { new BasicAuthProvider(),
new CredentialsAuthProvider()
}));
Plugins.Add(new ValidationFeature());
Plugins.Add(new RegistrationFeature());
RegisterAs<CustomRegistrationValidator, IValidator<Register>>();
container.RegisterValidators(typeof(AppHost).Assembly);
Однако валидатор никогда не запускается, поэтому я могу регистрировать новых пользователей с неверными данными.
Я использую последнюю версию ServiceStack V4.0.22
Является ли это серьезной ошибкой ServiceStack или эта функция больше не доступна в последней версии ServiceStack?
Заранее благодарю вас за любую помощь в этом.
С уважением, Джон
Комментарии:
1. В версии ServiceStack 4.0.35 (январь 2015) все еще есть ошибка с валидатором пользовательской регистрации! (См. Текст выше) Есть ли исправление или обходной путь для этого? *** ТРЕБУЕТСЯ СРОЧНОЕ ИСПРАВЛЕНИЕ ***
2. Обходным путем является регистрация пользовательского валидатора после завершения инициализации (см. Мой ответ). Вы зарегистрировали это как проблему в ServiceStack?
Ответ №1:
Я могу подтвердить, что это все еще ошибка в версии 4.0.35. Вот как я это обошел…
- Создайте пользовательский класс проверки регистрации, который реализует AbstractValidator<Register> и добавьте свои собственные правила проверки fluent (я скопировал правила из источника SS)
public class CustomRegistrationValidator : AbstractValidator<Register> { public IAuthRepository UserAuthRepo { get; set; } public CustomRegistrationValidator() { RuleSet(ApplyTo.Post, () => { RuleFor(x => x.UserName).NotEmpty().When(x => x.Email.IsNullOrEmpty()); RuleFor(x => x.UserName) .Must(x => UserAuthRepo.GetUserAuthByUserName(x) == null) .WithErrorCode("AlreadyExists") .WithMessage("UserName already exists") .When(x => !x.UserName.IsNullOrEmpty()); RuleFor(x => x.Email) .Must(x => x.IsNullOrEmpty() || UserAuthRepo.GetUserAuthByUserName(x) == null) .WithErrorCode("AlreadyExists") .WithMessage("Email already exists") .When(x => !x.Email.IsNullOrEmpty()); RuleFor(x => x.FirstName).NotEmpty(); RuleFor(x => x.LastName).NotEmpty(); RuleFor(x => x.Email).NotEmpty(); RuleFor(x => x.Password).NotEmpty(); // add your own rules here... }); RuleSet( ApplyTo.Put, () => { RuleFor(x => x.UserName).NotEmpty(); RuleFor(x => x.Email).NotEmpty(); // add your own rules here... }); }
}
- Создайте класс CustomRegistrationFeature, который реализует IPlugin (опять же, я просто скопировал исходный код SS и изменил регистрацию IoC на класс CustomRegistrationValidator)
public class CustomRegistrationFeature : IPlugin { public string AtRestPath { get; set; } public CustomRegistrationFeature() { this.AtRestPath = "/register"; } public void Register(IAppHost appHost) { appHost.RegisterService<RegisterService>(AtRestPath); appHost.RegisterAs<CustomRegistrationValidator, IValidator<Register>>(); } }
- Замените регистрацию RegistrationFeature в приложении.Хост с новой CustomRegistrationFeature, которую мы только что создали.
Plugins.Add(new CustomRegistrationFeature());
Я не знаю, почему это работает, поскольку я просто делаю то же самое или похожее на то, что уже есть, но это так. Это также позволяет мне добавлять дополнительные правила проверки (именно поэтому мне нужно было это сделать).
Ответ №2:
Я не совсем уверен, что это ошибка, но это может быть. В любом случае, причина, по которой пользовательский валидатор не используется, заключается в том, что Register()
метод of RegistrationFeature
не вызывается до тех пор, пока Configure()
метод не будет запущен, тем самым переопределяя регистрацию CustomRegistrationValidator
.
Самым простым решением является регистрация пользовательского средства проверки после запуска Register()
метода:
public override void OnAfterInit()
{
base.OnAfterInit();
RegisterAs<CustomRegistrationValidator, IValidator<Register>>();
}