Rumah  >  Artikel  >  rangka kerja php  >  Penjelasan terperinci kaedah log masuk tunggal laravel

Penjelasan terperinci kaedah log masuk tunggal laravel

WBOY
WBOYke hadapan
2022-06-15 11:45:122848semak imbas

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.

Penjelasan terperinci kaedah log masuk tunggal laravel

[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

. Cipta middleware

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
di bawah

, tambahkan middleware ke app/Http/ app/Http/MiddlewareSsoMiddleware.phpKernel.phpprotected $routeMiddleware = [] dan tambahkan yang berikut

Sekarang tulis program dalam middleware
'SsoMiddleware' => \App\Http\Middleware\SsoMiddleware::class,
Terdapat kaedah

dalam fail. Kami menulis logik dalam kaedah ini. app/Http/Middleware/SsoMiddleware.phphandle

Perkara yang dilakukan dalam middleware di atas ialah: Dapatkan data dalam kewujudan pengguna
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');
            }
            
        }
    }
sebagai peringkat pertama penghakiman Jika ia lulus penghakiman, masukkan peringkat kedua pertama dapatkan

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 tokendi 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'],
Akses ssoinfo selepas mengikat laluan

Berjaya log masuk! ! !
<?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']);
    }
    
}

[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!

Kenyataan:
Artikel ini dikembalikan pada:csdn.net. Jika ada pelanggaran, sila hubungi admin@php.cn Padam