Heim > Artikel > PHP-Framework > Detaillierte Erläuterung der Laravel-Single-Sign-On-Methode
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.
【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
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.php
protected $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['username']=Session::get('user_login'); $data['time']=Redis::get('STRING_SINGLETOKEN_MAJOR_'. $data['username']); $data['token']=Redis::get('SINGLETOKEN_MAJOR_'.$data['username']); 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
Die Fehler/Eingabeaufforderung ist ein Eingabeaufforderungsstil und Sie müssen hier klicken, um die Methode „clearsession()“ herunterzuladen rrreee
Routing-Gruppe
Ä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!