Explorar el Código

新增自定义滑块验证接口ISlideCaptcha,新增校验成功时是否移除缓存配置(用于多次验证)
优化生成滑块验证接口支持传入缓存键,避免多次刷新缓存多份验证数据的问题

zhontai hace 2 años
padre
commit
4539473606

+ 4 - 0
src/hosts/ZhonTai.Host/Program.cs

@@ -1,6 +1,7 @@
 using Autofac.Core;
 using FreeRedis;
 using FreeScheduler;
+using Lazy.SlideCaptcha.Core;
 using Microsoft.Extensions.Caching.Distributed;
 using Microsoft.Extensions.DependencyInjection;
 using Microsoft.Extensions.DependencyModel;
@@ -11,6 +12,7 @@ using System.Linq;
 using System.Reflection;
 using ZhonTai;
 using ZhonTai.Admin.Core;
+using ZhonTai.Admin.Core.Captcha;
 using ZhonTai.Admin.Core.Configs;
 using ZhonTai.Admin.Core.Consts;
 using ZhonTai.Admin.Core.Startup;
@@ -67,6 +69,8 @@ new HostApp(new HostAppOptions
         {
             options.StoreageKeyPrefix = CacheKeys.Captcha;
         });
+        context.Services.AddScoped<ISlideCaptcha, SlideCaptcha>();
+
     },
 
     //配置Autofac容器

+ 17 - 0
src/platform/ZhonTai.Admin/Core/Captcha/ISlideCaptcha.cs

@@ -0,0 +1,17 @@
+using Lazy.SlideCaptcha.Core.Validator;
+using Lazy.SlideCaptcha.Core;
+
+namespace ZhonTai.Admin.Core.Captcha
+{
+    public interface ISlideCaptcha
+    {
+        /// <summary>
+        /// 校验
+        /// </summary>
+        /// <param name="captchaId">验证码id</param>
+        /// <param name="slideTrack">滑动轨迹</param>
+        /// <param name="removeIfSuccess">校验成功时是否移除缓存(用于多次验证)</param>
+        /// <returns></returns>
+        ValidateResult Validate(string captchaId, SlideTrack slideTrack, bool removeIfSuccess = true);
+    }
+}

+ 33 - 0
src/platform/ZhonTai.Admin/Core/Captcha/SlideCaptcha.cs

@@ -0,0 +1,33 @@
+using Lazy.SlideCaptcha.Core;
+using Lazy.SlideCaptcha.Core.Storage;
+using Lazy.SlideCaptcha.Core.Validator;
+
+namespace ZhonTai.Admin.Core.Captcha
+{
+    public class SlideCaptcha: ISlideCaptcha
+    {
+        private IValidator _validator;
+        private IStorage _storage;
+
+        public SlideCaptcha(IValidator validator, IStorage storage)
+        {
+            _storage = storage;
+            _validator = validator;
+        }
+
+        public ValidateResult Validate(string captchaId, SlideTrack slideTrack, bool removeIfSuccess = true)
+        {
+             
+            var captchaValidateData = _storage.Get<CaptchaValidateData>(captchaId);
+            if (captchaValidateData == null) return ValidateResult.Timeout();
+            var success = _validator.Validate(slideTrack, captchaValidateData);
+            if (!success || (success && removeIfSuccess))
+            {
+                _storage.Remove(captchaId);
+            }
+
+            return success ? ValidateResult.Success() : ValidateResult.Fail();
+            
+        }
+    }
+}

+ 8 - 6
src/platform/ZhonTai.Admin/Services/Captcha/CaptchaService.cs

@@ -6,6 +6,7 @@ using Lazy.SlideCaptcha.Core.Validator;
 using Microsoft.AspNetCore.Mvc;
 using Microsoft.AspNetCore.Authorization;
 using ZhonTai.Admin.Core.Attributes;
+using ZhonTai.Admin.Core.Captcha;
 
 namespace ZhonTai.Admin.Services.Cache;
 
@@ -16,21 +17,22 @@ namespace ZhonTai.Admin.Services.Cache;
 [DynamicApi(Area = AdminConsts.AreaName)]
 public class CaptchaService : BaseService, IDynamicApi
 {
-    private readonly ICaptcha _captcha;
-    public CaptchaService(ICaptcha captcha)
+    private ICaptcha _captcha => LazyGetRequiredService<ICaptcha>();
+    private ISlideCaptcha _slideCaptcha => LazyGetRequiredService<ISlideCaptcha>();
+    public CaptchaService()
     {
-        _captcha = captcha;
     }
 
     /// <summary>
     /// 生成
     /// </summary>
+    /// <param name="captchaId"></param>
     /// <returns></returns>
     [AllowAnonymous]
     [NoOprationLog]
-    public CaptchaData Generate()
+    public CaptchaData Generate(string captchaId = null)
     {
-        return _captcha.Generate();
+        return _captcha.Generate(captchaId);
     }
 
     /// <summary>
@@ -43,6 +45,6 @@ public class CaptchaService : BaseService, IDynamicApi
     [NoOprationLog]
     public ValidateResult CheckAsync([FromQuery] string id, SlideTrack track)
     {
-        return _captcha.Validate(id, track);
+        return _slideCaptcha.Validate(id, track, false);
     }
 }

+ 11 - 1
src/platform/ZhonTai.Admin/ZhonTai.Admin.xml

@@ -286,6 +286,15 @@
             基础控制器
             </summary>
         </member>
+        <member name="M:ZhonTai.Admin.Core.Captcha.ISlideCaptcha.Validate(System.String,Lazy.SlideCaptcha.Core.Validator.SlideTrack,System.Boolean)">
+            <summary>
+            校验
+            </summary>
+            <param name="captchaId">验证码id</param>
+            <param name="slideTrack">滑动轨迹</param>
+            <param name="removeIfSuccess">校验成功时是否移除缓存(用于多次验证)</param>
+            <returns></returns>
+        </member>
         <member name="T:ZhonTai.Admin.Core.Configs.AppConfig">
             <summary>
             应用配置
@@ -4046,10 +4055,11 @@
             验证码服务
             </summary>
         </member>
-        <member name="M:ZhonTai.Admin.Services.Cache.CaptchaService.Generate">
+        <member name="M:ZhonTai.Admin.Services.Cache.CaptchaService.Generate(System.String)">
             <summary>
             生成
             </summary>
+            <param name="captchaId"></param>
             <returns></returns>
         </member>
         <member name="M:ZhonTai.Admin.Services.Cache.CaptchaService.CheckAsync(System.String,Lazy.SlideCaptcha.Core.Validator.SlideTrack)">