ThinkPHP6项目基操(16.实战部分 redis+token登录)

前言

登录一般可以使用session处理,它使用比较简单,但是一般用在web端比较多。如果需要考虑在多端运行,使用redis+token方式更加方便,为啥使用redis而不是使用数据库存储token呢?当然数据库是可以存储的,后台可以请求数据库查询token字段,但是如果考虑高并发的情况,redis更加适合,一般查询用户信息的地方不会很多,判断用户是否登录的情况会比较多。

一、生成唯一token

可以新建一个common类,专门放与字符串相关的方法:

<?php

namespace app\common\lib;

class Str
{
    public static function getLoginToken($string){
        // 生成 token
        $str = md5(uniqid(md5(microtime(true)), true));
        return sha1($str . $string);
    }
}

二、设置token并返回token到前端

在登录接口中,先判断参数,如果参数通过,在生成token,将token存于radis中并设置失效时间,然后返回token到前端:

// business层的登录方法
public function login($data){
	// 省略登录参数验证与数据库更新操作
	$token = Str::getLoginToken($data["phone_number"]);
	$redisData = [
		"id" => $userId,
		"username" => $username
	];
	// 保存token到redis, 有效期7天
	$res = cache(config("radis.token_pre").$token, $redisData, 7 * 24 * 3600);
	return $res ? ["token" => $token, "username" => $username] : false;
}

这里直接使用cache保存,是因为在cache.php配置文件里设置了方式为redis,详情可以看这篇文章的3.4配置缓存redis:阿里云短信结合redis实现登录

// controller控制器层的登录方法  调用business层的方法
$result = (new User())->login($data);
if($result){
	return show(config('status.success'), "登录成功", $result);
}else{
	return show(config('status.error'), "登录失败");
}

前端请求成功后获取到token,然后保存下来,下次发请求的时候带上,后台去redis里查询,如果token不存在或过期就会被后台拦截。
在这里插入图片描述

Tips: 这里的token也不是百分百安全,因为如过有用户获取到了token,那么在有效期内这个token可以一直访问到后台数据,这个也是无法解决的事。

三、登录拦截器(需要登录/不需登录)

待写。。。


⭐️重磅推荐:免费商用电商系统

😏想白嫖整个电商系统用来商用?
🤑想有自己的商城实现财富自由?
🤓想学习最佳实践提升自己技术?

快来进入🚀 传送门 🚀,开源免费、完整示例带你快速入门,轻松二开,走上人生巅峰!👨‍🎓
在这里插入图片描述

  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

优小U

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值