如何结合SharpGrip.FluentValidation.AutoValidation实现基于角色的验证
基于角色的FluentValidation Ruleset在SharpGrip自动验证中的实现
这个方案完全可行,不少开发者在多角色API场景下这么用,能很好地隔离不同角色的验证规则,同时复用通用逻辑。下面是具体实现步骤:
1. 定义带规则集的验证器
先在你的验证器中,给不同角色的规则标记对应的规则集,通用规则保留在Default规则集(无需显式标记,默认归属该规则集)。示例代码:
public class CreateOrderRequestValidator : AbstractValidator<CreateOrderRequest> { public CreateOrderRequestValidator() { // 通用规则(Default规则集) RuleFor(x => x.ProductId).NotEmpty(); RuleFor(x => x.Quantity).GreaterThan(0); // Admin角色专属规则 RuleSet("Admin", () => { RuleFor(x => x.DiscountPercentage).InclusiveBetween(0, 50); }); // Customer角色专属规则 RuleSet("Customer", () => { RuleFor(x => x.ShippingAddress).NotEmpty(); }); } }
2. 自定义规则集解析器
要让SharpGrip根据当前用户角色自动选择规则集,需要实现IFluentValidationAutoValidationRuleSetResolver接口,在其中通过HttpContext.User判断角色并返回对应的规则集列表:
public class RoleBasedRuleSetResolver : IFluentValidationAutoValidationRuleSetResolver { public string[] Resolve(HttpContext httpContext, ValidationContext validationContext) { var ruleSets = new List<string> { "Default" }; // 始终执行通用规则 // 根据用户角色添加对应规则集 if (httpContext.User.IsInRole("Admin")) { ruleSets.Add("Admin"); } else if (httpContext.User.IsInRole("Customer")) { ruleSets.Add("Customer"); } // 支持多角色场景:如果用户同时拥有多个角色,可添加对应所有规则集 // if (httpContext.User.IsInRole("Editor")) ruleSets.Add("Editor"); return ruleSets.ToArray(); } }
3. 注册自定义解析器
在API启动配置中,把自定义的解析器注册到DI容器,替换SharpGrip的默认实现:
builder.Services.AddFluentValidationAutoValidation(); // 注册自定义规则集解析器 builder.Services.AddSingleton<IFluentValidationAutoValidationRuleSetResolver, RoleBasedRuleSetResolver>();
注意事项
- 确保
HttpContext.User已完成认证,角色信息正确加载(比如通过JWT、Cookie等认证方式)。 - 规则集名称要严格匹配,避免大小写或拼写错误导致规则不执行。
- 若存在用户拥有多个角色的场景,可调整解析器逻辑,返回所有对应角色的规则集,FluentValidation会依次执行这些规则集内的验证规则。
内容的提问来源于stack exchange,提问作者tembojoe
相关产品推荐
相关产品推荐

