#### 技能学习:学习使用php(tp6框架) + vue.js,开发前端全栈网站-5.用户登录,密码的bcrypt(hash)加密与验证
> 技能学习:学习使用php(tp6框架) + vue.js,开发前端全栈网站-1.工具和本地环境
> 技能学习:学习使用php(tp6框架) + vue.js,开发前端全栈网站-2.启动项目
> 技能学习:学习使用php(tp6框架) + vue.js,开发前端全栈网站-3.路由、模型与数据库操作
> 技能学习:学习使用php(tp6框架) + vue.js,开发前端全栈网站-4.跨域且传输数据,并优化后端接口
> 技能学习:学习使用php(tp6框架) + vue.js,开发前端全栈网站-5.用户登录,密码的加密与验证
> 技能学习:学习使用php(tp6框架) + vue.js,开发前端全栈网站-6.用户登录(二),token验证
> 技能学习:学习使用php(tp6框架) + vue.js,开发前端全栈网站-7.分类的模型关联和通用CRUD接口
> 技能学习:学习使用php(tp6框架) + vue.js,开发前端全栈网站-8.使用mavoneditor(vue的markdown编辑器),并批量上传图片
###### 1.用户登录
Login.vue:
~~~
<template>
<div class="login-container">
<!-- 使用elementui中的card组件 -->
<el-card header="管理员登录" class="login-card">
<!-- 监听表单的submit事件,native.prevent监听原生表单事件跳转接口并且阻止页面跳转 -->
<el-form @submit.native.prevent="login">
<el-form-item label="用户名">
<el-input v-model="model.username"></el-input>
</el-form-item>
<el-form-item label="密码">
<el-input v-model="model.password" type="password"></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" native-type="submit">登录</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
</template>
<script>
export default {
data() {
return {
model: {
username: "",
password: ""
}
}
},
methods: {
async login() {
const res = await this.$http.post('login', this.model)
console.log(res)
// 存储token值
// sessionStorage是页面缓存存储,关闭页面后token值被清除,每次进入页面都需要进行账号登陆
// localStorage是本地存储,关闭页面后token值不会被清除,只要不清理浏览器缓存就无需再次进行登录操作
localStorage.token = res.data.token
// 登录成功跳转到网站首页
this.$router.push('/')
// 使用vue效果在页面展示结果
this.$message({
type: 'success',
message: '登陆成功'
})
}
}
}
</script>
<style>
.login-card{
width: 35rem;
margin: 6rem auto;
}
</style>
~~~
引入Login.vue:
![](https://img.kancloud.cn/70/4b/704b1236b9f1174799d734b2f7dd4b10_667x572.png)
页面:
![](https://img.kancloud.cn/14/ab/14ab5336ba7c454bf431ca00923be69d_963x531.png)
后端接口:
(1)新建登录控制器
![](https://img.kancloud.cn/e5/bb/e5bb4491e3879203d037301da4013715_1459x636.png)
(2)引入路由
![](https://img.kancloud.cn/56/a5/56a50e0eaf2d7bc28d9fad4da5891d50_871x621.png)
(3)编辑登录接口函数
~~~
public function index()
{
// 获取前端传值
$data = request() -> param();
// dump($data['username']);
// 验证是否输入用户名
if($data['username'] == ""){
return json(['message' => '请输入用户名'], $httpCode = 422);
}
// 在数据库查找用户
$user = Admin::where('username', $data['username'])->find();
if($user){
// 如果有该用户
// 验证是否输入密码
if($data['password'] == ""){
return json(['message' => '请输入密码'], $httpCode = 422);
}
// 验证密码是否正确
if($data['password'] === $user['password']){
return json(['message' => '验证成功'], $httpCode = 200);
}else{
return json(['message' => '密码错误'], $httpCode = 422);
}
}else{
// 如果没有该用户
return json(['message' => '没有该用户'], $httpCode = 422);
}
}
~~~
(4)前端全局监听响应的拦截,将错误时发送的message在页面显示
~~~
// 全局进行响应的拦截(axios内的响应拦截方法)
http.interceptors.response.use(res => {
return res
},err => {
// 如果拦截到错误的操作,使用VUE将错误信息进行弹出展示
// 获取错误信息console.log(err.response.data.message)
Vue.prototype.$message({
type: 'error',
message: err.response.data.message
})
return Promise.reject(err)
})
~~~
![](https://img.kancloud.cn/8e/8d/8e8dff505cdd31ae5288dd8db1433c73_945x571.png)
测试:
![](https://img.kancloud.cn/01/9f/019f9e6a2073f2b3955db62a87e1d131_1215x582.png)
![](https://img.kancloud.cn/80/c8/80c8e7a61a006bbb0364d139803e4144_1215x582.png)
![](https://img.kancloud.cn/70/af/70af3f6994790d7b905de32fb7dc0577_1215x582.png)
![](https://img.kancloud.cn/3e/07/3e0718526291ceff9293d57a762ccb58_1215x582.png)
![](https://img.kancloud.cn/0d/26/0d26ca32cbfd8dd1707f0bfb9ed6b385_1215x582.png)
到此登录功能实现。
###### 2.密码jwt加密
(1)为什么给密码加密?
虽然密码输入的type为password,但是我们仍可看到用户的密码:
![](https://img.kancloud.cn/8d/86/8d86f7a458c28428031ea33781c03781_1215x999.png)
作为一名合格程序员,不光要保护用户数据安全,还要保证用户的隐私安全。用户密码同样涉及到用户隐私,很多人为了更容易记住密码,会在多个平台使用相同的密码进行用户注册和登录。
(2)为什么使用bcrypt加密?
传统加密方法最常用的为md5加密,但是md5加密是以特定算法对字符串密码进行格式化加密的操作,说直白一点,是可以根据规律进行反向解密的。
而bcrypt加密方法很好地解决了这个问题,相同的密码加密出的字符串各不相同,无法反向解密,只可进行比对验证。
(3)使用bcrypt加密
在php5.5.0之后版本中,php内部封装了bcrypt加密和解密方法,无需像go\\node等后端语言一样需要下载bcrypt包进行密码的加密解密操作。
同时,php的password\_hash()方法省略了salt加盐过程,每次密码的散列生成时会自动生成随机的盐值,无需我们自己设置。
一般我们使用PASSWORD\_DEFAULT 算法进行密码的加密,更多详细信息大家可以去php手册https://www.runoob.com/php/php-password\_hash.html了解。
修改之前的接口:
添加管理员
![](https://img.kancloud.cn/e7/30/e7308a4cf679fea8bbc615ab18e42087_620x396.png)
修改管理员信息
![](https://img.kancloud.cn/ed/0a/ed0a0d407bd6d9c8f0fef305b52eedde_719x292.png)
测试:
![](https://img.kancloud.cn/f0/19/f019d77dc56f539a1655d9c590157146_856x820.png)
此时,密码加密成功。
###### 3.bcrypt密码验证
所谓密码验证,就是指在登录时输入用户设置的密码如123456,将123456通过bcrypt特殊方法与之前加密的值做比对的过程。
同样的,php封装好了bcrypt方法`password_verify($password, $hash)`。
修改登录接口:
![](https://img.kancloud.cn/3b/1b/3b1bda842af76fcaa2b9d72915f87e4a_754x564.png)
测试:
![](https://img.kancloud.cn/c6/7b/c67bf556b518ee77b7e978eecde5805a_1215x582.png)
![](https://img.kancloud.cn/ed/f7/edf7c74061d5f5024e9703f9ba60e887_1215x582.png)
密码的验证成功。
到此,用户登录和密码隐私安全问题已解决。
下篇文章完善登录功能,加入登陆的token验证。
- tp6+vue
- 1.工具和本地环境
- 2.启动项目
- 3.路由、模型与数据库操作
- 4.优化后端接口,前端使用axios实现接口功能
- 5.用户登录,bcrypt(hash)加密与验证
- 6.用户登录(二),token验证
- 7.分类的模型关联和通用CRUD接口
- 8.使用vue的markdown编辑器并批量上传图片
- Node.js + Vue.js
- 工具,本地环境
- 2.1启动项目
- 3.element-ui和vue-router路由的安装和使用
- 4.使用axios,并创建接口上传数据到mongodb数据库
- 5.mongoodb数据库的“删、改、查”操作
- 6.mongodb数据库无限层级的数据关联(子分类)
- 7.使用mongodb数据库关联多个分类(关联多个数据)
- 8.server端使用通用CRUD接口
- 9.图片上传
- 10.vue的富文本编辑器(vue2-editor)
- 11.动态添加分栏上传多组数据
- 12-1.管理员模块
- 13-1.搭建前台web端页面
- 1.使用sass工具搭建前台web端页面
- 2.sass工具的变量
- 3.使用flex布局并开始搭建web端
- 4.vue广告轮播图,并使用接口引入数据
- 5.使用字体图标(iconfont)
- 6.卡片组件的封装
- 14-1.生产环境编译
- 1.环境编译
- 2.购买域名服务器并解析域名到服务器
- 3.nginx配置web服务器并安装网站环境
- 4.git拉取代码到服务器
- 5.配置Nginx反向代理
- 6.迁移本地数据到服务器(mongodump)
- uni
- 1.工具&本地环境
- 2.页面制作
- 3.页面制作、组件与轮播
- 4.页面跳转与横向滑动
- 5.用户授权登录和用户信息获取
- 6.用户注册和数据存储
- 7.用户填写表单信息