本文讲解4.4版jxTMS中如何自行定义一个频率型的动态管控,整个系列的文章请查看:docker版jxTMS使用指南:4.4版升级内容
docker版本的使用,请查看:docker版jxTMS使用指南
4.0版jxTMS的说明,请查看:4.0版升级内容
4.2版jxTMS的说明,请查看:4.2版升级内容
上篇文章中我们讲解了jxTMS的动态管控,本文则展示一个自定义的频率型动态管控的实现。
如果开发者针对自己的需要也想实现某种频率型的管控,可利用jxTMS内置的频率控制对象frequency。
引用:
form jx.auth import frequency
其构造函数为:
class frequency:
def __init__(self, checkItem, max=10, checkPeriodSeconds=60,exceedLimit=100, exceedDual=None)
#checkItem:该频率管控的对象名,如用户名、资源ID等
#max:上文中的限额
#checkPeriodSeconds:上文中的限制周期
#exceedLimit:上文中的超频数
#exceedDual:超频后的回调处理函数,其函数签名为:
# exceedDual(checkItem)
我们举个例子:
class demoCheck:
_accessFrequency = {}
@classmethod
def frequencySet(cls, userName, max=10, checkPeriodSeconds=60,
exceedLimit=100, exceedDual=None):
rl = cls.__dict__['_accessFrequency']
#此处设置了超频时的处置函数为本类的_exceedDual函数
rl[userName] = frequency(userName, max=max, checkPeriodSeconds=checkPeriodSeconds,
exceedLimit=exceedLimit, exceedDual=cls._exceedDual)
#用于上篇文章中所介绍的全面检查
@classmethod
def check_frequency_forSystem(cls, u, op, resID):
fl = cls.__dict__['_accessFrequency']
#需要开发者自己来决定挑选哪些用户来执行自己的频率限制审查
b = needCheck(u,op,resID)
if b:
#根据业务需要执行频率检查
f = fl.get(u.name(),None)
if f is None:
#防止扫描
return False,f'[{u._name}]访问频率超过预期'
b = f.check()
if not b:
return False,f'[{u._name}]访问频率超过预期'
return True,None
#用于上篇文章中所介绍的指定检查
@classmethod
def check_frequency_forMe(cls, myName, op, resID):
fl = cls.__dict__['_accessFrequency']
f = fl.get(myName,None)
if f is None:
#防止扫描
return False,f'[{myName}]访问频率超过预期'
b = f.check()
if b:
return True,None
return False,f'[{myName}]访问频率超过预期'
#超频时的处置
@classmethod
def _exceedDual(cls, userName):
#超频了,踢出并阻止登录
user.preventUser(userName)
msg = f'用户【{userName}】操作过于频繁,阻止12小时'
jxGo.log('warn',msg)
根据自己的业务需要,可随时通过执行下面的语句来添加自己的频率型动态管控:
demoCheck.frequencySet(objName,...限额等参数...)
对自己定义的该管控措施,其可部署的检查点有两种:
1、利用系统内置的卡控来统一触发,通过执行:
user.setDynamicallyCheck('自己的动态管控名',demoCheck.check_frequency_forSystem)
不需再做其它任何处置,系统即会自动在全面检查时调用demoCheck.check_frequency_forSystem函数来完成自己的频率型管控。
2、自己在业务操作过程中,自行执行频率管控的检查,通过执行:
user.setDynamicallyCheck('自己的动态管控名',demoCheck.check_frequency_forMe)
此种方式需手动触发动态管控的执行,因此需再自己的业务处理函数中执行:
...业务操作的预备动作
b,msg = user.specialCheck('自己的动态管控名',currentUser,操作名,资源ID)
if not b:
rm = f'用户[{currentUser.fullname()}]执行操作【{操作名}】未通过频率审查:{msg}'
jxGo.log('warn', rm)
return None,rm
...通过了频率管控的审查,继续执行
同时,使用此种方式来调度自己定义的动态管控,需要在系统统一调度时排除掉【自己的动态管控名】,否则【自己的动态管控名】会在系统内置的卡控点被统一触发,从而造成期望之外的审查,可能会导致其它用户都被阻止!
要避免此种情况的出现,需执行:
user.notDoDynamicallyCheck('自己的动态管控名')
第一种方式属于全局执行,所以check_frequency_forSystem要有一个识别用户的needCheck【自己定义】函数来进行用户的识别,默认则是放行;第二种方式属于针对性执行,所以不需要用户的识别,默认则是拒绝。
也正是由于后者是针对性执行,所以必须调用notDoDynamicallyCheck将其从全局执行中剔除,切切!
超频后临时阻止用户
在demoCheck的frequencySet中设置了超频时的处理函数:demoCheck._exceedDual。其利用了user类提供的preventUser函数来临时阻止超频的用户。
preventUser函数会将该用户临时加入到黑名单中【这会导致该用户立刻无法访问以及登录】,默认12个小时后再自动将用户移出黑名单。这个临时阻止的时长可调:
def preventUser(cls,userName,Hours=12):
即开发者在调用user.preventUser临时阻止用户时,通过设置Hours可将该用户阻止对应的小时数【为了提高效率,移出黑名单是由系统统一调度执行的,所以具体的阻止时长,大约是指定时长后的1小时左右,即指定了10小时,大约是在11个小时左右】。
参考资料:
jxTMS设计思想
jxTMS编程手册
下面的系列文章讲述了如何用jxTMS开发一个实用的业务功能:
如何用jxTMS开发一个功能
下面的系列文章讲述了jxTMS的一些基本开发能力:文章来源:https://www.toymoban.com/news/detail-619855.html
jxTMS的HelloWorld文章来源地址https://www.toymoban.com/news/detail-619855.html
到了这里,关于docker版jxTMS使用指南:自定义频率型动态管控的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!