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

前言

登陆通常可使用session处理,它使用比较简单,可是通常用在web端比较多。若是须要考虑在多端运行,使用redis+token方式更加方便,为啥使用redis而不是使用数据库存储token呢?固然数据库是能够存储的,后台能够请求数据库查询token字段,可是若是考虑高并发的状况,redis更加适合,通常查询用户信息的地方不会不少,判断用户是否登陆的状况会比较多。php

1、生成惟一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);
    }
}

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

在登陆接口中,先判断参数,若是参数经过,在生成token,将token存于radis中并设置失效时间,而后返回token到前端:web

// 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实现登陆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能够一直访问到后台数据,这个也是没法解决的事。缓存

3、登陆拦截器(须要登陆/不需登陆)

待写。。。安全

本文同步分享在 博客“zy1281539626”(CSDN)。
若有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一块儿分享。session

相关文章
相关标签/搜索