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 相关文章推荐
Python3基础之list列表实例解析
Aug 13 Python
Python Tkinter简单布局实例教程
Sep 03 Python
python使用socket远程连接错误处理方法
Apr 29 Python
解决python删除文件的权限错误问题
Apr 24 Python
浅析Python函数式编程
Oct 06 Python
python获取url的返回信息方法
Dec 17 Python
Pycharm新建模板默认添加个人信息的实例
Jul 15 Python
利用python计算时间差(返回天数)
Sep 07 Python
TensorFlow:将ckpt文件固化成pb文件教程
Feb 11 Python
Python xlwt模块使用代码实例
Jun 10 Python
Python3以GitHub为例来实现模拟登录和爬取的实例讲解
Jul 30 Python
写一个Python脚本自动爬取Bilibili小视频
Apr 24 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
天使彦史上最神还原,性别曝光的那一刻,百万网友恋爱了
2020/03/02 国漫
PHP二维数组的去重问题解析
2011/07/17 PHP
PHP进程同步代码实例
2015/02/12 PHP
Yii2压缩PHP中模板代码的输出问题
2018/08/28 PHP
PHP5.5基于mysqli连接MySQL数据库和读取数据操作实例详解
2019/02/16 PHP
Javascript 个人笔记(没有整理,很乱)
2007/07/07 Javascript
cookie中的path与domain属性详解
2013/12/18 Javascript
jquery取子节点及当前节点属性值的方法
2014/09/09 Javascript
在JS方法中返回多个值的方法汇总
2015/05/20 Javascript
JS简单获取日期相差天数的方法
2017/04/24 Javascript
Vue 2.0的数据依赖实现原理代码简析
2017/07/10 Javascript
简单谈谈JS中的正则表达式
2017/09/11 Javascript
React-Native左右联动List的示例代码
2017/09/21 Javascript
基于jquery实现九宫格拼图小游戏
2018/11/30 jQuery
React Native中Mobx的使用方法详解
2018/12/04 Javascript
Angular6 用户自定义标签开发的实现方法
2019/01/08 Javascript
JS apply用法总结和使用场景实例分析
2020/03/14 Javascript
JavaScript常用工具函数汇总(浏览器环境)
2020/09/17 Javascript
[01:05]主宰至宝剑心之遗
2017/03/16 DOTA
Python中用startswith()函数判断字符串开头的教程
2015/04/07 Python
详解pandas数据合并与重塑(pd.concat篇)
2019/07/09 Python
Python Selenium安装及环境配置的实现
2020/03/17 Python
keras小技巧——获取某一个网络层的输出方式
2020/05/23 Python
利用python实现平稳时间序列的建模方式
2020/06/03 Python
Python读写压缩文件的方法
2020/07/30 Python
关于 HTML5 的七个传说小结
2012/04/12 HTML / CSS
房地产员工找工作的自我评价
2013/11/15 职场文书
《鹬蚌相争》教学反思
2014/04/22 职场文书
普通话宣传标语
2014/06/26 职场文书
六一亲子活动总结
2014/07/01 职场文书
安全生产工作汇报
2014/10/28 职场文书
刑事起诉书范文
2015/05/19 职场文书
刘胡兰观后感
2015/06/16 职场文书
MySQL索引是啥?不懂就问
2021/07/21 MySQL
《勇者辞职不干了》ED主题曲无字幕动画MV公开
2022/04/13 日漫
mysql 排序失效
2022/05/20 MySQL