TP5验证器+表单令牌+验证码实践

浏览:5368 发布日期:2018/05/10 分类:ThinkPHP5专区 关键字: TP5表单令牌 验证器 验证码
今天学习了一下使用TP5验证器对验证码 + 表单令牌进行验证,实现用户登陆。

建立页面代码如下:<form class="layui-form" method="post" action="{:url('tologin')}">
    <div class="layui-layout layui-layout-login">
        <h1>
            <strong>{:config('sys.authorizer')}</strong>
            <small><em>{:config('sys.name')}</em></small>
        </h1>
        <div class="layui-user-icon login-box">
            <i class="layui-icon layui-icon-username"></i>
            <input type="text" placeholder="用户名(demo2)" id="username" name="username" class="login_txtbx" lay-verify="username" autocomplete="off"/>
        </div>
        <div class="layui-pwd-icon login-box">
            <i class="layui-icon layui-icon-password"></i>
            <input type="password" placeholder="密码(demo123)" class="login_txtbx" id="password" name="password" lay-verify="password" autocomplete="off"/>
        </div>
        <div class="layui-val-icon login-box layui-code-box">
            <i class="layui-icon layui-icon-vercode"></i>
            <input type="text" placeholder="验证码" class="login_txtbx" id="code" name="code" lay-verify="code" autocomplete="off"/><img id="code_img" class="verifyImg" src="{:captcha_src()}" onclick="refreshCodeImg('');" title="点击更换">
        </div>
        <div class="layui-submit">
            {:token()}
            <input type="submit" class="submit_btn" lay-submit="" lay-filter="loginForm" value="登 录"/>
        </div>
        <div class="layui-login-text">
            <p>程序设计:{:config('sys.author')}</p>
        </div>
    </div>
</form>
控制器tologin代码如下:    public function tologin()
    {
        $username = input("post.username", "", "trim");
        $password = input("post.password", "", "trim");
        $code = input("post.code", "", "trim");
        $token = input("__token__");

        $data = [
            'username'  => $username,
            'password'  => $password,
            'code' => $code,
            '__token__' => $token,
        ];
        $rule = [
            'username'  => 'require|length:3,20',
            'password'  => 'require|length:3,20',
            'code'  => 'require|captcha',
            '__token__' => 'token',
        ];
        $msg = [
            'username.require' => '用户名不能为空!',
            'username.length'     => '用户名输入错误!',
            'password.require'  => '密码不能为空!',
            'password.length'     => '密码输入错误!',
            'code.require'  => '验证码不能为空!',
            'code.captcha'  => '验证码错误!',
            '__token__'  => '非法操作!',
        ];

        $validate   = \Validate::make($rule,$msg);

        if (!$validate->check($data)) {
            $this->error($validate->getError(), url("admin/Public/login"));
        }

        if (UserService::getInstance()->login($username, $password)) {
            $loginedUrl = cookie("loginedUrl");
            if (!$loginedUrl) {
                $loginedUrl = url("admin/Index/index");
            } else {
                cookie("loginedUrl", NULL);
            }
            $this->success('登陆成功!',$loginedUrl);
        } else {
            $this->error("用户名或者密码错误,登陆失败!", url("admin/Public/login"));
        }
    }
表单令牌测试方法:使用谷歌浏览器开发者工具手动对源码的value值改变<input type="hidden" name="__token__" value=""> 原来验证登陆都是采用的原始方法对字段逐个验证,增加了代码的维护难度。        if (empty($username) || empty($password)) {
            $this->error("用户名或者密码不能为空,请重新输入!");
        }
        if (empty($code)) {
            $this->error("请输入验证码!");
        }
        //验证码开始验证
        if(!captcha_check($code)) {
            $this->error("验证码错误,请重新输入!");
        }
TP5的验证器确实很实用方便。
第一次发表学习日志,欢迎高手指正。
最佳答案
评论( 相关
后面还有条评论,点击查看>>