# 账号安全:优化教师账号强制绑定手机和修改密码的规则
修改的内容主要是:
1、教师账号必须绑定手机。即原来的强制绑定手机或邮箱,修改为强制绑定手机。
2、修改密码必须通过手机验证码。即每次修改密码都需要输入绑定的手机号获取验证码才能修改。
3、账号若一个月没有登录,需要验证手机。
具体页面显示见原型。
*****
使用未名账号体系的课堂,弹窗顺序如下:
强制绑定手机 > 未登录超过1个月的身份验证 > 强制修改密码 > 版本更新内容提示
即账号安全提示的优先级要高于版本更新内容提示
![](https://box.kancloud.cn/f8360a1352abd4373dbcc594ac8c2d19_341x748.png)
## 文件入口
D:\wamp\www\ketang.test\weike\themes\custom3\views\version2\login\themeType3\indexTeacher_cus.php
## 密码重置
http://ketang311.wm3dao.com/?r=user/getUserPwd&phone=15920914758&userId=672669&code=794362&isFromPhone=true&pageType=phone
## 修改密码入口
http://ketang.test/index.php?r=ktUser/password
*****
```
$(function(){
// Show bind phone > Show identity verify > Show modify password > Show notice box
var isShowBindPhone = <?php echo V2IdentityService::factory()->getBoundPhone($userID) ? 0 : 1?>;
if (isShowBindPhone)
{
tb_show('安全提示', '#TB_inline?width=400&height=250&inlineId=bind-box&modal=true', false);
}
else
{
var isVerifyIdentity = <?php echo V2UserService::factory()->isVerifyIdentity($userID) ? 1 : 0?>;
isVerifyIdentity = 0; // todo test code, need to remove
if (isVerifyIdentity) {
// todo your code
// tb_show('身份验证弹窗', '#TB_inline?width=400&height=250&inlineId=bind-box&modal=true');
}
else
{
var isTipModifiedPwd = <?php echo V4SystemService::factory()->isTipModifiedPwd() ? 1 : 0?>;
if (isTipModifiedPwd) {
tb_show('安全提示', '#TB_inline?width=400&height=250&inlineId=safe-box&modal=true', false);
}
else
{
var isShowNotice = <?php echo UserService::factory()
->getUpdateNoticeValue($userID, WK::UPDATE_NOTIC_ITEM_ID_V3) ? 0 : 1?>;
if (isShowNotice)
{
wk.notice.config('<?php echo $this->createUrl("/site/popNoticeV3", [
"width" => 802,
'height' => 550
])?>', '<?php echo $this->createUrl("/login/saveNoticeBoxValue",
['itemID' => WK::UPDATE_NOTIC_ITEM_ID_V3])?>');
wk.notice.init();
}
}
}
}
//if (isTipModifiedPwd) {
// tb_show('安全提示','#TB_inline?width=400&height=250&inlineId=safe-box&modal=true',false);
//}
//
//checkIsBindEmailPhone();
//// 检测用户是否已经绑定了邮箱或手机,默认密码是否是123456 by wangbo 2019-2-28
//function checkIsBindEmailPhone() {
// var url = "<?php //echo $this->createUrl('ktUser/checkUserDefaultPassword');?>//";
// $.get(url, function(data){
// // noBindEmailOrPhone : 检测用户是否已经绑定了邮箱或手机
// if (data == "noBindEmailOrPhone") {
// tb_show('安全提示','#TB_inline?width=400&height=250&inlineId=bind-box&modal=true',false);
// }
// // UnsafePass : 判断是否为初始密码123456
// if (data == "UnsafePass") {
// tb_show('安全提示','#TB_inline?width=400&height=250&inlineId=unpass-box&modal=true',false);
// }
// });
//}
// 用户信息 by wuzhc
(function(){
$.ajax({
url: "<?php echo $this->createUrl('ktUser/teacherInfo');?>",
data:{},
type: "get",
dataType:'json',
success:function(data){
var user = data.user || {};
$("#site-sch").html(user.school);
$("#site-subj").html(user.subject);
$("#site-rank").html(user.rank);
$("#site-activeness").html(user.activeness);
},
error:function(){
console.log('获取用户信息失败');
}
});
})();
// 资源统计 by wuzhc
(function(){
$.ajax({
url: "<?php echo $this->createUrl('ktUser/teacherStat');?>",
data:{},
type: "get",
dataType:'json',
success:function(data){
var list = data.data || [];
for (var i = 0, len = list.length; i < len; i++) {
var key = 'site-' + list[i].type;
$("#"+key).text(list[i].total);
}
},
error:function(){
console.log('数据统计失败');
}
});
})();
//跳转自UC同步登录 pengjch 2017-09-20
var synUc = "<?php echo $this->createUrl('default/synuclogin',array('appid'=>''));?>";
$(".js_jspx").click(function (e) {
e.preventDefault(e);
window.open(synUc+$(this).data('appid'));
})
$(".js_jssq").click(function (e) {
e.preventDefault(e);
window.open(synUc+$(this).data('appid'));
})
$(".js_shaike").click(function (e) {
e.preventDefault(e);
window.open(synUc+$(this).data('appid'));
})
$(".js_ktyj").click(function (e) {
e.preventDefault(e);
window.open(synUc+$(this).data('appid'));
})
});
```
### 未登录超过1个月的弹窗
![](https://box.kancloud.cn/6541eff835aed6022faae7182d7e74e2_1326x501.png)
### 验证码
http://ketang311.wm3dao.com/index.php?r=user/getUserPwd
![](./img/R/2019-04-04_100845.png)
D:\wamp\www\ketang.test\framework\web\widgets\captcha\CCaptcha.php
D:\wamp\www\ketang.test\weike\protected\controllers\UserController.php
```
/**
* 找回密码:发送手机号码
* @var String $phone 手机号码
* @var String $code 验证码
* @var int $userId 用户ID
* @var array $userArr 存放绑定该手机号码的所有用户
* @author Cyrus 2013/10/30
*/
public function actionSendPhonePwd()
{
if (!Yii::app()->user->isGuest) { //未登录情况下方能执行操作
echo CJSON::encode(array('result' => 'unlogin'));
Yii::app()->end();
}
$phone = RequestUtils::getNormalRequest('phone');
$code = RequestUtils::getNormalRequest('code');
$userId = RequestUtils::getNormalRequest('userId');
if (!VerifyUtils::checkMobile($phone)) { //手机格式不正确
echo CJSON::encode(array('result' => 'noPhone'));
Yii::app()->end();
}
$phoneDetail = V2IdentityService::factory()->getPhone(null,Yii::app()->params['APPLICATION_PARENT_MAP'][WEB_APP_ID],$phone);
if (!$phoneDetail) { //手机号码不存在
echo CJSON::encode(array('result' => 'noExists'));
Yii::app()->end();
}
if ($code) {
if (!$userId) {
echo CJSON::encode(array('result' => 'error'));
}
if (Yii::app()->session['phone_code'] == $code) {
$rs = V2IdentityService::factory()->checkPhoneCode($phone, $code);
if ($rs) {
echo CJSON::encode(array('result' => 'success', 'userId' => $userId, 'phone' => $phone, 'code' => Yii::app()->session['phone_code']));
Yii::app()->end();
}
echo CJSON::encode(array('result' => 'error'));
Yii::app()->end();
}
echo CJSON::encode(array('result' => 'verifyError'));
Yii::app()->end();
} else { //发送手机验证码
/** @var string $captchaCode 验证码,防止用户重复发送手机验证短信 add by wuzhc 2016-07-14 */
$captchaCode = RequestUtils::getNormalRequest('captchaCode');
if ($captchaCode != $this->createAction('captcha')->getVerifyCode()) {
echo CJSON::encode(array('result' => 'codeError'));
Yii::app()->end();
}
//$phone_code = VerifyUtils::getRandomCode(6);
if ($phoneDetail) {
//$rs = true;
//$rs = IdentityService::factory()->sendCodeToPhone($phone, $phone_code);
$phone_code = V2IdentityService::factory()->sendPhoneCode($phoneDetail->fdUserID,$phone);
if ($phone_code) { //发送成功
Yii::app()->session['phone_code'] = $phone_code; //验证码存入session
echo CJSON::encode(array('result' => 'success', 'record' => 'one', 'userId' => $phoneDetail->user->id));
Yii::app()->end();
} else {
$result = $phone_code == -1 ? 'sendLimit' : 'error';
echo CJSON::encode(array('result' => $result));
Yii::app()->end();
}
}
echo CJSON::encode(array('result' => 'error'));
Yii::app()->end();
}
}
```
发送短信,要在服务器上测试。
{"result":"success","record":"one","userId":"672669"} //成功返回
D:\wamp\www\ketang.test\weike\protected\controllers\SiteController.php
```
public function actionVerifyIdentitySendPhonePwd()
{
if (Yii::app()->user->isGuest) { //登录情况下方能执行操作
echo CJSON::encode(array('result' => 'unlogin'));
Yii::app()->end();
}
$phone = RequestUtils::getNormalRequest('phone');
$code = RequestUtils::getNormalRequest('code');
// $userId = RequestUtils::getNormalRequest('userId');
if (!VerifyUtils::checkMobile($phone)) { //手机格式不正确
echo CJSON::encode(array('result' => 'noPhone'));
Yii::app()->end();
}
$phoneDetails = IdentityService::factory()->getBindPhoneUser($phone);
if (!$phoneDetails) { //手机号码不存在
echo CJSON::encode(array('result' => 'noExists'));
Yii::app()->end();
}
$phoneDetail = V2IdentityService::factory()->getPhone(null,Yii::app()->params['APPLICATION_PARENT_MAP'][WEB_APP_ID],$phone);
if (!$phoneDetail) { //手机号码不存在
echo CJSON::encode(array('result' => 'noExists'));
Yii::app()->end();
}
$captchaCode = RequestUtils::getNormalRequest('captchaCode');
if ($captchaCode != $this->createAction('captcha')->getVerifyCode()) {
echo CJSON::encode(array('result' => 'codeError'));
Yii::app()->end();
}
if ($phoneDetail) {
$phone_code = V2IdentityService::factory()->sendPhoneCode($phoneDetail->fdUserID,$phone);
if ($phone_code) { //发送成功
Yii::app()->session['phone_code'] = $phone_code; //验证码存入session
echo CJSON::encode(array('result' => 'success', 'record' => 'one', 'userId' => $phoneDetail->user->id));
Yii::app()->end();
} else {
$result = $phone_code == -1 ? 'sendLimit' : 'error';
echo CJSON::encode(array('result' => $result));
Yii::app()->end();
}
}
echo CJSON::encode(array('result' => 'error'));
Yii::app()->end();
}
```
参考:http://ketang311.wm3dao.com/index.php?r=user/getUserPwd
### 倒计时功能 √
```
/** 倒计时
* @param total 总时间
* @param str 字符
* @param original 选择器
*/
function counter(count,original) {
var countdown = setInterval(CountDown, 1000);
function CountDown() {
original.addClass("button_off").html("重新发送("+count+")");
if (count == 0) {
original.removeClass("button_off").html("重新发送");
clearInterval(countdown);
}
count--;
}
}
```
### 验证短信是否正确 √
/?r=site/verifyIdentitySendPhonePwd
D:\wamp\www\ketang.test\weike\protected\controllers\SiteController.php
- 说明
- 开发任务
- 星课-真光
- 课表
- Excel Down
- 调课
- 课表修改
- 课表代码分析
- 课堂
- 课堂:应用商店通信管理协议
- 教师账号强制绑定手机或邮箱
- 强制绑定手机和修改密码的规则
- 学堂
- 课程学习:讨论功能
- 后台:课程讨论管理
- 课程直播接口
- 学习统计功能(旧版)
- 学习统计功能(新版)
- 同步课程统计功能
- 同步课程编辑-新增视频
- 第三方接口
- 学科网
- 安徽第三方
- 大赛
- 管控系统
- 日志管理
- 设备日志
- 平板接口
- 渝教
- 教学总结
- 空白目录
- Yii 1.1
- 学堂架构
- Yii 1.1一些方法的解读
- MVCS结构
- 基础使用语法
- 创建1个新模块
- 关联模型
- CDbCriteria
- 学生-课堂记录
- 学生端页面展示
- 教师端页面展示
- 编辑课程文档
- SQL
- 课堂项目运行入口
- 上传资源示意图
- 行为
- PHPStorm
- 源码阅读
- 会诊答卷页面
- 考点练习
- 资源首页
- 同步课程
- 同步课程:章节信息
- 升学复习
- 统计图-范例
- 模块
- 非法词
- 服务层
- MongoDB类
- 学堂作答记录从Mongo新集合获取数据
- MongoYii
- 错题集
- 小技巧
- 完善资料
- 邮件发送
- K12
- JSpang视频课程
- MongoDB
- 创业
- 项目
- 包包