Maison > cadre php > Laravel > Prendre laravel-admin comme exemple pour expliquer en détail la connexion mono-utilisateur de Laravel

Prendre laravel-admin comme exemple pour expliquer en détail la connexion mono-utilisateur de Laravel

WBOY
Libérer: 2022-04-21 21:16:42
avant
3189 Les gens l'ont consulté

Cet article vous apporte des connaissances pertinentes sur Laravel, qui présentent principalement des problèmes liés à la connexion mono-utilisateur. Jetons un coup d'œil au contenu pertinent de la connexion mono-utilisateur en utilisant laravel-admin comme exemple. .

Prendre laravel-admin comme exemple pour expliquer en détail la connexion mono-utilisateur de Laravel

【Recommandation associée : tutoriel vidéo laravel

Tout le monde a entendu parler du terme connexion mono-utilisateur, pourquoi avez-vous besoin d'une connexion mono-utilisateur Par exemple : site Web vidéo, si un compte est rechargé avec VIP ? , et alors vous pourrez Si votre compte est partagé avec d'autres personnes, alors d'autres personnes bénéficieront également de privilèges VIP, et les intérêts de l'entreprise seront endommagés. Si le compte est partagé avec 1 000 ou 10 000 personnes, la perte sera considérable. donc aujourd'hui je vous emmène passer une commande. Connexion utilisateur.

Ici, nous prenons laravel-admin comme exemple

Connexion

EncoreAdminControllersAuthController.php modification, vous pouvez séparer la méthode et ne pas la modifier sur le fichier source. .

Ajouter du code

use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Redis;
Copier après la connexion

Modifier la méthode postLogin()

if ($this->guard()->attempt($credentials, $remember)) {
     
     // return $this->sendLoginResponse($request);//此注释修改为以下
     return $this->sendLoginResponse($request,$credentials);
}
Copier après la connexion

Modifier la méthode sendLoginResponse()

protected function sendLoginResponse(Request $request,$credentials)
    {
        admin_toastr(trans('admin.login_successful'));
        $request->session()->regenerate();
        // return redirect()->intended($this->redirectPath());
        // 制作 token
         return $this->createtoken($credentials,$request);
        
    }
Copier après la connexion

Ajouter la méthode createtoken()

protected function createtoken($credentials,$request){
           
           //相同局域网下多设备通用token 
           if(!Redis::get('STRING_SINGLETOKEN_MAJOR_'. $credentials['username'])){
               $time = time();
                // 当前 time 存入 Redis
               Redis::set('STRING_SINGLETOKEN_MAJOR_'. $credentials['username'], $time);
           }
           
           //局域网不通用 但设备使用 注释上边多设备使用
           //   $time = time();
           
           $time=Redis::get('STRING_SINGLETOKEN_MAJOR_'. $credentials['username']);
           // md5 加密
           $singleToken = md5($request->getClientIp() . $credentials['username'] . $time .'onlykey');
           Redis::set('SINGLETOKEN_MAJOR_'. $credentials['username'],$singleToken);
           
           // 用户信息存入 Session
           Session::put('user_login', $credentials['username']);
        
        
         return redirect()->intended($this->redirectPath());
    }
Copier après la connexion

Tout d'abord, après une connexion réussie, obtenez l'horodatage actuel et interrogez l'utilisateur via IP, l'heure Nom d'utilisateur et seule clé antivol. Seule la clé peut être n'importe quel caractère. Le cryptage MD5 est effectué pour obtenir un jeton. Ensuite, nous stockons l'horodatage et le jeton que nous venons d'obtenir dans Redis. La clé Redis est concaténée avec le nom d'utilisateur à la chaîne pour faciliter la vérification du TOKEN du middleware ultérieur. Ensuite, nous stockons les informations utilisateur dans la session.

Créer un middleware

. Middle Pour faire simple, lors de l'accès à une méthode, le contenu du middleware sera vérifié au préalable. Après vérification, vous pourrez accéder à la méthode à laquelle accéder

Commande pour créer un middleware

// 项目根目录运行
    php artisan make:middleware SsoMiddleware
Copier après la connexion

La commande ci-dessus générera. un SsoMiddleware.php sous le fichier app/Http/Middleware., ajoutez le middleware à app/Http/ Kernel.php

protected $routeMiddleware = [] et ajoutez ce qui suit

'SsoMiddleware' => \App\Http\Middleware\SsoMiddleware::class,
Copier après la connexion

Maintenant, allez au middleware et écrivez le programme app/ Http/Middleware/SsoMiddleware.php, il y a un handle dans le fichier Méthode, nous écrivons la logique dans cette méthode

public function handle($request, Closure $next)
    {
        $prefix=config('admin.route.prefix');
        $array=['/'.$prefix.'/auth/login','/'.$prefix.'/auth/logout','/'.$prefix.'/auth/clearsession'];
        $username= Session::get('user_login');
        $url=$request->getRequestUri();
        
       
        if(in_array($url,$array)){
        
            return $next($request);
            exit;
        }
       
        
        if ($username) {
            // 获取 Cookie 中的 token
            $singletoken = Redis::get('SINGLETOKEN_MAJOR_'.$username);
            if ($singletoken) {
                // 从 Redis 获取 time
                $redisTime = Redis::get('STRING_SINGLETOKEN_MAJOR_'. $username);
                // 重新获取加密参数加密
                $ip = $request->getClientIp();
                $secret = md5($ip . $username . $redisTime.'onlykey');
                if ($singletoken != $secret) {              
                    // 记录此次异常登录记录
                    // \DB::table('data_login_exception')->insert(['guid' => $userInfo->guid, 'ip' => $ip, 'addtime' => time()]);
                    // 清除 session 数据
                    
                    // abort('404','你可能来到了没有知识的荒漠');
                    // return redirect('/'.$prefix.'/auth/logout');
                    // $request->session()->invalidate();
                    $data = [
                        'message' => '您的帐号在另一个地点登录..!',
                        'url' => '/'.$prefix.'/auth/clearsession',
                        'jumpTime' => 5,
                        'status' => 'error'
                    ];
                    //显示模板及数据
                    return response()-> view('errors/Prompt',compact('data'));
                }
                return $next($request);
            } else {
                return redirect('/'.$prefix.'/auth/logout');
            }
        } else {
            
            return redirect('/'.$prefix.'/auth/logout');
        }
    }
Copier après la connexion

Ce que fait le middleware ci-dessus est : obtenir les données de l'utilisateur stockées dans la session comme premier niveau de jugement. passe le jugement, entrez dans le deuxième niveau de jugement, récupérez d'abord le jeton ainsi que l'horodatage stocké dans Redis, retirez la séquence de sécurité et cryptez l'IP, le nom d'utilisateur, l'heure, la clé uniquement, MD5. Après le cryptage, comparez-le avec le jeton obtenu. par le client.

L'erreur/invite est un style d'invite et vous devez cliquer ici pour télécharger

Effacer la méthode clearsession()

public function clearsession(Request $request){
        $prefix=config('admin.route.prefix');
       return  redirect('/'.$prefix.'/auth/logout');
}
Copier après la connexion

Groupe de routage

Nous avons fini d'écrire la logique. La dernière étape consiste à contrôler. chaque étape de l'opération de connexion de l'utilisateur. Ici, nous avons besoin du groupe de routage.

Modifiez config/admin.php

'middleware' => ['web', 'admin','SsoMiddleware'],
Copier après la connexion

Vous pouvez vous connecter à plusieurs appareils en utilisant un seul wifi. La connexion à ce dernier sous différents réseaux remplacera le premier

. Prendre laravel-admin comme exemple pour expliquer en détail la connexion mono-utilisateur de Laravel

Vous avez terminé ! ! !

【Recommandation associée : tutoriel vidéo Laravel

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:zlhdsg
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal