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网络编程学习笔记(五):socket的一些补充
Jun 09 Python
Python 中的 else详解
Apr 23 Python
win系统下为Python3.5安装flask-mongoengine 库
Dec 20 Python
pygame游戏之旅 python和pygame安装教程
Nov 20 Python
Python基础知识点 初识Python.md
May 14 Python
网易2016研发工程师编程题 奖学金(python)
Jun 19 Python
python字符串替换第一个字符串的方法
Jun 26 Python
Python3 无重复字符的最长子串的实现
Oct 08 Python
python2和python3哪个使用率高
Jun 23 Python
python统计mysql数据量变化并调用接口告警的示例代码
Sep 21 Python
Python 求向量的余弦值操作
Mar 04 Python
Python中json.dumps()函数的使用解析
May 17 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
对于ThinkPHP框架早期版本的一个SQL注入漏洞详细分析
2014/07/04 PHP
php实现encode64编码类实例
2015/03/24 PHP
PHP调用.NET的WebService 简单实例
2015/03/27 PHP
ThinkPHP框架结合Ajax实现用户名校验功能示例
2019/07/03 PHP
php 中的信号处理操作实例详解
2020/03/04 PHP
如何实现iframe(嵌入式帧)的自适应高度
2006/07/26 Javascript
Wordpress ThickBox 添加“查看原图”效果代码
2010/12/11 Javascript
jQuery bxCarousel实现图片滚动切换效果示例代码
2013/05/15 Javascript
javascript对下拉列表框(select)的操作实例讲解
2013/11/29 Javascript
浅析JQuery UI Dialog的样式设置问题
2013/12/18 Javascript
javascript/jquery获取地址栏url参数的方法
2014/03/05 Javascript
调试JavaScript中正则表达式中遇到的问题
2015/01/27 Javascript
JS实现简洁、全兼容的拖动层实例
2015/05/13 Javascript
js实现千分符和保留几位小数的简单实例
2016/08/01 Javascript
jquery datatable服务端分页
2016/08/31 Javascript
jQuery选择器特殊字符与属性空格问题
2017/08/14 jQuery
SVG动画vivus.js库使用小结(实例代码)
2017/09/14 Javascript
JavaScript指定断点操作实例教程
2018/09/18 Javascript
Vue框架里使用Swiper的方法示例
2018/09/20 Javascript
详解如何使用webpack打包多页jquery项目
2019/02/01 jQuery
python Django批量导入数据
2016/03/25 Python
Python3 处理JSON的实例详解
2017/10/29 Python
纯python实现机器学习之kNN算法示例
2018/03/01 Python
Python中defaultdict与lambda表达式用法实例小结
2018/04/09 Python
Python实现微信小程序支付功能
2019/07/25 Python
如何使用repr调试python程序
2020/02/28 Python
python GUI库图形界面开发之PyQt5布局控件QGridLayout详细使用方法与实例
2020/03/06 Python
python和php学习哪个更有发展
2020/06/17 Python
全球最大的在线橄榄球商店:Lovell Rugby
2018/05/20 全球购物
婴儿鞋,独特的婴儿服装和配件:Zutano
2018/11/03 全球购物
创业计划书如何编写
2014/02/06 职场文书
购房委托书范本
2014/09/18 职场文书
蓬莱阁导游词
2015/02/04 职场文书
入党群众意见范文
2015/06/02 职场文书
2016个人先进事迹材料范文
2016/03/01 职场文书
MySQL8.0.18配置多主一从
2021/06/21 MySQL