Heim  >  Artikel  >  PHP-Framework  >  Nehmen Sie Laravel-Admin als Beispiel, um die Laravel-Einzelbenutzeranmeldung im Detail zu erläutern

Nehmen Sie Laravel-Admin als Beispiel, um die Laravel-Einzelbenutzeranmeldung im Detail zu erläutern

WBOY
WBOYnach vorne
2022-04-21 17:54:313122Durchsuche

Dieser Artikel vermittelt Ihnen relevantes Wissen über Laravel, das hauptsächlich Probleme im Zusammenhang mit der Einzelbenutzeranmeldung vorstellt. Schauen wir uns den relevanten Inhalt der Einzelbenutzeranmeldung am Beispiel von Laravel-Admin an . .

Nehmen Sie Laravel-Admin als Beispiel, um die Laravel-Einzelbenutzeranmeldung im Detail zu erläutern

【Verwandte Empfehlung: Laravel-Video-Tutorial

Jeder hat schon einmal von dem Begriff Einzelbenutzer-Anmeldung gehört. Warum benötigen Sie eine Einzelbenutzer-Anmeldung? Zum Beispiel: Video-Website, wenn ein Konto mit VIP aufgeladen wird , und dann können Sie Wenn Ihr Konto mit anderen Personen geteilt wird, haben auch andere Personen VIP-Privilegien und die Interessen des Unternehmens werden geschädigt. Wenn das Konto mit 1.000 oder 10.000 Personen geteilt wird, ist der Verlust erheblich. Deshalb werde ich Sie heute dazu bringen, eine Benutzeranmeldung aufzugeben .

Code hinzufügen

use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Redis;

PostLogin()-Methode ändern
if ($this->guard()->attempt($credentials, $remember)) {
     
     // return $this->sendLoginResponse($request);//此注释修改为以下
     return $this->sendLoginResponse($request,$credentials);
}
sendLoginResponse()-Methode ändern

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

createtoken()-Methode hinzufügen

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());
    }

Zuerst nach erfolgreicher Anmeldung den aktuellen Zeitstempel abrufen und den Benutzer über IP und Zeit abfragen Benutzername und die einzige Anti-Diebstahl-Zeichenfolge „onlykey“, „onlykey“ kann ein beliebiges Zeichen sein, MD5-Verschlüsselung durchführen und TOKEN erhalten. Dann speichern wir den soeben erhaltenen Zeitstempel und das Token in Redis. Der Redis-Schlüssel wird mit dem Benutzernamen an die Zeichenfolge angehängt, um die TOKEN-Überprüfung der späteren Middleware zu erleichtern. Anschließend speichern wir die Benutzerinformationen in der Sitzung.

Middleware erstellen

Mitte Um es einfach auszudrücken: Beim Zugriff auf eine Methode wird der Inhalt der Middleware im Voraus überprüft. Nach der Überprüfung können Sie auf die Methode zugreifen, auf die zugegriffen werden soll.

Befehl zum Erstellen von Middleware

// 项目根目录运行
    php artisan make:middleware SsoMiddleware

Der obige Befehl wird generiert eine SsoMiddleware.php unter app/Http/Middleware. Fügen Sie die Middleware zu app/Http/ Kernel.php

protected $routeMiddleware = [] hinzu und fügen Sie Folgendes hinzu

'SsoMiddleware' => \App\Http\Middleware\SsoMiddleware::class,
Gehen Sie nun zur Middleware und schreiben Sie das Programm app/ Http/Middleware/SsoMiddleware.php, es gibt ein Handle in der Datei Methode, wir schreiben Logik in diese Methode

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');
        }
    }

Was die obige Middleware tut, ist: die in der Sitzung gespeicherten Benutzerdaten als erste Beurteilungsebene abzurufen Nachdem Sie das Urteil gefällt haben, betreten Sie die zweite Beurteilungsebene und holen Sie sich zuerst das Token und den in Redis gespeicherten Zeitstempel. Nehmen Sie die Sicherheitssequenz heraus und verschlüsseln Sie IP, Benutzername, Zeit, Onlykey und MD5. Vergleichen Sie sie nach der Verschlüsselung mit dem erhaltenen Token vom Client.

Die Fehler/Eingabeaufforderung ist ein Eingabeaufforderungsstil und Sie müssen hier klicken, um die Methode „clearsession()“ zu löschen

public function clearsession(Request $request){
        $prefix=config('admin.route.prefix');
       return  redirect('/'.$prefix.'/auth/logout');
}

Routinggruppe

Wir haben die Logik fertig geschrieben Bei jedem Schritt des Anmeldevorgangs des Benutzers benötigen wir die Routing-Gruppe

Du bist fertig! ! !

【Verwandte Empfehlung:

Laravel-Video-Tutorial

Das obige ist der detaillierte Inhalt vonNehmen Sie Laravel-Admin als Beispiel, um die Laravel-Einzelbenutzeranmeldung im Detail zu erläutern. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:zlhdsg. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen