资源下载地址:https://download.csdn.net/download/sheziqiong/85629221

场景说明:

因为本公司 AD 是早期已经在用,用户的个人信息不是十分全面,例如:用户手机号。
钉钉是后来才开始使用,钉钉默认是使用手机号登录。
用户自行重置密码时如果通过手机号来进行钉钉与 AD 之间的验证就行不通了。

逻辑:

用户扫码通过之后,通过临时授权码,提取用户的 userid,再通过 userid 断用户在本企业中是否存在。如果存在,提取钉钉/企业微信用户的邮箱,通过邮箱转成账号,将账号拿到 AD 中进行比对来验证账号在 AD 中是否存在并账号状态是激活的。满足以上条件的账号就会视为可自行重置密码。

所能接受的账号规则

无论是钉钉、微信,均是通过提取用户邮箱的前缀部分来作为关联 AD 的账号,所以目前的识别逻辑就需要保证邮箱的前缀和 AD 的登录账号是一致的。
如果您的场景不是这样,请按自己的需求修改源代码适配。

代码提交到–新分支:

djaong3

提示:

AD必须使用SSL才能修改密码(这里被坑了N久...)
自行部署下AD的证书服务,并颁发CA证书,重启服务器生效。
具体教程百度一下,有很多。

本次升级、修复,请使用最新版:

  • 升级 Python 版本为 3.8
  • 升级 Django 到 3.2
  • 修复用户名中使用\被转义的问题
  • 重写了 dingding 模块,因为 dingding 开发者平台接口鉴权的一些变动,之前的一些接口不能再使用,本次重写。
  • 重写了 ad 模块,修改账号的一些判断逻辑。
  • 重写了用户账号的格式兼容,现在用户账号可以兼容:username、DOMAIN\username、username@abc.com 这三种格式。
  • 优化了整体的代码逻辑,去掉一些冗余重复的代码。

2021/05/19 – 更新:

  • 添加了企业微信支持,修改 pwdselfservice/local_settings.py 中的 SCAN_CODE_TYPE = 'DING’或 SCAN_CODE_TYPE = ‘WEWORK’,区分使用哪个应用扫码验证
  • 添加 Reids 缓存 Token 支持,如果不配置 Redis 则使用 MemoryStorage 缓存到内存中

Redis 的安装和配置方法请自行百度,比较简单

切记 Redis 一定请配置密码,弱密码或没有密码的 Redis 如果不小心暴露到公网,极其容易导致机器被黑用来挖矿。

整体验证逻辑不变,如果需要使用其它字段关联到 AD 验证的,请自行修改代码。

线上环境需要的基础环境:

  • Python 3.8.9 (可自行下载源码包放到项目目录下,使用一键安装)
  • Nginx
  • Uwsgi

截图

钉钉

微信


扫码成功之后:


钉钉必要条件:

创建企业内部应用

  • 在钉钉工作台中通过“自建应用”创建应用,选择“企业内部开发”,创建 H5 微应用或小程序,在应用首页中获取应用的:AgentId、AppKey、AppSecret。
  • 应用需要权限:身份验证、消息通知、通讯录只读权限、手机号码信息、邮箱等个人信息、智能人事,范围是全部员工或自行选择
  • 应用安全域名和 IP 一定要配置,否则无法返回接口数据。

参考截图配置:

移动接入应用–登录权限:

登录中开启扫码登录,配置回调域名:“https://pwd.abc.com/callbackCheck”
其中 pwd.abc.com 请按自己实际域名来,并记录相关的:appId、appSecret。

参考截图配置:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UGbZ2dWi-1641957323390)(https://www.writebug.com/myres/static/uploads/2022/1/7/80c3be27e534413985a1b0121a0b4edd.writebug)]

企业微信必要条件:

  • 创建应用,记录下企业的 CorpId,应用的 ID 和 Secret。

参考截图:

飞书必要条件:

  • 开放平台–> 创建应–> 网页开启–> 配置回调 url

飞书接口项目地址:https://github.com/larksuite/feishu 感谢大佬,节省了不少时间。

使用脚本自动部署:

使用脚本自动快速部署,只适合 CentOS,其它发行版本的 Linux 请自行修改相关命令。

把整个项目目录上传到新的服务器上

先修改配置文件,按自己实际的配置修改项目配置文件:

修改 conf/local_settings.py 中的参数,按自己的实际参数修改

# ########## AD配置,修改为自己的
# AD主机,可以是IP或主机域名,例如可以是: abc.com或172.16.122.1
AD_HOST = r'修改成自己的'# AD域控的DOMAIN名,例如:abc
AD_DOMAIN = r'修改成自己的'# 用于登录AD做用户信息处理的账号,需要有修改用户账号密码或信息的权限。
# AD账号,例如:pwdadmin
AD_LOGIN_USER = r'修改成自己的'
# 密码
AD_LOGIN_USER_PWD = r'修改为自己的'# BASE DN,账号的查找DN路径,例如:'DC=abc,DC=com',可以指定到OU之下,例如:'OU=RD,DC=abc,DC=com'。
BASE_DN = r'修改成自己的'# 是否启用SSL,
# 注意:AD必须使用SSL才能修改密码(这里被坑了N久...),自行部署下AD的证书服务,并颁发CA证书,重启服务器生效。具体教程百度一下,有很多。
AD_USE_SSL = True
# 连接的端口,如果启用SSL默认是636,否则就是389
AD_CONN_PORT = 636# 扫码验证的类型
#       钉钉 / 企业微信,自行修改
# 值是:DING /  WEWORK
SCAN_CODE_TYPE = 'DING'# ########## 钉钉 《如果不使用钉钉扫码,可不用配置》##########
# 钉钉接口主地址,不可修改
DING_URL = r'https://oapi.dingtalk.com'# 钉钉企业ID <CorpId>,修改为自己的
DING_CORP_ID = '修改为自己的'# 钉钉企业内部开发,内部H5微应用或小程序,用于读取企业内部用户信息
DING_AGENT_ID = r'修改为自己的'
DING_APP_KEY = r'修改为自己的'
DING_APP_SECRET = r'修改为自己的'# 移动应用接入 主要为了实现通过扫码拿到用户的unionid
DING_MO_APP_ID = r'修改为自己的'
DING_MO_APP_SECRET = r'修改为自己的'# ####### 企业微信《如果不使用企业微信扫码,可不用配置》 ##########
# 企业微信的企业ID
WEWORK_CORP_ID = r'修改为自己的'
# 应用的AgentId
WEWORK_AGENT_ID = r'修改为自己的'
# 应用的Secret
WEWORK_AGNET_SECRET = r'修改为自己的'# Redis配置
# redis的连接地址,redis://<Ip/Host>:<Port>/<数据库>
REDIS_LOCATION = r'redis://127.0.0.1:6379/1'
REDIS_PASSWORD = r'12345678'# ##########################
# 执行:python3 ./utils/crypto.py 生成
# 可自行生成后替换
CRYPTO_KEY = b'dp8U9y7NAhCD3MoNwPzPBhBtTZ1uI_WWSdpNs6wUDgs='# COOKIE 超时单位是秒,可不用修改
TMPID_COOKIE_AGE = 300# 主页域名,钉钉跳转等需要指定域名,格式:pwd.abc.com。
# 如果是自定义安装,请修改成自己的域名
HOME_URL = 'PWD_SELF_SERVICE_DOMAIN'

执行部署脚本

chmod +x auto-install.sh
./auto-install.sh

等待所有安装完成。

以上配置修改完成之后,则可以通过配置的域名直接访问。

手动部署:

自行安装完 python3 之后,使用 python3 目录下的 pip3 进行安装依赖:

我自行安装的 Python 路径为/usr/local/python3

项目目录下的 requestment 文件里记录了所依赖的相关 python 模块,安装方法:

/usr/local/python3/bin/pip3 install -r requestment

等待所有模块安装完成之后进行下一步。

按自己实际的配置修改项目配置参数:

修改 conf/local_settings.py 中的参数,按自己的实际参数修改

# ########## AD配置,修改为自己的
# AD主机,可以是IP或主机域名,例如可以是: abc.com或172.16.122.1
AD_HOST = r'修改成自己的'# AD域控的DOMAIN名,例如:abc
AD_DOMAIN = r'修改成自己的'# 用于登录AD做用户信息处理的账号,需要有修改用户账号密码或信息的权限。
# AD账号,例如:pwdadmin
AD_LOGIN_USER = r'修改成自己的'
# 密码
AD_LOGIN_USER_PWD = r'修改为自己的'# BASE DN,账号的查找DN路径,例如:'DC=abc,DC=com',可以指定到OU之下,例如:'OU=RD,DC=abc,DC=com'。
BASE_DN = r'修改成自己的'# 是否启用SSL,
# 注意:AD必须使用SSL才能修改密码(这里被坑了N久...),自行部署下AD的证书服务,并颁发CA证书,重启服务器生效。具体教程百度一下,有很多。
AD_USE_SSL = True
# 连接的端口,如果启用SSL默认是636,否则就是389
AD_CONN_PORT = 636# 扫码验证的类型
#       钉钉 / 企业微信,自行修改
# 值是:DING /  WEWORK
SCAN_CODE_TYPE = 'DING'# ########## 钉钉 《如果不使用钉钉扫码,可不用配置》##########
# 钉钉接口主地址,不可修改
DING_URL = r'https://oapi.dingtalk.com'# 钉钉企业ID <CorpId>,修改为自己的
DING_CORP_ID = '修改为自己的'# 钉钉企业内部开发,内部H5微应用或小程序,用于读取企业内部用户信息
DING_AGENT_ID = r'修改为自己的'
DING_APP_KEY = r'修改为自己的'
DING_APP_SECRET = r'修改为自己的'# 移动应用接入 主要为了实现通过扫码拿到用户的unionid
DING_MO_APP_ID = r'修改为自己的'
DING_MO_APP_SECRET = r'修改为自己的'# ####### 企业微信《如果不使用企业微信扫码,可不用配置》 ##########
# 企业微信的企业ID
WEWORK_CORP_ID = r'修改为自己的'
# 应用的AgentId
WEWORK_AGENT_ID = r'修改为自己的'
# 应用的Secret
WEWORK_AGNET_SECRET = r'修改为自己的'# Redis配置
# redis的连接地址,redis://<Ip/Host>:<Port>/<数据库>
REDIS_LOCATION = r'redis://127.0.0.1:6379/1'
REDIS_PASSWORD = r'12345678'# ##########################
# 执行:python3 ./utils/crypto.py 生成
# 可自行生成后替换
CRYPTO_KEY = b'dp8U9y7NAhCD3MoNwPzPBhBtTZ1uI_WWSdpNs6wUDgs='# COOKIE 超时单位是秒,可不用修改
TMPID_COOKIE_AGE = 300# 主页域名,钉钉跳转等需要指定域名,格式:pwd.abc.com。
# 如果是自定义安装,请修改成自己的域名
HOME_URL = 'PWD_SELF_SERVICE_DOMAIN'

安装完依赖后,直接执行
/usr/local/python3/bin/python3 manager.py runserver x.x.x.x:8000
即可临时访问项目,线上不适用这种方法,线上环境请使用 uwsgi。

修改 uwsig.ini 配置:

IP 和路径按自己实际路径修改

[uwsgi]
http-socket = PWD_SELF_SERVICE_IP:PWD_SELF_SERVICE_PORTchdir = PWD_SELF_SERVICE_HOMEmodule = pwdselfservice.wsgi:applicationmaster = trueprocesses = 4threads = 4max-requests = 2000chmod-socket = 755vacuum = true# 设置缓冲
post-buffering = 4096# 设置静态文件
static-map = /static=PWD_SELF_SERVICE_HOME/static# 设置日志目录
daemonize = PWD_SELF_SERVICE_HOME/log/uwsgi.log

通过 uwsgiserver 启动:

其中 PWD_SELF_SERVICE_HOME 是你自己的服务器当前项目的目录,请自行修改
将以下脚本修改完之后,复制到/etc/init.d/,给予执行权限。
uwsgiserver:

# !/bin/shINI="PWD_SELF_SERVICE_HOME/uwsgi.ini"
UWSGI="/usr/share/python-3.6.9/bin/uwsgi"
PSID=`ps aux | grep "uwsgi"| grep -v "grep" | wc -l`if [ ! -n "$1" ]
thencontent="Usages: sh uwsgiserver [start|stop|restart]"echo -e "\033[31m $content \033[0m"exit 0
fiif [ $1 = start ]
thenif [ `eval $PSID` -gt 4 ]thencontent="uwsgi is running!"echo -e "\033[32m $content \033[0m"exit 0else$UWSGI $INIcontent="Start uwsgi service [OK]"echo -e "\033[32m $content \033[0m"fielif [ $1 = stop ];thenif [ `eval $PSID` -gt 4 ];thenkillall -9 uwsgificontent="Stop uwsgi service [OK]"echo -e "\033[32m $content \033[0m"
elif [ $1 = restart ];thenif [ `eval $PSID` -gt 4 ];thenkillall -9 uwsgifi$UWSGI --ini $INIcontent="Restart uwsgi service [OK]"echo -e "\033[32m $content \033[0m"elsecontent="Usages: sh uwsgiserver [start|stop|restart]"echo -e "\033[31m $content \033[0m"
fi

脚本内的路径按自己实际情况修改

自行部署 Nginx,然后添加 Nginx 配置

Nginx 配置:

Nginx Server 配置:

  • proxy_pass 的 IP 地址改成自己的服务器 IP
  • 配置可自己写一个 vhost 或直接加在 nginx.conf 中
server {listen  80;server_name pwd.abc.com;location / {proxy_pass         http://192.168.x.x:8000;proxy_set_header   Host              $host;proxy_set_header   X-Real-IP         $remote_addr;proxy_set_header   X-Forwarded-For   $proxy_add_x_forwarded_for;proxy_set_header   X-Forwarded-Proto $scheme;}access_log  off;
}
  • 执行 Nginx reload 操作,重新加载配置
  • 资源下载地址:https://download.csdn.net/download/sheziqiong/85629221

基于Python的密码自助平台设计相关推荐

  1. 可视化平台python_基于Python的可视化数据分析平台设计与实现

    Computer Era No. 12 2017 0 引言 随着云计算.物联网.社交网络等的兴起和数据库技术的成熟,社会中的各类数据正在以前所未有的速度增长.传统的数据处理方式难以发掘出海量数据中所隐 ...

  2. 【毕业设计_课程设计】基于python的微信公众平台机器人的设计与实现

    文章目录 0 项目说明 项目介绍 项目工程 0 项目说明 基于python的微信公众平台机器人的设计与实现 提示:适合用于课程设计或毕业设计,工作量达标,源码开放 项目介绍 1.NGINX做负载均衡, ...

  3. 基于python的接口录制平台的设计与开发

    背景: 要写论文,我选择的题目是"基于python的应用研究与开发",我打算把公司的hrun-接口录制平台,从设计,到技术分析,到代码实现,进行系统的总结下. (继续完善中...) ...

  4. 基于Python的学生兼职平台的设计和实现

    <基于Python的学生兼职平台的设计和实现>该项目采用技术Python的django框架.mysql数据库,项目含有源码.论文.PPT.配套开发软件.软件安装教程.项目发布教程.核心代码 ...

  5. 基于Python的服装展示平台的设计和实现

    <基于Python的服装展示平台的设计和实现>该项目采用技术Python的django框架.mysql数据库,项目含有源码.论文.PPT.配套开发软件.软件安装教程.项目发布教程.核心代码 ...

  6. python网络爬虫的流程图_基于Python的网络爬虫的设计与实现

    龙源期刊网 http://www.qikan.com.cn 基于 Python 的网络爬虫的设计与实现 作者:高祖彦 来源:<商情> 2020 年第 33 期 [摘要]一个爬虫从网上爬取数 ...

  7. 基于python可视化的网页搜索引擎设计#毕业设计

    开发环境 项目编号:基于python可视化的网页搜索引擎设计#毕业设计 开发语言:Python python框架:django 软件版本:python3.7/python3.8 数据库:mysql 5 ...

  8. 基于Python的图书推荐系统的设计与实现

    基于Python的图书推荐系统的设计与实现 课题描述 在这个数据爆炸的年代,人们的需求逐渐增多,而所对应的资源更是海量. 一个人要从无数的选择中选中自己所感兴趣的无异于大海捞针. 本系统在实现个人信息 ...

  9. Android毕业设计_基于Android的移动学习平台设计

    基于Android的移动学习平台设计mysql数据库版本源码: 超级管理员表创建语句如下: create table t_admin(id int primary key auto_increment ...

最新文章

  1. 从零开始山寨Caffe·拾:IO系统(三)
  2. 计算机组装与维修属于什么类,《计算机组装与维修》课程学业水平测试卷(样卷 答案)...
  3. C# 二种方法控制系统音量/麦克风大小
  4. 在 Django 中使用 pyecharts
  5. ZOJ-2008-Invitation Cards(dijkstra)
  6. 大括弧之战 代码风格
  7. java中sam接口_具有非SAM接口的lambda的Java习惯用法
  8. JAVA爬虫Nutch、WebCollector的正则约束
  9. Itext 7 生成PDF总结
  10. nonebot2.0.0a16-qq机器人框架安装及搭建教程
  11. 中国移动边缘计算技术体系与实践
  12. matlab2012教程答案,MATLAB教程2012a习题解答1-7章完整版-张志涌编-北航.doc
  13. 微信附近的人小程序怎么开(开通附近小程序的方法)
  14. 通用管理系统概要设计说明书
  15. liunx命令大全建议粘贴到word文档可方便查询
  16. java拍照控件焦距问题,监控摄像头镜头焦距计算方法
  17. 计算机文件恢复快捷键,文件变成快捷方式怎么恢复
  18. java: 警告: 源发行版 xx 需要目标发行版 1.10 解决方案
  19. java三层架构实现登录_用户登录——三层架构
  20. 大货跟踪程序精简版v1.20200731

热门文章

  1. 【亲测好用】图像编辑软件:Capture One Pro 22 mac中文版
  2. 魅族手机升级鸿蒙系统,识时务者为魅族?加入鸿蒙系统,未来放弃安卓12更新...
  3. CAD制图初学入门常用技巧汇总,CAD零基础也不怕!
  4. C# 整套视觉开发(VisionAndMotionPro)
  5. 《精益数据分析》第十章:商业模式三免费移动应用
  6. 根据文件流判断是否是Android备份文件
  7. MATLAB 数学应用 微分方程 边界值问题 使用延拓求解BVP问题
  8. Word入门动画教程5:制作稿纸(转)
  9. ACM JAVA+C常用方法模板
  10. 活字格调用(6612345网页打印浏览器)打印无响应的解放方法_20221215_112738