背景
公司使用的 crowd 一直没有升级,版本是 2.11.1
,一直以来用户密码过期时间是一年,但是都没有通知功能,很多用户登录很多次不行,又来咨询,互相都浪费了不少时间,所以这次决定想一个办法解决密码过期通知的
办法
通过查询资料,找到了两个办法:
- 升级到新版本,已经测试新版本在邮件配置的后台有了密码过期通知的模板,说明后来是新增了这个功能的
- 使用自定义的脚本,需要在数据库中检索密码将要过期的用户,拿到用户邮箱发送通知
选择
两个办法优劣如下:
- 升级到版本是优先考虑的选项,但是存在几个问题 a. 一是公司还使用了同时期的 confluence、jira b. 其他第三方的服务也跟 crowd 做了对接 c. 最后 OA 还使用了 crowd 的 api 接口做用户管理 d. 没有最新license,可能还需要破解,存在安全以及稳定性的问题 e. 最后还需要从
2.11.1
版本恢复数据到6.0.2
功能和稳定性也未知 f. 综合考虑目前升级版本风险无法控制,可能需要暂缓 - 使用自定义脚本的方式来通知,优劣如下: a. 可以自己检索任意时间、用户进行通知都可以 b. 是否准确、以及通知的稳定性未知,主要是功能方面 c. 综上,目前来看的话,使用这种方法在安全性上可以得到保证
脚本
脚本如下:
#!/bin/bash
host="192.168.xx.xx"
port=3336
user="crowd"
pass="crowd"
db='crowd'
sql="select * from (select concat(u.first_name,u.last_name) as full_name,
u.email_address,
DATE(FROM_UNIXTIME(ua.attribute_value/1000)) pwd_last_changed,
DATEDIFF(DATE_ADD(FROM_UNIXTIME(ua.attribute_value/1000), INTERVAL da.attribute_value DAY), NOW()) days_before_expire
from crowd.cwd_user u
inner join cwd_user_attribute ua on
ua.user_id=u.id
and u.active='T'
and ua.attribute_name='passwordLastChanged'
inner join cwd_directory_attribute da on
u.directory_id=da.directory_id
and da.attribute_name='password_max_change_time'
order by days_before_expire) t
where t.days_before_expire in (0,1,7)"
#sql="select * from (select concat(u.first_name,u.last_name) as full_name,
# u.email_address,
# DATE(FROM_UNIXTIME(ua.attribute_value/1000)) pwd_last_changed,
# DATEDIFF(DATE_ADD(FROM_UNIXTIME(ua.attribute_value/1000), INTERVAL da.attribute_value DAY), NOW()) days_before_expire
# from crowd.cwd_user u
# inner join cwd_user_attribute ua on
# ua.user_id=u.id
# and ua.attribute_name='passwordLastChanged'
# inner join cwd_directory_attribute da on
# u.directory_id=da.directory_id
# and da.attribute_name='password_max_change_time'
# order by days_before_expire) t
# where email_address='yuc@succez.com'"
text=$(mysql -u${user} -h${host} -p${pass} -P${port} -D${db} -N -e "${sql}")
dddte=`date +%F_%T`
echo "===================== ${dddte} Execute ======================"
echo "$text" | while read line;do
read name mail days <<< $(echo $line | awk '{print $1,$2,$4}')
ddate=`date +%F_%T`
#echo $name
#echo $mail
#echo $days
# send mail to user mail
echo "----------------- ${ddate} ------------------" >> ~/crowdmail.log
echo -e "
${name} 你好,
你的 Crowd 密码即将过期,剩余天数为: ${days} ,请在过期之前登录 openvpn 到站点: https://crowd.xx.com/crowd 修改新密码
" | mailx -v -s "Crowd密码过期提醒" $mail &>> ~/crowdmail.log
# 记录
echo $ddate $line >> ~/crowd.pass
done
SQL 参考 官方 JIRA 中问答(在历史版本中没有此功能的解决方案)
然后 mailx 需要配置下邮箱,这里使用的是阿里云的邮件服务
评论