Rumah >rangka kerja php >Laravel >Mengambil laravel-admin sebagai contoh untuk menerangkan log masuk pengguna tunggal Laravel secara terperinci

Mengambil laravel-admin sebagai contoh untuk menerangkan log masuk pengguna tunggal Laravel secara terperinci

WBOY
WBOYke hadapan
2022-04-21 17:54:313182semak imbas

Artikel ini membawakan anda pengetahuan yang berkaitan tentang Laravel, yang terutamanya memperkenalkan isu yang berkaitan dengan log masuk pengguna tunggal Mari kita lihat kandungan yang berkaitan log masuk pengguna tunggal menggunakan laravel-admin sebagai contoh kepada semua orang.

Mengambil laravel-admin sebagai contoh untuk menerangkan log masuk pengguna tunggal Laravel secara terperinci

[Cadangan berkaitan: tutorial video laravel]

Semua orang pernah mendengar istilah log masuk pengguna tunggal, mengapa kita perlu Log masuk pengguna tunggal? Contohnya: pada laman web video, jika akaun dicaj semula dengan VIP dan kemudian berkongsi akaunnya dengan orang lain, maka orang lain juga akan mempunyai keistimewaan VIP, dan kepentingan syarikat akan rosak dibahagikan antara 1,000 orang , 10,000 orang, kerugian ini bukan sedikit, jadi hari ini saya akan membawa anda melalui log masuk pengguna tunggal

Ini laravel-admin sebagai contoh

Log masuk.

EncoreAdminControllersAuthController.php diubah suai untuk memisahkan kaedah tanpa mengubah 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_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());
    }

Selepas log masuk mula-mula berjaya, dapatkan cap masa semasa, pertanyaan melalui IP, masa dan dapatkan nama pengguna pengguna dan kunci sahaja rentetan anti-kecurian yang unik boleh menjadi sebarang aksara, lakukan penyulitan MD5, dan dapatkan TOKEN. Kemudian kami menyimpan cap masa dan token yang baru kami perolehi ke dalam Redis Key digabungkan dengan nama pengguna ke dalam rentetan untuk memudahkan pengesahan TOKEN dalam perisian tengah berikutnya.

Buat middleware

Dalam istilah orang awam, middleware bermaksud apabila mengakses kaedah, kandungan middleware akan disahkan terlebih dahulu, kaedah yang hendak diakses boleh diakses >Arahan untuk mencipta middleware

Arahan di atas akan menjana fail SsoMiddleware.php di bawah app/Http/Middleware dan menambah middleware pada app/Http/ Kernel.php
// 项目根目录运行
    php artisan make:middleware SsoMiddleware

protected $routeMiddleware = [] Di bawah

Sekarang pergi ke middleware dan tulis aplikasi program/Http/Middleware/SsoMiddleware.php. Terdapat kaedah pemegang dalam fail dalam kaedah ini.
'SsoMiddleware' => \App\Http\Middleware\SsoMiddleware::class,

Apa yang dilakukan oleh perisian tengah di atas ialah: Dapatkan data pengguna yang disimpan dalam Sesi sebagai peringkat pertama penghakiman, masukkan peringkat kedua penghakiman token dan cap masa yang disimpan dalam Redis, dan kemudian keluarkannya dan tetapkan perintah Sulitkan IP, nama pengguna, masa, kunci sahaja, MD5, dan bandingkan dengan token yang diperolehi oleh pelanggan selepas penyulitan mereka, ralat/Prompt ialah gaya segera dan anda perlu klik di sini untuk memuat turun
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');
        }
    }

Kaedah clearsession() Kosongkan

Kumpulan penghalaan

Kami telah selesai menulis logik. Langkah terakhir ialah mengawal setiap langkah operasi pengguna selepas log masuk. Di sini kita memerlukan kumpulan penghalaan.
public function clearsession(Request $request){
        $prefix=config('admin.route.prefix');
       return  redirect('/'.$prefix.'/auth/logout');
}

Ubah suai konfigurasi/admin.php

Anda boleh menggunakan satu wifi untuk log masuk ke berbilang peranti. Log masuk ke peranti yang terakhir di bawah rangkaian yang berbeza akan mengatasi yang pertama

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

Anda sudah selesai! ! !

Mengambil laravel-admin sebagai contoh untuk menerangkan log masuk pengguna tunggal Laravel secara terperinci[Cadangan berkaitan:

tutorial video laravel

]

Atas ialah kandungan terperinci Mengambil laravel-admin sebagai contoh untuk menerangkan log masuk pengguna tunggal Laravel secara terperinci. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

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