Operações básicas do projeto ThinkPHP6 (16. parte do combate real do redis + token de login)

Prefácio

O login geralmente pode ser sessionprocessado, é relativamente simples de usar, mas geralmente é mais usado no webfinal. Se você precisa considerar a execução em vários terminais, redis+tokené mais conveniente usar, por que usar em redisvez de usar o armazenamento de banco de dados token? Obviamente, o banco de dados pode ser armazenado e o segundo plano pode solicitar tokencampos de consulta do banco de dados , mas se você considerar a alta simultaneidade, é redismais adequado. Geralmente, não há muitos lugares para consultar as informações do usuário e há mais casos para determinar se um usuário está conectado.

1. Gere um token único

Você pode criar uma nova commonclasse para colocar especificamente métodos relacionados a strings:

<?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. Defina o token e retorne-o ao front end

Na interface de login, os parâmetros são julgados primeiro. Se os parâmetros forem passados, eles tokenserão tokenarmazenados na geração radise definirão o tempo de expiração, e então retornarão tokenao front end:

// 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;
}

cacheSalvar é usado diretamente aqui porque cache.phpo método é definido no arquivo de configuração. Para obter redisdetalhes, consulte o cache de configuração 3.4 redis neste artigo: Alibaba Cloud SMS combinado com redis para obter o login

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

Depois que a solicitação de front-end for bem-sucedida, ela será obtida tokene salva. Quando você enviar a solicitação da próxima vez, poderá trazê-la para o back-end para fazer uma redisconsulta. Se ela tokennão existir ou expirar, será interceptada pelo back-end.
Insira a descrição da imagem aqui

Dicas: Isso tokennão é 100% seguro, pois se o usuário o obteve token, ele tokensempre pode acessar os dados de background durante o período de validade.Também é uma questão insolúvel.

Três, interceptor de login (login necessário / nenhum login necessário)

Para ser escrito. . .

Acho que você gosta

Origin blog.csdn.net/zy1281539626/article/details/111330224
Recomendado
Clasificación