ServiceStack自定义注册验证器问题

时间:2014-06-27 12:31:38

标签: servicestack

我想覆盖添加注册功能时启用的默认注册验证器。 我根据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不再提供此功能?

提前感谢你提供任何帮助。

此致 约翰

2 个答案:

答案 0 :(得分:1)

我可以确认这仍然是v4.0.35中的错误。这就是我如何解决它...

  1. 创建一个自定义注册验证类,实现 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...
            });
    }
    

    }

  2. 创建一个实现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>>();
        }
    }
    
  3. 使用我们刚刚创建的新CustomRegistrationFeature替换App.Host中的RegistrationFeature注册。

    Plugins.Add(new CustomRegistrationFeature());
    
  4. 我不知道为什么会这样,因为我只是做了与已经存在相同或类似的事情,但确实如此。它还允许我添加更多验证规则(这就是我需要这样做的原因)。

答案 1 :(得分:1)

我不太确定这是一个错误,但它可能是。无论如何,自定义验证器未被使用的原因是,在Register()方法运行之后,RegistrationFeature Configure()方法才被调用,因此覆盖CustomRegistrationValidator的注册。

最简单的解决方案是在运行Register()方法后注册自定义验证器

public override void OnAfterInit()
{
    base.OnAfterInit();

    RegisterAs<CustomRegistrationValidator, IValidator<Register>>();            
}