docker版jxTMS使用指南:自定义频率型动态管控

本文讲解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的一些基本开发能力:

jxTMS的HelloWorld

你可能感兴趣的:(jxTMS,docker,python,SaaS,jxTMS)