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动态加载模块的3种方法
Nov 22 Python
Python 专题六 局部变量、全局变量global、导入模块变量
Mar 20 Python
python中urllib.unquote乱码的原因与解决方法
Apr 24 Python
Python进阶学习之特殊方法实例详析
Dec 01 Python
python进行两个表格对比的方法
Jun 27 Python
python3利用tcp实现文件夹远程传输
Jul 28 Python
Python 多维List创建的问题小结
Jan 18 Python
Python破解BiliBili滑块验证码的思路详解(完美避开人机识别)
Feb 17 Python
numpy的Fancy Indexing和array比较详解
Jun 11 Python
python中selenium库的基本使用详解
Jul 31 Python
python实现批量移动文件
Apr 05 Python
基于Python编写简易版的天天跑酷游戏的示例代码
Mar 23 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
首页四格,首页五格For6.0(GBK)(UTF-8)[12种组合][9-18][版主安装测试通过]
2007/09/24 PHP
简单的cookie计数器实现源码
2013/06/07 PHP
什么情况下可以不写PHP的闭合标签“?>”
2014/08/28 PHP
javascript OFFICE控件测试代码
2009/12/08 Javascript
最佳JS代码编写的14条技巧
2011/01/09 Javascript
Js sort排序使用方法
2011/10/17 Javascript
jquery实现带单选按钮的表格行选中时高亮显示
2013/08/01 Javascript
一个JS函数搞定网页标题(title)闪动效果
2014/05/13 Javascript
javascript为下拉列表动态添加数据项
2014/05/23 Javascript
jQuery使用$.get()方法从服务器文件载入数据实例
2015/03/25 Javascript
jQuery插件datepicker 日期连续选择
2015/06/12 Javascript
js实现上传图片及时预览
2016/05/07 Javascript
禁用backspace网页回退功能的实现代码
2016/11/15 Javascript
node.js版本管理工具n无效的原理和解决方法
2016/11/24 Javascript
jQuery中 bind的用法简单介绍
2017/02/13 Javascript
第一次记录Bootstrap table学习笔记(1)
2017/05/18 Javascript
JS实现弹出下载对话框及常见文件类型的下载
2017/07/13 Javascript
JS实现的检验身份证格式并输出出生日期,年龄,性别,出生地示例
2019/05/17 Javascript
elementUI 动态生成几行几列的方法示例
2019/07/11 Javascript
JavaScript实现图片上传并预览并提交ajax
2019/09/30 Javascript
vue elementui tree 任意级别拖拽功能代码
2020/08/31 Javascript
pycharm修改界面主题颜色的方法
2019/01/17 Python
Pycharm如何运行.py文件的方法步骤
2020/03/03 Python
Python开发企业微信机器人每天定时发消息实例
2020/03/17 Python
调整Jupyter notebook的启动目录操作
2020/04/10 Python
什么是会话Bean
2015/05/14 面试题
数控专业个人求职信范文
2014/02/05 职场文书
新闻专业毕业生英文求职信
2014/03/19 职场文书
乡村卫生服务一体化管理实施方案
2014/03/30 职场文书
公职人员索取回扣检举信
2014/04/04 职场文书
质量标语大全
2014/06/12 职场文书
学校四风问题对照检查材料思想汇报
2014/09/26 职场文书
婚内房产协议书范本
2014/10/02 职场文书
2015年度员工自我评价范文
2015/03/11 职场文书
关于倡议书的范文
2015/04/29 职场文书
物业管理交接协议书
2016/03/24 职场文书