이 글은 단일 사용자 로그인과 관련된 문제를 주로 소개하는 Laravel에 대한 관련 지식을 제공합니다. laravel-admin을 예로 들어 단일 사용자 로그인 관련 내용을 살펴보겠습니다. .
【관련 추천: laravel 비디오 튜토리얼】
모두가 단일 사용자 로그인이라는 용어를 들어봤을 것입니다. 단일 사용자 로그인이 필요한 이유는 무엇입니까? 예: 계정이 VIP로 충전되는 경우 비디오 웹사이트 , 그리고 자신을 추가하는 경우 귀하의 계정을 다른 사람들과 공유하면 다른 사람들도 VIP 권한을 갖게 되며 회사의 이익이 1,000명, 10,000명과 공유되면 손실이 상당할 것입니다. , 그래서 오늘은 주문을 하도록 안내해 드리겠습니다.
use Illuminate\Support\Facades\Session; use Illuminate\Support\Facades\Redis;
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
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!