Exemple #1
0
        private async Task <int> EvaluateAsync(string luaScriptFilePath, RequiresLimitFeatureContext context, CancellationToken cancellation = default)
        {
            var luaScriptFile = _virtualFileProvider.GetFileInfo(luaScriptFilePath);

            using var luaScriptFileStream = luaScriptFile.CreateReadStream();
            var fileBytes = await luaScriptFileStream.GetAllBytesAsync(cancellation);

            var luaSha1 = fileBytes.Sha1();

            if (!await _server.ScriptExistsAsync(luaSha1))
            {
                var luaScript = Encoding.UTF8.GetString(fileBytes);
                luaSha1 = await _server.ScriptLoadAsync(luaScript);
            }

            var keys = new RedisKey[1] {
                NormalizeKey(context)
            };
            var values = new RedisValue[] { context.GetEffectTicks() };
            var result = await _redis.ScriptEvaluateAsync(luaSha1, keys, values);

            if (result.Type == ResultType.Error)
            {
                throw new AbpException($"脚本执行错误:{result}");
            }
            return((int)result);
        }
Exemple #2
0
 private string NormalizeKey(RequiresLimitFeatureContext context)
 {
     if (_currentTenant.IsAvailable)
     {
         return($"{_instance}t:RequiresLimitFeature;t:{_currentTenant.Id};f:{context.LimitFeature}");
     }
     return($"{_instance}c:RequiresLimitFeature;f:{context.LimitFeature}");
 }
Exemple #3
0
        public virtual async Task <bool> CheckAsync(RequiresLimitFeatureContext context, CancellationToken cancellation = default)
        {
            await ConnectAsync(cancellation);

            var result = await EvaluateAsync(CHECK_LUA_SCRIPT, context, cancellation);

            return(result + 1 <= context.Limit);
        }
 public virtual string NormalizeFeatureName(string instance, RequiresLimitFeatureContext context)
 {
     if (CurrentTenant.IsAvailable)
     {
         return($"{instance}t:RequiresLimitFeature;t:{CurrentTenant.Id};f:{context.LimitFeature}");
     }
     return($"{instance}c:RequiresLimitFeature;f:{context.LimitFeature}");
 }
 public override string NormalizeFeatureName(string instance, RequiresLimitFeatureContext context)
 {
     if (CurrentClient.IsAuthenticated)
     {
         return(CurrentTenant.IsAvailable
             ? $"{instance}t:RequiresLimitFeature;t:{CurrentTenant.Id};c:{CurrentClient.Id};f:{context.LimitFeature}"
             : $"{instance}tc:RequiresLimitFeature;c:{CurrentClient.Id};f:{context.LimitFeature}");
     }
     return(base.NormalizeFeatureName(instance, context));
 }
        public virtual async Task CheckAsync(RequiresLimitFeatureContext context, CancellationToken cancellation = default)
        {
            await ConnectAsync(cancellation);

            var result = await EvaluateAsync(CHECK_LUA_SCRIPT, context, cancellation);

            if (result + 1 > context.Limit)
            {
                throw new AbpAuthorizationException("已经超出功能次数限制,请联系管理员");
            }
        }
Exemple #7
0
        public virtual async Task Check_Limit_Test_Async()
        {
            var context = new RequiresLimitFeatureContext(TestFeatureNames.TestLimitFeature, Options, LimitPolicy.Minute, 1, 5);
            await RequiresLimitFeatureChecker.ProcessAsync(context);

            await RequiresLimitFeatureChecker.ProcessAsync(context);

            await RequiresLimitFeatureChecker.ProcessAsync(context);

            await RequiresLimitFeatureChecker.ProcessAsync(context);

            await RequiresLimitFeatureChecker.ProcessAsync(context);

            await Assert.ThrowsAsync <AbpAuthorizationException>(async() =>
            {
                await RequiresLimitFeatureChecker.CheckAsync(context);
            });

            Thread.Sleep(61000);
            // it's ok
            await RequiresLimitFeatureChecker.ProcessAsync(context);
        }
        public virtual async Task Check_Limit_Test_Async()
        {
            var context = new RequiresLimitFeatureContext(TestFeatureNames.TestLimitFeature, Options, LimitPolicy.Minute, 1, 5);
            await RequiresLimitFeatureChecker.ProcessAsync(context);

            await RequiresLimitFeatureChecker.ProcessAsync(context);

            await RequiresLimitFeatureChecker.ProcessAsync(context);

            await RequiresLimitFeatureChecker.ProcessAsync(context);

            await RequiresLimitFeatureChecker.ProcessAsync(context);

            var current = await RequiresLimitFeatureChecker.CheckAsync(context);

            current.ShouldBeFalse();

            Thread.Sleep(61000);
            // it's ok
            var nowCheckResult = await RequiresLimitFeatureChecker.CheckAsync(context);

            nowCheckResult.ShouldBeTrue();
        }
Exemple #9
0
        public virtual async Task ProcessAsync(RequiresLimitFeatureContext context, CancellationToken cancellation = default)
        {
            await ConnectAsync(cancellation);

            await EvaluateAsync(PROCESS_LUA_SCRIPT, context, cancellation);
        }
Exemple #10
0
 public virtual async Task Process_Test_Async()
 {
     var context = new RequiresLimitFeatureContext(TestFeatureNames.TestLimitFeature, Options, LimitPolicy.Minute);
     await RequiresLimitFeatureChecker.ProcessAsync(context);
 }
Exemple #11
0
 private string NormalizeKey(RequiresLimitFeatureContext context)
 {
     return(_featureNamingNormalizer.NormalizeFeatureName(_instance, context));
 }