做个用户管理系统(31)——绑定邮箱和安全问题的状态【20201220】

发表于 2020-12-21 09:52:25
阅读 49

介绍

介绍

前几课福哥带着大家完成了安全模块的绑定邮箱功能和安全问题功能,这两个功能一般情况下是不能修改的。但是,我们在开发完这两个功能之后并没有进行“锁定”处理。也就是说,重新进入绑定邮箱表单依然可以重新操作绑定邮箱,再次进入设置安全问题表单依然可以重新操作设置安全问题。这显然是一个问题,需要我们采取一些措施。

要“锁定”安全模块的表单功能就需要知道表单是否已经设置过了,要知道这些是需要查询数据库的。这个查询的行为可以在页面控制器里进行,也可以在视图模板里进行,如何选择呢?

如果在页面控制器里进行,就需要在控制器里调用模型方法进行判断,然后在视图模板里面直接判断状态。

如果在视图模板里面进行,就需要在视图模板里使用AJAX判断,这样整个判断过程都是“透明”的了,相对来说不是很安全了。

模型user

getSecurityStates

public function getSecurityStates(int $userID):array {
    $status = array(
        'userID'=>$userID,
        'bindEmail'=>false,
        'securityQuestions'=>false,
    );
    if($userID > 0){
        $bindEmail = $this->getBindEmail($userID);
        $securityQuestions = $this->getSecurityQuestions($userID);
        $status['bindEmail'] = (($bindEmail != "") ? true : false);
        $status['securityQuestions'] = (($securityQuestions != null
            && $securityQuestions['q1'] > 0
            && $securityQuestions['q2'] > 0
            && $securityQuestions['q3'] > 0
            && $securityQuestions['a1'] != ""
            && $securityQuestions['a2'] != ""
            && $securityQuestions['a3'] != ""
        ) ? true : false);
    }

    return $status;
}

绑定邮箱

页面控制器

protected function user_process(){
    $this->title = "绑定邮箱 - 会员中心";
    //
    $user = new user($this->tfphp);
    $loginStatus = $this->permission->getLoginStatus();
    //
    $securityStates = $user->getSecurityStates($loginStatus->userID);
    $this->setTplVar("securityStates", $securityStates);
}

视图模板

<% if $securityStates.bindEmail == true %>
<div class="col-sm-12">
    <h3 class="text-center">绑定邮箱</h3>
    <p>您的账号已经设置了绑定邮箱了,在忘记密码的时候可以通过它来重置您的密码</p>
</div>
<% else %>
<div class="col-sm-12">
    <h3 class="text-center">绑定邮箱</h3>
    <p>请输入您的电子邮箱,系统将向邮箱内发送一封邮件,通过邮件内的链接可以完成邮箱绑定操作</p>
    <form>
        <div class="form-group">
            <label>电子邮箱</label>
            <input class="form-control" type="text" name="email" />
        </div>
        <div class="form-group">
            <button class="btn btn-primary btn-sm form-control">发送邮件</button>
        </div>
    </form>
</div>
<% /if %>

安全问题

页面控制器

protected function user_process(){
    $this->title = "安全问题 - 会员中心";
    //
    $user = new user($this->tfphp);
    $loginStatus = $this->permission->getLoginStatus();
    //
    $securityStates = $user->getSecurityStates($loginStatus->userID);
    $this->setTplVar("securityStates", $securityStates);
    $this->setTplVar("sqArr", Dictionary::$securityQuestionArr);
}

视图模板

<% if $securityStates.securityQuestions == true %>
<div class="col-sm-12">
    <h3 class="text-center">安全问题</h3>
    <p>您的账号已经设置了安全问题了,在忘记密码的时候可以通过它来重置您的密码</p>
</div>
<% else %>
<div class="col-sm-12">
    <h3 class="text-center">安全问题</h3>
    <p>设置三个安全问题以及对应的答案,在忘记密码的时候可以通过安全问题重置密码</p>
    <form>
        <div class="form-group">
            <label>第一个问题</label>
            <select class="form-control" name="q1">
                <option>选择一个问题</option>
                <% foreach item=cItem key=cKey from=$sqArr %>
                <option value="<% $cKey %>"><% $cItem %></option>
                <% /foreach %>
            </select>
        </div>
        <div class="form-group">
            <label>第一个问题的答案</label>
            <input class="form-control" type="text" name="a1" />
        </div>
        <div class="form-group">
            <label>第二个问题</label>
            <select class="form-control" name="q2">
                <option>选择一个问题</option>
                <% foreach item=cItem key=cKey from=$sqArr %>
                <option value="<% $cKey %>"><% $cItem %></option>
                <% /foreach %>
            </select>
        </div>
        <div class="form-group">
            <label>第二个问题的答案</label>
            <input class="form-control" type="text" name="a2" />
        </div>
        <div class="form-group">
            <label>第三个问题</label>
            <select class="form-control" name="q3">
                <option>选择一个问题</option>
                <% foreach item=cItem key=cKey from=$sqArr %>
                <option value="<% $cKey %>"><% $cItem %></option>
                <% /foreach %>
            </select>
        </div>
        <div class="form-group">
            <label>第三个问题的答案</label>
            <input class="form-control" type="text" name="a3" />
        </div>
        <div class="form-group">
            <button class="btn btn-primary btn-sm form-control">设置安全问题</button>
        </div>
    </form>
</div>
<% /if %>

讲解

模型user

getSecurityStates

这个方法里面分别判断了绑定邮箱状态、设置安全问题状态,并且只返回了状态,不包括具体数据。

绑定邮箱

页面控制器

调用模型user的getSecurityStates方法获得当前用户的安全状态,返回给Smarty模板使用。

视图模板

通过判断绑定邮箱状态bindEmail的值来判断当前用户是否设置过绑定邮箱了,根据是否设置过来选择显示表单还是提示文字。

安全问题

页面控制器

调用模型user的getSecurityStates方法获得当前用户的安全状态,返回给Smarty模板使用。

视图模板

通过判断安全问题状态securityQuestions的值来判断当前用户是否设置过安全问题了,根据是否设置过来选择显示表单还是提示文字。

效果

设置过绑定邮箱的效果。

93579c4c29e56248.jpg

设置过安全问题的效果。

3b3e82f58f997418.jpg

总结

福哥今天带着童鞋们完成了前两课将的绑定邮箱和设置安全问题功能的收尾功能——安全状态判断。有些功能是需要判断其状态之后才能判断是否可以操作的,如果不满足可操作权限的条件就不能显示给用户。类似这样的设计,在后面会非常的多,基本上出来登录、注册和会员中心之外的所有用户功能都是需要判断权限的,所以我们要习惯这样的思维模式,即:做一个功能先考虑给谁用?谁能用?需要什么权限?

下一课,我们将完成重置密码的第一步功能,敬请期待~~