You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python GridDB中为旧用户自动生成并更新密码?

解决方案:GridDB批量更新过期密码(Python客户端实现)

需求梳理

需要批量处理满足以下条件的用户:

  • 密码上次修改时间超过2年
  • 排除user_x9、user_f5、user_g1三个用户
  • 基于用户名+特殊字符自动生成新密码,同时更新GridDB用户密码和本地用户信息表

实现步骤

1. 连接GridDB并筛选目标用户

通过Python客户端连接GridDB,查询符合条件的用户列表。用当前日期减去2年作为时间阈值,结合排除用户列表筛选目标用户。

2. 生成合规密码

设计密码生成逻辑,结合用户名特征、随机大小写字母、数字和特殊字符,确保密码复杂度符合安全要求。

3. 批量执行更新操作

遍历筛选出的用户,依次执行:

  • 用SET PASSWORD语句更新GridDB用户密码
  • 更新本地用户信息表中的password和date_last_changed字段

完整代码示例

import griddb_python as griddb
import random
import string
from datetime import datetime, timedelta

# GridDB连接配置
factory = griddb.StoreFactory.get_instance()
try:
    store = factory.get_store(
        host='your_griddb_host',
        port=3181,
        cluster_name='your_cluster_name',
        username='admin',
        password='admin_password'
    )
except griddb.GSException as e:
    print(f"GridDB连接失败: {e.get_message()}")
    exit(1)

# 定义排除用户列表
EXCLUDED_USERS = {'user_x9', 'user_f5', 'user_g1'}
# 计算2年前的日期阈值
THRESHOLD_DATE = (datetime.now() - timedelta(days=365*2)).strftime('%Y/%m/%d %H:%M')

def generate_password(username):
    """基于用户名生成包含特殊字符的强密码"""
    # 截取用户名部分字符作为基础
    user_base = username[-4:] if len(username)>=4 else username
    # 随机字符组合:大小写字母、数字、特殊字符
    chars = string.ascii_letters + string.digits + '@#$%^*_-!'
    random_part = ''.join(random.choice(chars) for _ in range(8))
    # 拼接并打乱顺序
    password_raw = user_base + random_part
    return ''.join(random.sample(password_raw, len(password_raw)))

try:
    # 获取用户信息表
    user_table = store.get_container('user_info_table')
    if not user_table:
        print("用户信息表不存在")
        exit(1)

    # 查询符合条件的用户:日期超过2年且不在排除列表
    query = f"""
        SELECT "user", password, date_last_changed 
        FROM user_info_table 
        WHERE date_last_changed < '{THRESHOLD_DATE}' 
        AND "user" NOT IN ('{"','".join(EXCLUDED_USERS)}')
    """
    rs = store.query(query)
    rows = rs.fetch_all()

    if not rows:
        print("没有需要更新密码的用户")
        exit(0)

    # 开启事务,确保操作原子性
    with store.start_transaction() as tx:
        for row in rows:
            username = row[0]
            new_password = generate_password(username)
            current_time = datetime.now().strftime('%Y/%m/%d %H:%M')

            # 1. 更新GridDB用户密码
            set_pwd_sql = f"SET PASSWORD FOR '{username}' = '{new_password}';"
            store.query(set_pwd_sql)

            # 2. 更新用户信息表
            update_sql = f"""
                UPDATE user_info_table 
                SET password = '{new_password}', date_last_changed = '{current_time}'
                WHERE "user" = '{username}'
            """
            store.query(update_sql)
            print(f"已更新用户 {username} 的密码")

        tx.commit()
        print("所有密码更新操作已完成")

except griddb.GSException as e:
    print(f"操作失败: {e.get_message()}")
finally:
    # 关闭连接
    store.close()

注意事项

  • 替换代码中的GridDB连接参数(host、cluster_name、管理员账号密码)为实际值
  • 密码生成规则可根据安全需求调整,比如增加长度或指定必须包含的特殊字符类型
  • 建议先在测试环境验证逻辑,避免影响生产环境用户
  • 使用事务确保批量操作的原子性,防止数据不一致

内容的提问来源于stack exchange,提问作者Emmanuel Oluwatosin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 10:17:38