Heim  >  Artikel  >  PHP-Framework  >  Detaillierte Erläuterung der Laravel-Single-Sign-On-Methode

Detaillierte Erläuterung der Laravel-Single-Sign-On-Methode

WBOY
WBOYnach vorne
2022-06-15 11:45:122735Durchsuche

Dieser Artikel vermittelt Ihnen relevantes Wissen über laravel, das hauptsächlich Probleme im Zusammenhang mit Single Sign-On einführt. Single Sign-On bedeutet, dass sich Benutzer in mehreren Anwendungssystemen nur einmal anmelden müssen, um auf alle zuzugreifen. Werfen wir einen Blick auf das Ich hoffe, dass es für alle hilfreich sein wird.

Detaillierte Erläuterung der Laravel-Single-Sign-On-Methode

【Verwandte Empfehlung: Laravel-Video-Tutorial

Single Sign On (Single Sign On), auch als SSO bezeichnet, ist eine der beliebtesten Lösungen für die Unternehmensintegration. Die Definition von SSO besteht darin, dass sich Benutzer in mehreren Anwendungssystemen nur einmal anmelden müssen, um auf alle gegenseitig vertrauenswürdigen Anwendungssysteme zuzugreifen.

Nachdem Sie sich beim Hauptsystem angemeldet haben, gelangen Sie zum Subsystem. Sie müssen sich nicht anmelden, um auf das Subsystem-Backend zuzugreifen (nehmen Sie Laravel-Administrator als Beispiel)

Hauptsystemkonfiguration : Laravel-Einzelbenutzeranmeldung

Die Subsystemkonfiguration ist wie folgt: Melden Sie sich bei

EncoreAdminControllersAuthController.php an und ändern Sie sie. Sie können die Methode trennen, ohne die Quelldatei zu ändern. 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_MAJOR1_'. $credentials['username'])){
               $time = time();
                // 当前 time 存入 Redis
               Redis::set('STRING_SINGLETOKEN_MAJOR1_'. $credentials['username'], $time);
           }
           
           //局域网不通用 但设备使用 注释上边多设备使用
           //   $time = time();
           
           $time=Redis::get('STRING_SINGLETOKEN_MAJOR1_'. $credentials['username']);
           // md5 加密
           $singleToken = md5($request->getClientIp() . $credentials['username'] . $time .'cjfdm');
           Redis::set('SINGLETOKEN_MAJOR1_'. $credentials['username'],$singleToken);
           
           // 用户信息存入 Session
           Session::put('user_login', $credentials['username']);
        
        
         return redirect()->intended($this->redirectPath())->withCookie('SINGLETOKEN', $singleToken);
    }

Zuerst nach erfolgreicher Anmeldung den aktuellen Zeitstempel abrufen und den Benutzer über IP und Zeit abfragen Benutzername und eindeutige Anti-Diebstahl-Zeichenfolge „onlykey“, „onlykey“ kann ein beliebiges Zeichen sein, eine MD5-Verschlüsselung durchführen und TOKEN erhalten. Dann speichern wir den Zeitstempel und das Token, die wir gerade erhalten haben, in Redis und Redis Key wird mit dem Benutzernamen in der Zeichenfolge verkettet, was für die nachfolgende Middleware TOKEN praktisch ist Überprüfen Sie, und dann speichern wir die Benutzerinformationen in Session. Der Unterschied zwischen dem oben genannten und dem Hauptsystem besteht darin, dass der Rediskey einen anderen Zweck hat Das Löschen hat keine Auswirkungen auf die Subsystem-Anmeldung.

Middleware erstellen MD5 加密, 得到 TOKEN 。然后我们将刚刚得到的时间戳以及token, 存入 Redis, Redis Key 为字符串拼接上username, 方便后面中间件的 TOKEN 验证, 然后我们把用户信息存入 Session . 上边与主系统区别,为Redis的 rediskey不同,目的主系统账号被顶掉的情况不影响分系统登录

创建中间件

中间件通俗点说就是访问方法时,会提前验证中间件的内容,验证通过可以访问要访问方法

命令创建中间件

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

上面个命令会在 app/Http/Middleware下面生成一个SsoMiddleware.php 文件, 将中间件添加到app/Http/ Kernel.php

protected $routeMiddleware = []中添加以下

'SsoMiddleware' => \App\Http\Middleware\SsoMiddleware::class,

现在到中间件中写程序 app/Http/Middleware/SsoMiddleware.php, 在文件中有 handle 方法, 我们在这个方法中写逻辑.

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');
        $info=array();
        
        $info['time']=$request->input('time');
        $info['username']=$request->input('username');
        $info['token']=$request->input('token');
        if(!$info['username']||!$username){
            $url=$request->getRequestUri();
            if(in_array($url,$array)){
        
                return $next($request);
                exit;
            }
        }
       
        
        if ($username) {
            
            // 获取 Cookie 中的 token
            $singletoken = Redis::get('SINGLETOKEN_MAJOR1_'.$username);
            if ($singletoken) {
                // 从 Redis 获取 time
                $redisTime = Redis::get('STRING_SINGLETOKEN_MAJOR1_'. $username);
                // 重新获取加密参数加密
                $ip = $request->getClientIp();
                $secret = md5($ip . $username . $redisTime.'cjfdm');
                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 {
            if ($info['username']) {
                $singletoken = $info['token'];
                $redisTime =$info['time'];
                $username=$info['username'];
                $ip = $request->getClientIp();
                $secret = md5($ip . $username . $redisTime.'cjfdm');
                 if ($singletoken != $secret) {   
                     return redirect('/'.$prefix.'/auth/logout');
                 }else{
                     $remember = $request->get('remember', false);
                     
                     $credentials['username']=$info['username'];
                    
                    if (Auth::guard('admin')->attempt($credentials, $remember)) {
                        // return $this->sendLoginResponse($request);
                        $request=Request();
                        return $this->sendLoginResponse($request,$credentials);
                    }
                     
                     
                 } 
            }else{
                 return redirect('/'.$prefix.'/auth/logout');
            }
            
        }
    }

上面中间件之中做的事情是: 获取用户存在 Session 之中的数据作为第一重判断, 如果通过判断, 进入第二重判断, 先获取token 以及存入 Redis 的时间戳, 取出来安顺序和IP,username,time,onlykey,MD5加密, 加密后和客户端得到的token

Laienhaft ausgedrückt: 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

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

Der obige Befehl befindet sich in . Erzeugen Sie eine <code>SsoMiddleware.php-Datei unter app/Http/Middleware und fügen Sie die Middleware zur App hinzu /Http/ Kernel.phpprotected $routeMiddleware = [ ] Fügen Sie Folgendes hinzu

'middleware' => ['web', 'admin','SsoMiddleware'],

Schreiben Sie nun das Programm in die Middleware app/Http/Middleware/SsoMiddleware.php . Es gibt eine handle-Methode in dieser Methode.

<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Redis;

class SsoController extends Controller
{
    public function ssoinfo(Request $request){
        
        $data=array();
        $data[&#39;username&#39;]=Session::get(&#39;user_login&#39;);
        $data[&#39;time&#39;]=Redis::get(&#39;STRING_SINGLETOKEN_MAJOR_&#39;. $data[&#39;username&#39;]);
       
        $data[&#39;token&#39;]=Redis::get(&#39;SINGLETOKEN_MAJOR_&#39;.$data[&#39;username&#39;]);
        return redirect()->intended("http://activeadmin.rongdeji.com/zhuanshu/auth/login?username=".$data['username'].'&&time='.$data['time'].'&&token='.$data['token']);
    }
    
}

Was die obige Middleware tut, ist: die Daten in der Sitzung des Benutzers abzurufen Wenn das Urteil gefällt wird, gelangen Sie in die zweite Beurteilungsebene. Zuerst werden token und der in Redis gespeicherte Zeitstempel entnommen und mit IP verschlüsselt. Benutzername, Zeit, Onlykey, MD5 und verschlüsselt mit dem vom Client erhaltenen /code>-Vergleich

Der Unterschied zum Hauptsystem besteht darin, dass der Link im Subsystem über einen Benutzernamen verfügt, um die Einzelsignatur zu ermöglichen. Wenn die Token-Verifizierung erfolgreich ist, können Sie sich beim Subsystem anmelden, ohne das Passwort zu kennen.

Die Fehler/Eingabeaufforderung ist ein Eingabeaufforderungsstil und Sie müssen hier klicken, um die Methode „clearsession()“ herunterzuladen rrreee

Routing-Gruppe

Wir haben die Logik fertig geschrieben. Der letzte Schritt besteht darin, jeden Schritt des Anmeldevorgangs des Benutzers zu steuern.

Ändern Sie die Konfiguration /admin.php🎜rrreee🎜Da ist auch eine Schritt-Hauptsystem-Single-Sign-On-Subsystem-Methode🎜rrreee🎜Zugriff auf Ssoinfo nach Routing-Bindung🎜🎜Erfolgreiche Anmeldung! ! ! 🎜🎜【Verwandte Empfehlung: 🎜Laravel-Video-Tutorial🎜】🎜

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Laravel-Single-Sign-On-Methode. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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