Artikel ini membawakan anda pengetahuan yang berkaitan tentang laravel, yang terutamanya memperkenalkan isu yang berkaitan dengan log masuk tunggal bermakna dalam berbilang sistem aplikasi, pengguna hanya perlu Selepas log masuk, anda boleh akses semua sistem aplikasi yang saling dipercayai Mari kita lihat bersama-sama.
[Cadangan berkaitan: tutorial video laravel]
Single Sign On (SSO), dirujuk sebagai SSO, ialah perbandingan Salah satu penyelesaian integrasi perniagaan perusahaan yang popular. Takrifan SSO ialah dalam berbilang sistem aplikasi, pengguna hanya perlu log masuk sekali untuk mengakses semua sistem aplikasi yang saling dipercayai.
Selepas log masuk ke sistem utama, anda boleh melompat ke subsistem tanpa log masuk untuk mengakses bahagian belakang subsistem (ambil laravel-admin sebagai contoh)
Konfigurasi sistem utama: laravel log masuk Pengguna tunggal
Konfigurasi subsistem adalah seperti berikut
Log masuk
EncoreAdminControllersAuthController.php diubah suai untuk memisahkan kaedah Ubah suai fail sumber.
Tambah kod
use Illuminate\Support\Facades\Session; use Illuminate\Support\Facades\Redis;
Ubah suai kaedah postLogin()
if ($this->guard()->attempt($credentials, $remember)) { // return $this->sendLoginResponse($request);//此注释修改为以下 return $this->sendLoginResponse($request,$credentials); }
Ubah suai kaedah 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); }
Tambah kaedah createtoken()
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); }
Selepas log masuk mula-mula berjaya, dapatkan cap masa semasa, pertanyaan melalui IP, masa dan dapatkan nama pengguna pengguna dan kekunci sahaja rentetan anti kecurian yang unik boleh menjadi sebarang aksara, lakukan MD5
penyulitan, dan dapatkan TOKEN
. Kemudian kami menyimpan cap masa dan token yang baru kami masukkan Redis
disambungkan ke dalam rentetan dengan nama pengguna untuk memudahkan pengesahan Redis Key
kemudian kami menyimpan maklumat pengguna ke dalam TOKEN
🎜 >Perbezaan antara sistem di atas dan sistem utama ialah cakera semula Redis adalah berbeza Tujuan akaun sistem utama ditolak tidak akan menjejaskan log masuk subsistemSession
Dalam istilah awam, middleware bermaksud apabila mengakses kaedah, kandungan middleware akan disahkan terlebih dahulu Selepas pengesahan, kaedah yang hendak diakses boleh diakses
Arahan untuk mencipta middleware
Arahan di atas akan menghasilkan fail// 项目根目录运行 php artisan make:middleware SsoMiddleware
, tambahkan middleware ke app/Http/ app/Http/Middleware
SsoMiddleware.php
Kernel.php
protected $routeMiddleware = [] dan tambahkan yang berikut
Sekarang tulis program dalam middleware
'SsoMiddleware' => \App\Http\Middleware\SsoMiddleware::class,
dalam fail. Kami menulis logik dalam kaedah ini. 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'); } } }
dan cap masa yang disimpan dalam Session
, dan keluarkan jujukan pemasangan dan IP, nama pengguna Masa, kunci sahaja, penyulitan MD5, selepas penyulitan, bandingkan dengan token
Perbezaan antara Redis
dan sistem utama ialah subsistem mempunyai nama pengguna dalam pautan untuk mendayakan log masuk tunggal Jika pengesahan token berjaya, anda boleh log masuk ke subsistem tanpa mengetahui kata laluan token
di mana ralat/Prompt ialah gaya segera dan anda perlu klik di sini untuk memuat turunKosongkan kaedah clearsession()
Kumpulan penghalaan
public function clearsession(Request $request){ $prefix=config('admin.route.prefix'); return redirect('/'.$prefix.'/auth/logout'); }
Kami telah selesai menulis logik Langkah terakhir ialah mengawal setiap langkah selepas pengguna log masuk. Di sini kami memerlukan kumpulan penghalaan.Ubah suai konfigurasi/admin.php
Terdapat juga kaedah subsistem satu log masuk untuk sistem utama'middleware' => ['web', 'admin','SsoMiddleware'],
<?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']); } }
[Cadangan berkaitan:
tutorial video laravel]
Atas ialah kandungan terperinci Penjelasan terperinci kaedah log masuk tunggal laravel. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!