资源下载地址: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_HOST = r'修改成自己的'
AD_DOMAIN = r'修改成自己的'
AD_LOGIN_USER = r'修改成自己的'
AD_LOGIN_USER_PWD = r'修改为自己的'
BASE_DN = r'修改成自己的'
AD_USE_SSL = True
AD_CONN_PORT = 636
SCAN_CODE_TYPE = 'DING'
DING_URL = r'https://oapi.dingtalk.com'
DING_CORP_ID = '修改为自己的'
DING_AGENT_ID = r'修改为自己的'
DING_APP_KEY = r'修改为自己的'
DING_APP_SECRET = r'修改为自己的'
DING_MO_APP_ID = r'修改为自己的'
DING_MO_APP_SECRET = r'修改为自己的'
WEWORK_CORP_ID = r'修改为自己的'
WEWORK_AGENT_ID = r'修改为自己的'
WEWORK_AGNET_SECRET = r'修改为自己的'
REDIS_LOCATION = r'redis://127.0.0.1:6379/1'
REDIS_PASSWORD = r'12345678'
CRYPTO_KEY = b'dp8U9y7NAhCD3MoNwPzPBhBtTZ1uI_WWSdpNs6wUDgs='
TMPID_COOKIE_AGE = 300
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_HOST = r'修改成自己的'
AD_DOMAIN = r'修改成自己的'
AD_LOGIN_USER = r'修改成自己的'
AD_LOGIN_USER_PWD = r'修改为自己的'
BASE_DN = r'修改成自己的'
AD_USE_SSL = True
AD_CONN_PORT = 636
SCAN_CODE_TYPE = 'DING'
DING_URL = r'https://oapi.dingtalk.com'
DING_CORP_ID = '修改为自己的'
DING_AGENT_ID = r'修改为自己的'
DING_APP_KEY = r'修改为自己的'
DING_APP_SECRET = r'修改为自己的'
DING_MO_APP_ID = r'修改为自己的'
DING_MO_APP_SECRET = r'修改为自己的'
WEWORK_CORP_ID = r'修改为自己的'
WEWORK_AGENT_ID = r'修改为自己的'
WEWORK_AGNET_SECRET = r'修改为自己的'
REDIS_LOCATION = r'redis://127.0.0.1:6379/1'
REDIS_PASSWORD = r'12345678'
CRYPTO_KEY = b'dp8U9y7NAhCD3MoNwPzPBhBtTZ1uI_WWSdpNs6wUDgs='
TMPID_COOKIE_AGE = 300
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_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
通过 uwsgiserver 启动:
其中 PWD_SELF_SERVICE_HOME 是你自己的服务器当前项目的目录,请自行修改
将以下脚本修改完之后,复制到/etc/init.d/,给予执行权限。
uwsgiserver:
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 配置
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
Original: https://blog.csdn.net/newlw/article/details/122449345
Author: biyezuopinvip
Title: 基于Python的密码自助平台设计
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/734144/
转载文章受原作者版权保护。转载请注明原作者出处!