给用当前登录的用户信息的id 生成token token作为redis的键 给token 设置值 设置token键的到期过期时间 登陆成功 token返回前端 前端每次调用接口都要传token
<?php
namespace app\api\controller\liumy;
use think\cache\driver\Redis;
class Index //extends Base
{
public static $userinfo;
public function __construct()
{
//随便写的一个判断 验证登陆的方法 登陆时不需要
if(\think\facade\Request::param('token')){
self::check_login();
}
}
/**
* 用户登陆
*/
public function login(){
$redis = new Redis();
//根据用户名 密码 查询用户信息忽略
//假如登陆用户的id为12
$uid = 12;
//假设token为 token生成方式 md5($uid.time().rand(10000,99999))
$token = md5($uid.time().rand(10000,99999)); //如果要保证token的唯一 可以生成token的方式复杂一些
//可以把每次生成的token 和 对应的uid 以日志的方式记录下来
//登陆信息正确 用户信息为
$userinfo = [
'id' => 12,
'username' => 'admin',
'rule' => '1,2,3,4',
'passwd' => 'admin'
];
//1,可以把token对应的用户信息(比如:用户id)存在数据库 方便根据token获取用户信息
//2,也可以给redis中的$token键赋值用户信息的数据
//以第一种方式举例
$res = $redis->set($token,json_encode($userinfo),30); //登陆有效时间为30秒
if($res){
exit(json_encode([
'code' => 200,
'msg' => '登陆成功',
'date' => [
'token' => $token, //该token 处理登陆接口 其他接口都要带token
]
]));
}else{
exit(json_encode([
'code' => 201,
'msg' => '登陆失败',
'date' => ''
]));
}
}
/**
* 验证用户登陆
*/
public static function check_login(){
//验证用户登陆
$redis = new Redis();
$token = \think\facade\Request::param('token');
if(!$redis->get($token)){
exit(json_encode([
'code' => 201,
'msg' => '登陆过期 请重新登录',
'date' => ''
]));
}else{
//登陆成功
//获取登陆用户的信息
$userinfo = $redis->get($token);
//因为调用接口有操作 延长token的过期时间
$redis->set($token,$userinfo,30);//只要是有操作 就延长toekn过期时间
dump('已登录,进行其他操作');
dump(json_decode($userinfo));
self::$userinfo = json_decode($userinfo);
//进行接口的其他逻辑操作
die;
}
}
}
|