基于Python + Django 的密码自助平台项目(完整代码)

news2024/11/18 17:26:37

场景说明:

因为本公司 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。

参考截图配置:

企业微信必要条件:


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

参考截图:

飞书必要条件:


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

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

使用脚本自动部署:


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

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

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

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

# ########## AD配置,修改为自己的# AD主机,可以是IP或主机域名,例如可以是: abc.com或172.16.122.1AD_HOST=r'修改成自己的'# AD域控的DOMAIN名,例如:abcAD_DOMAIN=r'修改成自己的'# 用于登录AD做用户信息处理的账号,需要有修改用户账号密码或信息的权限。# AD账号,例如:pwdadminAD_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,否则就是389AD_CONN_PORT=636# 扫码验证的类型#       钉钉 / 企业微信,自行修改# 值是:DING /  WEWORKSCAN_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'修改为自己的'# 移动应用接入 主要为了实现通过扫码拿到用户的unionidDING_MO_APP_ID=r'修改为自己的'DING_MO_APP_SECRET=r'修改为自己的'# ####### 企业微信《如果不使用企业微信扫码,可不用配置》 ########### 企业微信的企业IDWEWORK_CORP_ID=r'修改为自己的'# 应用的AgentIdWEWORK_AGENT_ID=r'修改为自己的'# 应用的SecretWEWORK_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 中的参数,按自己的实际参数修改

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

# ########## 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'

修改 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:

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

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

[uwsgi]
http-socket = PWD_SELF_SERVICE_IP:PWD_SELF_SERVICE_PORT

chdir = PWD_SELF_SERVICE_HOME
 
module = pwdselfservice.wsgi:application

master = true
 
processes = 4
 
threads = 4
 
max-requests = 2000
 
chmod-socket = 755
 
vacuum = true

# 设置缓冲
post-buffering = 4096

# 设置静态文件
static-map = /static=PWD_SELF_SERVICE_HOME/static

# 设置日志目录
daemonize = PWD_SELF_SERVICE_HOME/log/uwsgi.log

# !/bin/sh

INI="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" ]
then
    content="Usages: sh uwsgiserver [start|stop|restart]"
    echo -e "\033[31m $content \033[0m"
    exit 0
fi

if [ $1 = start ]
then
    if [ `eval $PSID` -gt 4 ]
    then
        content="uwsgi is running!"
        echo -e "\033[32m $content \033[0m"
        exit 0
    else
        $UWSGI $INI
        content="Start uwsgi service [OK]"
        echo -e "\033[32m $content \033[0m"
    fi

elif [ $1 = stop ];then
    if [ `eval $PSID` -gt 4 ];then
        killall -9 uwsgi
    fi
    content="Stop uwsgi service [OK]"
    echo -e "\033[32m $content \033[0m"
elif [ $1 = restart ];then
    if [ `eval $PSID` -gt 4 ];then
        killall -9 uwsgi
    fi
    $UWSGI --ini $INI
    content="Restart uwsgi service [OK]"
    echo -e "\033[32m $content \033[0m"

else
    content="Usages: sh uwsgiserver [start|stop|restart]"
    echo -e "\033[31m $content \033[0m"
fi

Nginx 配置:

Nginx Server 配置:

  • proxy_pass 的 IP 地址改成自己的服务器 IP

  • 配置可自己写一个 vhost 或直接加在 nginx.conf 中

  • 执行 Nginx reload 操作,重新加载配置

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;
}

完整代码:

https://download.csdn.net/download/qq_38735017/87381165

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/159953.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux驱动开发基础_在设备树中指定中断以及在代码中获得中断

目录 1 设备树里中断节点的语法 1.1 设备树里的中断控制器 1.2 设备树里使用中断 2 设备树里中断节点的示例 3 在代码中获得中断 3.1 对于 platform_device 3.2 对于 I2C 设备、SPI 设备 3.3 调用 of_irq_get 获得中断号 3.4 对于 GPIO 1 设备树里中断节点的语法…

OVN实验----L3互通

概述 物理拓扑 如上一个实验OVN实验----L2互通 逻辑拓扑 按照上个实验OVN实验----L2互通 的操作方式&#xff0c;再配置一组容器blue&#xff0c;网段192.168.2.0/24 配置完成后可以在central上ovn-sbctl show看到如下4个绑定接口 此时&#xff0c;red和blue两个网段内是可…

EasyTrans,一个注解搞定数据翻译,减少30%SQL代码量

介绍easy trans适用于3种场景1 有userId/idCardNo(身份证号码-唯一键场景) 需要 userName&#xff0c;无需联表查询。2 有gender code 0 需要 男。3 枚举指定属性给前端亮点1 缓存支持2 跨微服务翻译支持(User和Order 是2个不同微服务&#xff0c;order里面有userId 需要userNa…

strapi系列--如何自定义非界面化的接口,定制化自己的业务逻辑

为什么要进行后端定制呢&#xff1f; 在实际开发过程中&#xff0c;项目中有些需求是不需要创建界面化接口的&#xff0c;需要我们定制化自己的业务逻辑&#xff0c;那么我们该如何处理这个需求呢&#xff1f;本文以图文并茂的形式&#xff0c;定制一个我们自己的业务逻辑接口…

blender 应用物体变换的作用

编辑模式和物体模式操作的区别 旋转 在物体模式下旋转时物体旋转值会发生变换** 在编辑模式下旋转时物体不会发生变化** 缩放 在物体模式下缩放会导致缩放尺寸发生变化 在编辑模式下缩放时&#xff0c;缩放属性不会发生变化 应用物体变换 把物体模式下的缩放旋转变换应…

Android---TabLayout

目录 TabLayout TabItem ​编辑 演示效果的xml TabLayout TabLayout 在开发中一般作为选项卡使用&#xff0c;常与 ViewPager2 和 Fragment 结合起来使用。 常用属性&#xff1a; app:tabBackground 设置 TabLayout 的背景色&#xff0c;改变整个TabLayout 的颜色&#xf…

绪论的习题

刘佳瑜*&#xff0c;王越 *, 黄扬* , 张钊* (淮北师范大学计算机科学与技术学院&#xff0c;安徽 淮北) *These authors contributed to the work equllly and should be regarded as co-first authors. &#x1f31e;欢迎来到机器学习的世界 &#x1f308;博客主页&#xff1…

idea调试常用的快捷键

一、F7 步入调试&#xff0c;进入当前函数内部。 说明&#xff1a; 如果步入的是自己编的函数&#xff0c;可读性会好很多。 如果是系统函数&#xff0c;我个人目前水平&#xff0c;觉得很难读。而且idea系统已编写好的函数&#xff0c;除非是研究源码&#xff0c;否则感觉…

javaweb08 javaweb、tomcat、maven简介、servlet原理和实例、Mapping映射、请求转发和读取properties文件

文章目录一、javaweb简介二、Tomcat三、Maven四、Servlet简介和HelloWorld五、Servlet原理六、Mapping映射七、ServletContext八、请求转发九、读取资源文件properties一、javaweb简介 在java中&#xff0c;动态web资源开发的技术成为javaweb 人们访问到的任何一个网页和资源…

C语言字符串库函数模拟实现

字符串检验 strlen 函数原型 /// brief 返回给定空终止字符串的长度&#xff0c;即首元素为 str 所指&#xff0c;且不包含首个空字符的字符数组中的字符数 /// param str 指向要检测的字符串的指针 /// return 字符串 str 的长度 size_t strlen( const char *str );空终止字…

C语言实现通讯录静态版本

通讯录中首先要有人的信息&#xff0c;然后是存放多少个人的信息 再丰富一下通讯录的功能&#xff0c;例如增删查改、显示、排序。 我们分三个文件来实现。 1、实现简易的菜单&#xff0c;通讯录的整体逻辑 #include"contact.h"void menu() {printf("*****…

900页文档比对只需5分钟?鸿翼InWise文档比对,以人工智能撬动办公效率杠杆

在日常办公中&#xff0c;多份文件间的检查、纠错、复核工作不可避免&#xff0c;这类工作往往具有很强的重复性&#xff0c;占用了大量的工作时间。鸿翼InWise平台文档比对能够赋能企业极速完成海量文档、图片的高精度比对&#xff0c;以人工智能撬动企业生产力提升。 随着数字…

MySQL调优-MySQL索引深入总结

目录 MySQL索引深入总结 InnoDB中的索引复习 聚集索引/聚簇索引 问题&#xff1a;如果我们没有定义主键呢&#xff1f; 问题&#xff1a;分析一下B树三层和四层的性能差异&#xff1f; 辅助索引/二级索引 回表 问题&#xff1a;为什么我们还需要一次回表操作呢?直接把完…

亚马逊云科技:小鹏汽车拓展全球市场,跑出“加速度”

汽车产业变革走向下半场&#xff0c;智能汽车的市场份额之争也从国内走向国际&#xff0c;出海之战讲求速战速决&#xff0c;小鹏汽车携手亚马逊云科技拓展海外市场&#xff0c;完成海外布局。 扩大“鹏”友圈&#xff0c;迈进欧洲市场 近年来&#xff0c;小鹏汽车不断推进全…

数字人民币年度总结:支付变革未停、试点之风再起

文/尹宁出品/陀螺研究院数字人民币&#xff0c;无疑是近年来热度最高的词汇之一&#xff0c;作为我国法币的数字形式&#xff0c;至其出世伊始&#xff0c;不论是资金溯源的透明追踪、零售更新的消费用途&#xff0c;还是跨境结算的雄图大略&#xff0c;围绕其推广与意义的讨论…

关于 国产麒麟系统上长时间运行Qt程序根目录/下磁盘空间占用100%导致无法写入 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/128671382 红胖子(红模仿)的博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软…

LeetCode 129. 求根节点到叶节点数字之和

&#x1f308;&#x1f308;&#x1f604;&#x1f604; 欢迎来到茶色岛独家岛屿&#xff0c;本期将为大家揭晓LeetCode 129. 求根节点到叶节点数字之和&#xff0c;做好准备了么&#xff0c;那么开始吧。 &#x1f332;&#x1f332;&#x1f434;&#x1f434; 一、题目名…

4.6 集成运放的使用

一、使用时必做的工作 1、集成运放的外引线&#xff08;管脚&#xff09; 目前集成运放的常见封装方式有金属壳封装和双列直插式封装&#xff0c;外形如图4.6.1所示&#xff0c;以后者居多。双列直插式有 8、10、12、14、16 管脚等种类&#xff0c;虽然它们的外引线排列日趋标…

laravel JWT 用户认证 实现API认证

JWT 是 JSON Web Token 的缩写&#xff0c;它是一个规范&#xff0c;让用户和服务器之间传递安全可靠的信息。 JWT介绍 JWT 由头部&#xff08;header&#xff09;、载荷&#xff08;payload&#xff09;与签名&#xff08;signature&#xff09;组成 { “typ”:“JWT”, “a…

python的8大核心语句,你确定不来看看嘛,那格局就小啦

Python 是一种代表简单思想的语言&#xff0c;其语法相对简单&#xff0c;很容易上手。不过&#xff0c;如果就此小视 Python 语法的精妙和深邃&#xff0c;那就大错特错了。本文精心筛选了最能展现 Python 语法之精妙的十个知识点&#xff0c;并附上详细的实例代码。如能在实战…