供稿人:刁隆
一般情况下,导入或单个注册的用户密码为系统参数 bropen.framework.security.user.default.password 的值,但是在一个新系统上线时,可能会有这样的需求:初始化时,要求给用户分别设置随机密码,并且发送邮件。
在产品添加这个功能前,可以使用管理员登录系统,通过开发者工具进入调试控制台(console),并适当修改、执行下面的代码即可:
/**
* 提醒1:正式发送前,最好在测试环境好好测试一下
* 提醒2:由于是发送的异步邮件,可以用管理员登录后,在系统监控中查看邮件的发送情况,以便处理异常
*/
// 系统URL
def url = GrailsUtils.getServerURL();
// 系统名称
def appname = GrailsUtils.message("index.app.shortname");
// 邮件标题
def mailSubject = "${appname}账号通知"
// 邮件正文落款
def signature = "XX集团XX部";
def asynchronousMailService = BeanUtils.getBean('asynchronousMailService');
def springSecurityService = BeanUtils.getBean('springSecurityService');
// 遍历可用员工列表,并发送邮件
Employee.withTransaction{
List emps = Employee.availableList([result:'bean']);
for ( Employee emp in emps ) {
if ( emp.email && emp.user ) {
// 生成随机密码
String pwd = getRandomString(8);
User user = emp.user;
user.password = springSecurityService.encodePassword(pwd);
user.save();
// 生成邮件正文
StringBuilder content = new StringBuilder();
content << emp.name << ":\n"
content << "\n请登录 " << appname << " 并及时修改密码。"
content << "\n登录地址:" << url
content << "\n用 户 名:" << user.username
content << "\n初始密码:" << pwd
content << "\n\n---------------------------------"
content << "\n\n" << signature
content << "\n" << DateUtils.formatDatetime(new Date())
// 发送邮件通知:
// 需配置 mail 相关的几个系统参数
// 批量发送邮件比较多,注意邮件服务器的设置,不要把系统的帐号给自动屏蔽了!
asynchronousMailService.sendMail {
to emp.email
subject mailSubject
body content.toString()
delete true
}
}
}
}
/**
* 生成随机字符串
* @param length 生成字符串的长度
*/
public String getRandomString(int length) {
String base = "abcdefghijklmnopqrstuvwxyz0123456789"; //生成字符串从此序列中取
Random random = new Random();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < length; i++) {
int number = random.nextInt(base.length());
sb.append(base.charAt(number));
}
return sb.toString();
}