Python3批量创建Crowd用户并分配组


Posted in Python onMay 20, 2020

背景

迁移 Crowd 完成后(之前采用 LDAP 方式,新迁移 Crowd 不采用),需要批量创建公司所有员工的用户以及分配组,手工创建以及之前 Postman 的方式还是比较低效。

Python 在 N 多年前入门,写了几个爬虫脚本后,再也没用过,借这个机会顺便再熟悉下 Python 脚本。

归根结底的原因就是:本人很懒~

Crowd Api

https://docs.atlassian.com/atlassian-crowd/3.2.0/REST/

如下示例是基于 Crowd 3.2.0 版本的 Api,不同版本间的 Api 稍有差异。

# 添加用户
$ curl -u "application-name:password" -X POST -H "Content-Type: application/json" -H "Accept: application/json" -d "{\"name\" : \"test.user\", \"display-name\" : \"Test User\", \"active\" : true, \"first-name\" : \"Test\", \"email\" : \"test.user@ourdomain.com\", \"last-name\" : \"User\", \"password\" : {\"value\" : \"mypassword\"} }" http://localhost:8095/crowd/rest/usermanagement/1/user

# 用户添加到组
$ curl -u "application-name:password" -X POST -H "Content-Type: application/json" -d "{\"name\" : \"all-users\"}" http://localhost:8095/crowd/rest/usermanagement/1/user/group/direct\?username\=daodaotest

注意:此处-u的参数为 Crowd 中应用(Application)的用户名和密码,Crowd 的管理员是不能添加用户。

Python 实现脚本

实现添加 Crowd 用户,用户添加到指定组,读取 csv 文件批量添加用户和设定的多个组。

crowdUsers.csv 用户数据 csv 文件

name,displayName,email
daodaotest1,daodaotest1,daodaotest1@daodaotest.com
daodaotest2,daodaotest2,daodaotest2@daodaotest.com
daodaotest3,daodaotest3,daodaotest3@daodaotest.com
......

addCrowdUsers.py 批量添加 Crowd 用户和用户组脚本

#!/usr/bin/python
# -*- coding: UTF-8 -*-
#
# Filename     addCrowdUsers.py
# Revision     0.0.1
# Date       2020/5/14
# Author      jiangliheng
# Email      jiang_liheng@163.com
# Website     https://jiangliheng.github.io/
# Description   批量添加 Crowd 用户和用户组

import requests
from requests.auth import HTTPBasicAuth
import csv
from itertools import islice

# 请求 headers
headers = {
  'Accept': 'application/json',
  'Content-type': 'application/json',
}

# crowd 访问基础路径
base_url='http://localhost:8095'

# 添加用户的默认用户组和密码
auth_username='application-name'
auth_password='password'

# 用户默认密码
password='daodaotest'

def addUser(name,displayName,email):
  """
  添加单用户

  :param name: 登录用户,建议拼音全称,如:jiangliheng
  :param displayName: 显示名称,建议中文全称,如:蒋李恒
  :param email: 邮箱地址
  :return: status_code 状态码,text 响应报文信息
  """

  # 请求 json 数据
  data = '{ \
    "name" :"' + name + '", \
    "email" : "' + email + '", \
    "active" : true, \
    "first-name" : "' + displayName + '", \
    "last-name" : "' + displayName + '", \
    "display-name" : "'+ displayName + '", \
    "password" : { \
      "value" : "' + password + '" \
    } \
  }'

  # 发起请求
  # 解决中文乱码问题 data.encode("utf-8").decode("latin1")
  response = requests.post(
    base_url + '/crowd/rest/usermanagement/1/user',
    headers=headers,
    auth=HTTPBasicAuth(auth_username,auth_password),
    data=data.encode("utf-8").decode("latin1")
  )

  # 状态码
  status_code=response.status_code
  # 响应报文信息
  text=response.text

  # 状态判断
  if str(status_code).startswith("2"):
    print("%s 用户添加成功,状态码:%s ,响应报文信息:%s" % (name,status_code,text))
  else:
    print("%s 用户添加失败,状态码:%s ,响应报文信息:%s" % (name,status_code,text))

  # 返回 状态码,响应报文信息
  return status_code,text

def addGroup(username,groupname):
  """
  用户添加到组

  :param username: 登录用户,建议拼音全称,如:jiangliheng
  :param groups: 用户组,用逗号隔开,如:bitbucket-users,bamboo-users
  :return: status_code 状态码,text 响应报文信息
  """

  # 请求 json 数据
  data = '{ \
    "name" :"' + groupname + '" \
  }'

  # 发起请求
  response = requests.post(
    base_url + '/crowd/rest/usermanagement/1/user/group/direct?username='+username,
    headers=headers,
    auth=HTTPBasicAuth(auth_username,auth_password),
    data=data
  )

  # 状态码
  status_code=response.status_code
  # 响应报文信息
  text=response.text

  # 状态判断
  if str(status_code).startswith("2"):
    print("%s 用户添加组 %s 成功,状态码:%s ,响应报文信息:%s" % (username,groupname,status_code,text))
  else:
    print("%s 用户添加组 %s 失败,状态码:%s ,响应报文信息:%s" % (username,groupname,status_code,text))

  # 返回 状态码,响应报文信息
  return status_code,text

def addUserByCsv(csvfile):
  """
  通过 CSV 文件批量添加用户,并加到组

  :param filename: Crowd 用户 csv 文件
  """

  # 批量读取 csv 的用户
  with open(csvfile, 'r', encoding='utf-8') as f:
    fieldnames = ("name", "displayName", "email")
    reader = csv.DictReader(f, fieldnames)

    for row in islice(reader, 1, None):
      print("批量添加用户 %s" % (row["name"]))
      # 添加用户
      addUser(row["name"],row["displayName"],row["email"])
      # 添加多个组
      addGroup(row["name"],"all-users")
      addGroup(row["name"],"bitbucket-users")
      addGroup(row["name"],"confluence-users")
      addGroup(row["name"],"jira-software-users")
      addGroup(row["name"],"sonar-users")

    f.close()

def main():
  # 通过 CSV 文件批量添加用户,并加到组
  addUserByCsv("crowdUsers.csv")

  # 添加单用户
  # addUser("daodaotest","叨叨软件测试","daodaotest@daodaotest.com")

  # 添加用户到组
  # addGroup("daodaotest","all-users")

if __name__ == "__main__":
  main()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现问号表达式(?)的方法
Nov 27 Python
python使用xauth方式登录饭否网然后发消息
Apr 11 Python
用python 制作图片转pdf工具
Jan 30 Python
基于pycharm导入模块显示不存在的解决方法
Oct 13 Python
python和mysql交互操作实例详解【基于pymysql库】
Jun 04 Python
python 公共方法汇总解析
Sep 16 Python
wxpython绘制音频效果
Nov 18 Python
python如何调用java类
Jul 05 Python
Python基于staticmethod装饰器标示静态方法
Oct 17 Python
Python3读写ini配置文件的示例
Nov 06 Python
安装不同版本的tensorflow与models方法实现
Feb 20 Python
pd.drop_duplicates删除重复行的方法实现
Jun 16 Python
解决windows上安装tensorflow时报错,“DLL load failed: 找不到指定的模块”的问题
May 20 #Python
django中related_name的用法说明
May 20 #Python
在django中form的label和verbose name的区别说明
May 20 #Python
win7上tensorflow2.2.0安装成功 引用DLL load failed时找不到指定模块 tensorflow has no attribute xxx 解决方法
May 20 #Python
django model 条件过滤 queryset.filter(**condtions)用法详解
May 20 #Python
如何在sublime编辑器中安装python
May 20 #Python
Django 解决distinct无法去除重复数据的问题
May 20 #Python
You might like
URL Rewrite的设置方法
2007/01/02 PHP
JQuery小知识
2010/10/15 Javascript
js 三级关联菜单效果实例
2013/08/13 Javascript
jQuery中使用data()方法读取HTML5自定义属性data-*实例
2014/04/11 Javascript
jQuery中阻止冒泡事件的方法介绍
2014/04/12 Javascript
jquery.mobile 共同布局遇到的问题小结
2015/02/10 Javascript
jQuery表单域属性过滤器用法分析
2015/02/10 Javascript
jQuery处理图片加载失败的常用方法
2015/06/08 Javascript
限制文本框只能输入数字||只能是数字和小数点||只能是整数和浮点数
2016/05/27 Javascript
Json解析的方法小结
2016/06/22 Javascript
template.js前端模板引擎使用详解
2017/10/10 Javascript
JS弹窗 JS弹出DIV并使整个页面背景变暗功能的实现代码
2018/04/21 Javascript
基于rollup的组件库打包体积优化小结
2018/06/18 Javascript
微信小程序云开发之数据库操作
2019/05/18 Javascript
vue使用codemirror的两种用法
2019/08/27 Javascript
JS中==、===你分清楚了吗
2020/03/04 Javascript
在Python的Django框架中编写编译函数
2015/07/20 Python
深入讲解Python编程中的字符串
2015/10/14 Python
python中的内置函数max()和min()及mas()函数的高级用法
2018/03/29 Python
Python2与Python3的区别实例总结
2019/04/17 Python
解决python 3 urllib 没有 urlencode 属性的问题
2019/08/22 Python
pytorch对梯度进行可视化进行梯度检查教程
2020/02/04 Python
Python发送手机动态验证码代码实例
2020/02/28 Python
前端制作动画的几种方式(css3,js)
2016/12/12 HTML / CSS
美国在线眼镜商城:Eyeglasses.com
2017/06/26 全球购物
中国高端家电购物商城:顺电
2018/03/04 全球购物
泰国Robinson百货官网:购买知名品牌的商品
2020/02/08 全球购物
数控专业大学生的自我鉴定
2013/11/13 职场文书
幼儿园家长会欢迎词
2014/01/09 职场文书
办公室管理规章制度
2015/08/04 职场文书
药品销售员2015年终工作总结
2015/10/22 职场文书
Python生成九宫格图片的示例代码
2021/04/14 Python
如何用threejs实现实时多边形折射
2021/05/07 Javascript
Python中的变量与常量
2021/11/11 Python
Linux安装apache服务器的配置过程
2021/11/27 Servers
Java Spring Boot请求方式与请求映射过程分析
2022/06/25 Java/Android