默认生命周期插件#
功能介绍#
设置用户过期时间后,定时任务会定期将用户过期时间和当前时间作比较,如果当前时间大于用户过期时间,则禁用该用户
配置生命周期定时任务#
配置用户过期时间#
实现思路#
定时任务将用户的过期时间和当前时间作比较,如果用户已经过期,则设置用户属性is_active为False,将禁止该用户登录ArkID 需要覆盖插件基类的抽象方法,插件基类见arkid.core.extension.account_life.AccountLifeExtension
抽象方法实现:#
代码#
extension_root.com_longgui_account_life_arkid.AccountLifeArkIDExtension (AccountLifeExtension)
#
Source code in extension_root/com_longgui_account_life_arkid/__init__.py
class AccountLifeArkIDExtension(AccountLifeExtension):
def load(self):
super().load()
self.register_front_pages(select_user_page)
self.register_account_life_schema(UserExpirationListSchema, "user_expiration")
def create_tenant_config(self, tenant, config, name, type):
"""
创建生命周期配置,手工解决expiration_time类型为datetime不能json序列化的问题
"""
config_created = TenantExtensionConfig()
config_created.tenant = tenant
config_created.extension = Extension.active_objects.get(package=self.package)
config_created.config = json.loads(config.json())
config_created.name = name
config_created.type = type
config_created.save()
return config_created
def update_tenant_config(self, id, config, name, type):
"""
更新生命周期配置,手工解决expiration_time类型为datetime不能json序列化的问题
"""
tenantextensionconfig = TenantExtensionConfig.valid_objects.filter(
id=id
).first()
tenantextensionconfig.config = json.loads(config.json())
tenantextensionconfig.name = name
tenantextensionconfig.type = type
tenantextensionconfig.save()
return tenantextensionconfig
def periodic_task(self, event, **kwargs):
"""
遍历所有插件配置,如果配置中用户对应的过期时间小于当前时间,则禁用用户
Args:
event (arkid.core.event.Event): 生命周期定时任务事件
"""
logger.info("Doing account life arkid priodic task...")
configs = self.get_tenant_configs(event.tenant)
for cfg in configs:
for item in cfg.config:
user_id = item.get('user').get('id')
user = User.objects.get(id=user_id)
expiration_time = timezone.datetime.strptime(
item.get('expiration_time'), '%Y-%m-%dT%H:%M:%S'
)
logger.info(f"expiration_time: {expiration_time}/now: {datetime.now()}")
if expiration_time <= datetime.now():
user.offline()
create_tenant_config(self, tenant, config, name, type)
#
创建生命周期配置,手工解决expiration_time类型为datetime不能json序列化的问题
Source code in extension_root/com_longgui_account_life_arkid/__init__.py
def create_tenant_config(self, tenant, config, name, type):
"""
创建生命周期配置,手工解决expiration_time类型为datetime不能json序列化的问题
"""
config_created = TenantExtensionConfig()
config_created.tenant = tenant
config_created.extension = Extension.active_objects.get(package=self.package)
config_created.config = json.loads(config.json())
config_created.name = name
config_created.type = type
config_created.save()
return config_created
load(self)
#
periodic_task(self, event, **kwargs)
#
遍历所有插件配置,如果配置中用户对应的过期时间小于当前时间,则禁用用户
Parameters:
Name | Type | Description | Default |
---|---|---|---|
event |
arkid.core.event.Event |
生命周期定时任务事件 |
required |
Source code in extension_root/com_longgui_account_life_arkid/__init__.py
def periodic_task(self, event, **kwargs):
"""
遍历所有插件配置,如果配置中用户对应的过期时间小于当前时间,则禁用用户
Args:
event (arkid.core.event.Event): 生命周期定时任务事件
"""
logger.info("Doing account life arkid priodic task...")
configs = self.get_tenant_configs(event.tenant)
for cfg in configs:
for item in cfg.config:
user_id = item.get('user').get('id')
user = User.objects.get(id=user_id)
expiration_time = timezone.datetime.strptime(
item.get('expiration_time'), '%Y-%m-%dT%H:%M:%S'
)
logger.info(f"expiration_time: {expiration_time}/now: {datetime.now()}")
if expiration_time <= datetime.now():
user.offline()
update_tenant_config(self, id, config, name, type)
#
更新生命周期配置,手工解决expiration_time类型为datetime不能json序列化的问题
Source code in extension_root/com_longgui_account_life_arkid/__init__.py
def update_tenant_config(self, id, config, name, type):
"""
更新生命周期配置,手工解决expiration_time类型为datetime不能json序列化的问题
"""
tenantextensionconfig = TenantExtensionConfig.valid_objects.filter(
id=id
).first()
tenantextensionconfig.config = json.loads(config.json())
tenantextensionconfig.name = name
tenantextensionconfig.type = type
tenantextensionconfig.save()
return tenantextensionconfig