ArkID开源IDaaS系统插件之账号默认生命周期插件 Com longgui account life arkid

  • Post author:
  • Post category:其他

默认账号生命周期插件功能介绍

设置用户过期时间后,定时任务会定期将用户过期时间和当前时间作比较,如果当前时间大于用户过期时间,则禁用该用户

配置生命周期定时任务

01打开账号生命周期页面
点击编辑生命周期定时任务按钮
在这里插入图片描述
02配置定时任务表单参数
其中定时运行时间语法参考linux Crontab命令语法,以下图为例:每天8点运行一次,如果失败再每隔间隔30秒重试2次
在这里插入图片描述

配置用户过期时间

01 点击创建按钮
在这里插入图片描述
02点击Config
在这里插入图片描述

03配置用户和过期时间
在这里插入图片描述
04配置完成后,点击创建按钮
在这里插入图片描述

实现思路

定时任务将用户的过期时间和当前时间作比较,如果用户已经过期,则设置用户属性is_active为False,将禁止该用户登录ArkID

需要覆盖插件基类的抽象方法,插件基类见arkid.core.extension.account_life.AccountLifeExtension

抽象方法实现:

  • periodic_task

代码

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()

```python
> 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)

抽象方法,插件加载的入口方法

Source code in
extension_root/com_longgui_account_life_arkid/init.py

def load(self): super().load() self.register_front_pages(select_user_page) self.register_account_life_schema(UserExpirationListSchema, "user_expiration")

periodic_task(self, event, **kwargs)

遍历所有插件配置,如果配置中用户对应的过期时间小于当前时间,则禁用用户

Parameters:

Name:event

Type:arkid.core.event.Event

Description:生命周期定时任务事件

Default: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: /now: ") if expiration_time

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

如果您对我们在做的事情感兴趣,欢迎用以下形式参与

  • 在开源社区贡献issue或代码

  • 在插件商店中提交功能插件

  • 在应用商店中提交SaaS应用

  • 成为代理商向客户推荐ArkID

如果希望快速的了解系统的基本使用,可以访问 https://idaas.akid.cc

注册后,创建自己的租户,即可使用系统的大部分功能。

如果希望体验超级管理员,安装配置插件等,推荐使用 私有化部署 的方式

ArkID方舟一账通是一款开源的 IDaaS 统一身份认证授权管理解决方案,支持多种标准协议(LDAP, OAuth2, SAML, OpenID),细粒度权限控制,完整的WEB管理功能,钉钉、企业微信集成等;助企业构建标准化的用户身份体系。

在这里插入图片描述


版权声明:本文为vagerdwely原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。