>PHP 프레임워크 >Laravel >Laravel 단일 사용자 로그인을 자세히 설명하기 위해 laravel-admin을 예로 들어보겠습니다.

Laravel 단일 사용자 로그인을 자세히 설명하기 위해 laravel-admin을 예로 들어보겠습니다.

WBOY
WBOY앞으로
2022-04-21 17:54:313183검색

이 글은 단일 사용자 로그인과 관련된 문제를 주로 소개하는 Laravel에 대한 관련 지식을 제공합니다. laravel-admin을 예로 들어 단일 사용자 로그인 관련 내용을 살펴보겠습니다. .

Laravel 단일 사용자 로그인을 자세히 설명하기 위해 laravel-admin을 예로 들어보겠습니다.

【관련 추천: laravel 비디오 튜토리얼

모두가 단일 사용자 로그인이라는 용어를 들어봤을 것입니다. 단일 사용자 로그인이 필요한 이유는 무엇입니까? 예: 계정이 VIP로 충전되는 경우 비디오 웹사이트 , 그리고 자신을 추가하는 경우 귀하의 계정을 다른 사람들과 공유하면 다른 사람들도 VIP 권한을 갖게 되며 회사의 이익이 1,000명, 10,000명과 공유되면 손실이 상당할 것입니다. , 그래서 오늘은 주문을 하도록 안내해 드리겠습니다.

코드 추가

use Illuminate\Support\Facades\Session;
use Illuminate\Support\Facades\Redis;

postLogin() 메소드 수정
if ($this->guard()->attempt($credentials, $remember)) {
     
     // return $this->sendLoginResponse($request);//此注释修改为以下
     return $this->sendLoginResponse($request,$credentials);
}
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);
        
    }

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());
    }

먼저 로그인 성공 후 현재 타임스탬프를 가져와서 IP, 시간을 통해 사용자에게 쿼리합니다. 사용자 이름과 유일한 도난 방지 문자열 onlykey, onlykey는 모든 문자일 수 있으며 MD5 암호화를 수행하고 TOKEN을 얻을 수 있습니다. 그런 다음 방금 Redis에 가져온 타임스탬프와 토큰을 저장합니다. Redis 키는 나중에 미들웨어에서 토큰 확인을 용이하게 하기 위해 사용자 이름과 연결됩니다. 그런 다음 사용자 정보를 세션에 저장합니다.

Create middleware

Middle 간단히 말하면, 메소드에 접근할 때 미들웨어의 내용을 미리 검증한 후 접근할 메소드에 접근하면 됩니다.

미들웨어 생성 명령

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

위 명령은 app/Http/Middleware.php 파일 아래 SsoMiddleware.php, app/Http/ Kernel.php

protected $routeMiddleware = []에 미들웨어를 추가하고 다음을 추가합니다

'SsoMiddleware' => \App\Http\Middleware\SsoMiddleware::class,
이제 미들웨어로 이동하여 app/Http 프로그램을 작성합니다. /Middleware/SsoMiddleware.php 파일 메소드에 핸들이 있는데, 이 메소드에 로직을 작성합니다.

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');
        }
    }

위 미들웨어가 하는 일은: 첫 번째 판단 단계로 세션에서 사용자의 데이터를 가져오는 것입니다. 판단, 두 번째 판단 단계에 들어가서 먼저 토큰을 가져옵니다. Redis에 저장된 타임스탬프뿐만 아니라 보안 시퀀스를 꺼내 IP, 사용자 이름, 시간, 전용 키, MD5를 암호화한 후 클라이언트가 얻은 토큰과 비교합니다.

오류/프롬프트는 프롬프트 스타일이며 다운로드하려면 여기를 클릭해야 합니다.

clearsession() 메소드를 지우세요

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

라우팅 그룹

로직 작성이 완료되었습니다. 여기에는 라우팅 그룹이 필요합니다.

Modify config/admin.php

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

하나의 Wi-Fi를 사용하여 여러 장치에 로그인할 수 있습니다. 다른 네트워크에서 후자에 로그인하면 이전

끝났습니다! ! !

【관련 추천:

laravel 동영상 튜토리얼

위 내용은 Laravel 단일 사용자 로그인을 자세히 설명하기 위해 laravel-admin을 예로 들어보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 zlhdsg에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제