我想覆盖添加注册功能时启用的默认注册验证器。 我根据ServiceStack文档添加了我自己的CustomRegistrationValidator(现在的基本规则,稍后要扩展):
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();
});
}
}
我已根据以下代码段覆盖了我的Configure方法中的默认注册验证程序:
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不再提供此功能?
提前感谢你提供任何帮助。
此致 约翰
答案 0 :(得分:1)
我可以确认这仍然是v4.0.35中的错误。这就是我如何解决它...
创建一个自定义注册验证类,实现 AbstractValidator&lt; Register&gt; 并添加您自己的流畅验证规则(我从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...
});
}
}
创建一个实现IPlugin的CustomRegistrationFeature类(我再次复制了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>>();
}
}
使用我们刚刚创建的新CustomRegistrationFeature替换App.Host中的RegistrationFeature注册。
Plugins.Add(new CustomRegistrationFeature());
我不知道为什么会这样,因为我只是做了与已经存在相同或类似的事情,但确实如此。它还允许我添加更多验证规则(这就是我需要这样做的原因)。
答案 1 :(得分:1)
我不太确定这是一个错误,但它可能是。无论如何,自定义验证器未被使用的原因是,在Register()
方法运行之后,RegistrationFeature
Configure()
方法才被调用,因此覆盖CustomRegistrationValidator
的注册。
最简单的解决方案是在运行Register()
方法后注册自定义验证器:
public override void OnAfterInit()
{
base.OnAfterInit();
RegisterAs<CustomRegistrationValidator, IValidator<Register>>();
}