egg(102)--egg之用户登录 以及登录时候涉及的一些安全问题

2023-05-16

router

    router.get('/login', initMiddleware, controller.default.pass.login);
    router.post('/pass/doLogin', initMiddleware, controller.default.pass.doLogin);
    router.get('/pass/loginOut', initMiddleware, controller.default.pass.loginOut);

登录

controller

app/controller/default/pass.js
    async login() {
        await this.ctx.render('default/pass/login.html');
    }
    async doLogin() {
        var username = this.ctx.request.body.username;
        var password = this.ctx.request.body.password;
        var identify_code = this.ctx.request.body.identify_code;

        if (identify_code != this.ctx.session.identify_code) {

            //重新生成验证码 为了安全
            var captcha = await this.service.tools.captcha(120, 50);
            this.ctx.session.identify_code = captcha.text;

            this.ctx.body = {
                success: false,
                msg: '输入的图形验证码不正确'
            }


        } else {

            password = await this.service.tools.md5(password);

            var userResult = await this.ctx.model.User.find({ "phone": username, password: password }, '_id phone last_ip add_time email status');

            if (userResult.length) {

                //cookies 安全      加密
                this.service.cookies.set('userinfo', userResult[0]);
                this.ctx.body = {
                    success: true,
                    msg: '登录成功'
                }
            } else {

                //重新生成验证码
                var captcha = await this.service.tools.captcha(120, 50);
                this.ctx.session.identify_code = captcha.text;

                this.ctx.body = {
                    success: false,
                    msg: '用户名或者密码错误'
                }
            }


        }


    }

配置请求不经过csrf验证

config/config.default.js
    config.security = {
        csrf: {
            // 判断是否需要 ignore 的方法,请求上下文 context 作为第一个参数
            ignore: ctx => {
                if (ctx.request.url == '/pass/doLogin') {
                    return true;
                }
                return false;
            }
        }
    }

view

app/view/default/pass/login.html
    <div class="form">
        <div class="login">

            <div class="login_center">
                <div class="login_top">
                    <div class="left fl">会员登录</div>
                    <div class="right fr">您还不是我们的会员?<a href="/register/registerStep1" target="_self">立即注册</a></div>
                    <div class="clear"></div>
                    <div class="xian center"></div>
                </div>
                <div class="login_main center">
                    <div class="username">用户名:<input class="shurukuang" id="username" type="text" name="username" placeholder="请输入你的手机号" /></div>
                    <div class="username">密 码:<input class="shurukuang" id="password" type="password" name="password" placeholder="请输入你的密码" /></div>
                    <div class="username">
                        <div class="left fl">验证码:<input class="yanzhengma" id="identify_code" type="text" name="identify_code" placeholder="请输入验证码" /></div>
                        <div class="right fl">
                            <img id="identify_code_img" src="/verify" title="看不清?点击刷新" onclick="javascript:this.src='/verify?mt='+Math.random()">
                        </div>
                        <div class="clear"></div>
                    </div>
                </div>
                <div class="login_submit">

                    <button class="submit" id="doLogin">立即登录</button>
                </div>
            </div>

        </div>
    </div>
        $(function() {
            $("#doLogin").click(function(e) {

                var username = $('#username').val();
                var password = $('#password').val();
                var identify_code = $('#identify_code').val();
                var reg = /^[\d]{11}$/;
                if (!reg.test(username)) {
                    alert('手机号输入错误');
                    return false;
                }
                if (identify_code.length < 4) {
                    alert('验证码长度不合法');
                    return false;
                }

                //ajax请求

                $.post('/pass/doLogin', {
                    username: username,
                    identify_code: identify_code,
                    password: password
                }, function(response) {
                    console.log(response);
                    if (response.success == true) {
                        location.href = "/";
                    } else {

                        $("#identify_code_img").attr('src', '/verify?mt=' + Math.random());

                        alert(response.msg);
                    }
                })

            })

        })

效果

当输入的验证码不正确的时候,返回新的验证码

clipboard.png

clipboard.png

退出

controller

app/controller/default/pass.js
    async loginOut() {
        this.service.cookies.set('userinfo', '');
        this.ctx.redirect('/');
    }

view

app/view/default/public/header.html
<li><a href="/pass/loginOut">退出登录</a></li>

效果

clipboard.png

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

egg(102)--egg之用户登录 以及登录时候涉及的一些安全问题 的相关文章

随机推荐

  • 基于牛客网Js v8引擎提供的读/写方法做的调试页面

    项目地址 正直秋招季 xff0c 对找工作的人来说 xff0c 牛客网肯定不陌生 xff0c 现在很多大型互联网公司的在线笔试都是在牛客网上面进行的 xff08 好像有打广告的嫌疑 xff09 Js有那么多的操作数据结构的api xff0c
  • 本地调试spark报org.apache.hadoop.io.nativeio.NativeIO$Windows.createFile...

    本地调试spark xff0c saveAsText 报错 org apache hadoop io nativeio NativeIO Windows createFileWithMode0 Ljava lang String xff1b
  • Element表格分页数据选择+全选所有完善批量操作

    后台管理系统中的列表页面 xff0c 一般都会有对列表数据进行批量操作的功能 xff0c 例如 xff1a 批量删除 批量删除等 之前项目中只是简单的用到Element框架中常规的属性 事件 在一次机缘巧合下 xff0c 了解到一个公司内部
  • idea本地调试web报“There is no configured/running web-servers found! Please, run any web-config”...

    为什么80 的码农都做不了架构师 xff1f gt gt gt 本文永久更新地址 xff1a https my oschina net bysu blog 3051091 1 按照网上的各种配置 如下图 还是不行 2 网上还说要先run才行
  • Visual Studio Code语言设置为中文

    1 Visual Studio Code下载安装 https code visualstudio com 2 语言设置 2 1 快捷键 Windows Linux 快捷键是 xff1a ctrl 43 shift 43 p macOS 快捷
  • 查看zookeeper注册中心是否有注册服务

    为什么80 的码农都做不了架构师 xff1f gt gt gt 查看zookeeper注册中心是否有注册服务可以在服务器上看 xff0c 也可以在dubboadmin看哦 1 在服务器上看 xff1a 1 xff09 查找zookeeper
  • matplotlib 设置图形大小时 figsize 与 dpi 的关系

    matplotlib 中设置图形大小的语句如下 xff1a fig 61 plt figure figsize 61 a b dpi 61 dpi 其中 xff1a figsize 设置图形的大小 xff0c a 为图形的宽 xff0c b
  • iOS- SQLite3的基本使用

    iOS 简单说说iOS移动客户端SQLite3的基本使用 1 为什么要使用SQLite3 xff1f 大量数据需要存储 管理数据 xff0c 存储数据 SQLite是一种关系型数据库 xff08 也是目前移动客户端的主流数据库 xff09
  • Daily Scrum: 2012/12/8

    成员角色今天工作明天计划王安然PM Dev已请假 xff0c 开会 继续开会 黄杨PM Dev已收拾skynet的小问题并且通过测试 xff08 312 xff09 xff0c 编写武器项cracker xff08 313 xff09 完成
  • 【Python】控制鼠标点击

    from pymouse import PyMouse m 61 PyMouse a 61 m position 获取当前坐标的位置 print a m move 50 500 鼠标移动到 x y 位置 a 61 m position pr
  • C++ 标准程序库std::string 详解

    现在一般不再使用传统的char 而选用C 43 43 标准程序库中的string类 xff0c 是因为string标准程序和char 比较起来 xff0c 不必担心内存是否足够 字符串长度 等等 xff0c 而且作为一个类出现 xff0c
  • Lighttpd 搭建 Web 服务器

    背景 xff1a 公司项目用到了lighttpd xff0c 由于自己没有接触过 xff0c 所以做下记录 简介 xff1a Lighttpd 是一个德国人领导的开源Web服务器软件 xff0c 其根本的目的是提供一个专门针对高性能网站 x
  • lua中.和:的区别

    2019独角兽企业重金招聘Python工程师标准 gt gt gt lua中 和 都可以用于方法的声明和调用 和table配合使用 和 最大的不同点 xff0c 就是 xff1a 会把调用者自身 xff0c 传入到函数中 如下代码 xff1
  • 一个很有意思的玩意:FlightGear,开源飞机模拟器

    你一定很想知道开F22战机是什么感觉 xff0c 甚至梦想有一天自己也能驾驭着飞机在空中飞翔 现实生活中 xff0c 做飞行员可不是一件简单的事 xff0c 既然如此 xff0c 我们就别想那么多 xff0c 但有了FlightGear这个
  • 第二学期无人机操作师结业复习测试

    无人机操作师结业复习测试 姓名 xff1a 学号 xff1a 得分 xff1a xff08 本套试卷考试时间为90分钟 xff0c 共分选择题 判断题 填空题 问答题四大部分 xff0c 总分100分 xff09 一 选择题 xff08 共
  • 误删linux文件恢复

    Linux下文件误删除 xff0c 使用extundelete恢复测试过程 extundelete下载官网地址 xff1a https pkgs org download extundelete 给虚拟主机添加一块磁盘 xff0c 磁盘为
  • POJ训练计划1459_Power Network(网络流最大流/Dinic)

    解题报告 这题建模实在是好建 xff0c xff0c 好贱 xff0c 给前向星给跪了 xff0c 纯dinic的前向星居然TLE xff0c sad xff0c xff0c 回头看看优化 xff0c 矩阵跑过了 2A xff0c sad
  • WIN10下微信崩溃(已经是最新版)的解决方法

    问题症状 xff1a WIN10下运行最新版微信 xff08 CrashVersion 61 1644560715 xff09 微信运行错误 你的微信崩溃次数较多 xff0c 建议使用最新版本 xff0c 点击 34 确定 34 到官网 h
  • golang ----map按key排序

    实现map遍历有序 1 key有序 思路 xff1a 对key排序 xff0c 再遍历key输出value 代码如下 xff1a 既可以从小到大排序 xff0c 也可以从大到小排序 package main import 34 fmt 34
  • egg(102)--egg之用户登录 以及登录时候涉及的一些安全问题

    router router get 39 login 39 initMiddleware controller default pass login router post 39 pass doLogin 39 initMiddleware