第一步引入外部第三方JS crypto-js.min.js
在https://cdnjs.cloudflare.com/ajax/libs/crypto-js/4.0.0/crypto-js.min.js链接下载JS到 /public/assets/js 文件目录下。
第二步:配置上js插件
打开 /public/assets/js 目录下的 require-frontend.js 文件和require-backend.js 文件。在paths中配置上插件(注意前台配置require-frontend.js 文件后台配置require-backend.js 文件)
如果线上没有开启debug需要重新压缩打包下js文件,执行如下代码:
php think min -m all -r js
第三步打开/public/assets/js/backend/index.js文件。在头部配置如下代码
define(['jquery', 'bootstrap', 'backend', 'addtabs', 'adminlte', 'form','crypto'], function ($, undefined, Backend, undefined, AdminLTE, Form, crypto) {
在login方法中写提交前置功能
login: function () { ........................ //让错误提示框居中 Fast.config.toastr.positionClass = "toast-top-center"; //本地验证未通过时提示 ............ //使用crypto中MD5方法对密码盐和密码进行加密,并转成base64 function encryptPassword(fsalt,password, bsalt) { var md5Value = crypto.MD5(password).toString(); md5Result = fsalt + '|'+ md5Value + '|' + bsalt; encoded = btoa(md5Result); return encoded; } //获取随机密码盐 function generateRandomString(length) { var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; var result = ''; var charactersLength = characters.length; for (let i = 0; i < length; i++) { result += characters.charAt(Math.floor(Math.random() * charactersLength)); } return result; } //获取当前年月日时分,这里只用到时 function formatCurrentDateTime() { var now = new Date(); var year = now.getFullYear(); var month = ('0' + (now.getMonth() + 1)).slice(-2); var day = ('0' + now.getDate()).slice(-2); var hours = ('0' + now.getHours()).slice(-2); //var minutes = ('0' + now.getMinutes()).slice(-2); // 格式化日期时间字符串 //return `${year}${month}${day}${hours}${minutes}`; return `${year}${month}${day}${hours}`; } //为表单绑定事件,注意一定要按照Form.api.bindevent(form, success, error, submit);这个顺序调用,不然就会调用出错。#login-form就是form,第一个function (data)就是success方法,在登录中存储了登录成功后的ID、用户名、头像,第二个function (data)就是error方法,在登录中放置了验证码错误的处理。第二个function(success, error)才是登录前置方法,可以修改处理数据最后提交。 Form.api.bindevent($("#login-form"), function (data) { localStorage.setItem("lastlogin", JSON.stringify({ id: data.id, username: data.username, avatar: data.avatar })); location.href = Backend.api.fixurl(data.url); }, function (data) { $("input[name=captcha]").next(".input-group-addon").find("img").trigger("click"); }, function(success, error){ console.log('提交前的回调'); // 提交前的回调 // 获取表单数据 var password = $("#pd-form-password").val(); console.log('查找密码' + password); var fsalt = formatCurrentDateTime(); var bsalt = generateRandomString(6); //console.log(salt); var info = encryptPassword(fsalt,password, bsalt); $("#pd-form-password").val(info); Form.api.submit(this, success, error); return false; });}
第四步打开/application/admin/controller/Index.php文件。在login方法中修改如下代码
$username = $this->request->post('username');$password = $this->request->post('password');$keeplogin = $this->request->post('keeplogin');//对密码进行处理//判断是不是特殊值$decodedMD5 = base64_decode($password);// 使用 explode() 函数按 '|' 分隔符分割字符串$parts = explode('|', $decodedMD5);// 获取当前的年月日时分$currentDateTime = date("YmdH");// 检查是否确实有三个部分(两个 '|' 分隔符将字符串分为三个部分)if (count($parts) == 3) { // 访问并打印第二个部分(索引为 1 的元素,因为索引从 0 开始) if($parts[0] == $currentDateTime) { $password = $parts[1]; } else { $this->error('密码秘钥超时,请重新提交'); }}else { $this->error('Password is incorrect');}$token = $this->request->post('__token__');$rule = [ 'username' => 'require|length:3,30', 'password' => 'require|length:3,70', '__token__' => 'require|token',];
第五步打开/application/admin/library/Auth.php文件。在login方法中修改如下代码
//if ($admin->password != md5(md5($password) . $admin->salt)) {if ($admin->password != md5($password. $admin->salt)) { $admin->loginfailure++; $admin->save(); $this->setError('Password is incorrect'); return false;}
希望以上内容对你有所帮助!如果还有其他问题,请随时提问。 各类知识收集 拥有多年CMS企业建站经验,对 iCMS, LeCMS, ClassCMS, Fastadmin, PbootCMS, PHPCMS, 易优CMS, YzmCMS, 讯睿CMS, 极致CMS, Wordpress, HkCMS, YznCMS, WellCMS, ThinkCMF, 等各类cms的相互转化,程序开发,网站制作,bug修复,程序杀毒,插件定制都可以提供最佳解决方案。