이 글은 Laravel 5.4 버전의 Auth 모듈 코드 분석 및 작성을 기반으로 합니다.
모듈 구성
Auth 모듈은 기능적으로 파일 구성 측면에서 사용자 인증과 권한 관리, IlluminateAuthPasswords 디렉토리는 비밀번호 재설치 모듈입니다. IlluminateAuth는 사용자 인증 및 권한 관리를 담당하는 모듈입니다. 로그인, 비밀번호 수정 및 비밀번호와 같은 일련의 특정 논리 구현을 제공합니다. 재설정 다음 그림은 인증 모듈의 다양한 파일 간의 관계를 보여줍니다.
사용자 인증
HTTP 자체는 일반적으로 시스템 상호 작용 과정에서 상태가 없습니다. 식별은 인증된 사용자를 결정하는 데 사용됩니다.
구성 파일 해석
return [ 'defaults' => [ 'guard' => 'web', ... ], 'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'api' => [ 'driver' => 'token', 'provider' => 'users', ], ], 'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\User::class, ], ], ], ];
아래에서 올라가서 이해하세요.
providers는 사용자 데이터를 제공하는 인터페이스이며 여기에 드라이버 개체와 대상 개체가 표시되어야 합니다. name users는 eloquent에 의해 구동되는 공급자 집합의 이름이고 modal은 AppUser::class입니다.
guards 구성의 일부는 인증 관리 부분에 대한 것입니다. 하나는 웹이라고 하며, 다른 하나는 API입니다. 웹 인증은 세션 상호 작용을 기반으로 하며, 사용자 ID는 sessionId에 따라 획득되며, API 인증은 토큰 값 상호 작용을 기반으로
사용됩니다. defaults 항목은 웹 인증이 기본적으로 사용됨을 나타냅니다.
세션 바인딩 인증 정보:
// $credentials数组存放认证条件,比如邮箱或者用户名、密码 // $remember 表示是否要记住,生成 `remember_token` public function attempt(array $credentials = [], $remember = false) public function login(AuthenticatableContract $user, $remember = false) public function loginUsingId($id, $remember = false)HTTP 기본 인증, 인증 정보는 요청 헤더 뒤에 있습니다.
public function basic($field = 'email', $extraConditions = [])를 통해 요청됩니다. 현재 세션에서만 인증되며 해당 세션에는 인증 정보가 기록되지 않습니다.
public function once(array $credentials = []) public function onceUsingId($id) public function onceBasic($field = 'email', $extraConditions = [])인증 과정(등록, 비밀번호 분실 포함) 중 정의된 이벤트는 다음과 같습니다. Attempting Attempt to verify event
인증 통과 이벤트 Failed 인증 실패 이벤트 Lockout 실패 횟수가 한도를 초과하여 다시 접속 요청을 잠급니다. remember_token을 통해 로그인 성공 시 호출되는 Logi 이벤트 로그아웃 사용자 종료 이벤트 등록됨 사용자 등록 이벤트다른 인증 방법도 있습니다: 인증된 사용자가 있는지 확인: Auth::check()현재 인증된 사용자 가져오기: Auth::user()시스템 종료: Auth: :logout() 비밀번호 처리구성 해석
return [ 'defaults' => [ 'passwords' => 'users', ... ], 'passwords' => [ 'users' => [ 'provider' => 'users', 'table' => 'password_resets', 'expire' => 60, ], ], ]아래에서 위로 구성을 살펴보세요. passwords 배열은 비밀번호를 재설정하기 위한 구성이며 사용자는 구성 체계의 별칭이며 다음 세 가지 요소를 포함합니다. 공급자(위의 공급자 배열인 사용자 구성표 제공), 테이블(비밀번호 재설정 토큰을 저장하는 테이블), 만료(토큰 만료 시간) 기본 항목은 기본 비밀번호 재설정 구성표를 설정합니다.
비밀번호 재설정 호출 및 구현;
먼저 Laravel의 비밀번호 재설정 기능이 어떻게 구현되는지 살펴보세요:
public function reset(array $credentials, Closure $callback) { // 验证用户名、密码和 token 是否有效 $user = $this->validateReset($credentials); if (! $user instanceof CanResetPasswordContract) { return $user; } $password = $credentials['password']; // 回调函数执行修改密码,及持久化存储 $callback($user, $password); // 删除重置密码时持久化存储保存的 token $this->tokens->delete($user); return static::PASSWORD_RESET; }그런 다음 FoundationAuth 모듈에 의해 캡슐화된 비밀번호 재설정 모듈이 어떻게 호출되는지 살펴보세요:
// 暴露的重置密码 API public function reset(Request $request) { // 验证请求参数 token、email、password、password_confirmation $this->validate($request, $this->rules(), $this->validationErrorMessages()); // 调用重置密码的方法,第二个参数是回调,做一些持久化存储工作 $response = $this->broker()->reset( $this->credentials($request), function ($user, $password) { $this->resetPassword($user, $password); } ); // 封装 Response return $response == Password::PASSWORD_RESET ? $this->sendResetResponse($response) : $this->sendResetFailedResponse($request, $response); } // 获取重置密码时的请求参数 protected function credentials(Request $request) { return $request->only( 'email', 'password', 'password_confirmation', 'token' ); } // 重置密码的真实性验证后,进行的持久化工作 protected function resetPassword($user, $password) { // 修改后的密码、重新生成 remember_token $user->forceFill([ 'password' => bcrypt($password), 'remember_token' => Str::random(60), ])->save(); // session 中的用户信息也进行重新赋值 $this->guard()->login($user); }"비밀번호 찾기 => 이메일 보내기 => 비밀번호 재설정" 일반 프로세스는 다음과 같습니다. "비밀번호 찾기"를 클릭하고 라우팅 구성을 통해 "비밀번호 찾기" 페이지로 이동하면 입력할 페이지에 "전송할 이메일" 필드가 있습니다. 전송될 "은 데이터베이스입니다. 존재하는 경우 비밀번호 재설정 이메일이 해당 사서함으로 전송됩니다. 비밀번호 재설정 이메일에 링크가 있습니다(클릭하면 토큰이 비밀번호 변경 페이지로 이동합니다). "이메일", "비밀번호" 및 "비밀번호 확인"의 세 가지 필드를 입력한 후 홈페이지에서 비밀번호 재설정 API에 액세스하려면 토큰을 가져오세요. 이메일, 비밀번호 및 비밀번호 확인을 확인한 후 토큰이 유효한지 확인합니다. 그렇다면 재설정에 성공한 것입니다.
권한 관리
권한 관리는 메모리 공간에 의해 유지되는 배열 변수입니다. 구조는 다음과 같습니다.$abilities = array( '定义的动作名,比如以路由的 as 名(common.dashboard.list)' => function($user) { // 方法的参数,第一位是 $user, 当前 user, 后面的参数可以自行决定 return true; // 返回 true 意味有权限, false 意味没有权限 }, ...... );하지만 $ability만 사용하고, 코드에 정의된 부분만 사용하게 됩니다. 하나로 모으기가 너무 번거로워서 정책 전략 클래스가 나타납니다. 정책 클래스는 해당 관계를 정의합니다. 예를 들어 기사를 예로 들어 보겠습니다. 이를 위해 사용할 수 있는 Post라는 모달 엔터티 클래스가 있습니다. 엔터티 클래스는 PostPolicy 권한 클래스를 정의하고 일부 작업을 정의합니다.
class PostPolicy { // update 权限,文章作者才可以修改 public function update(User $user, Post $post) { return $user->id === $post->user_id; } }그런 다음 ServiceProvider에 등록하면 확인하려는 클래스가 Post 개체인 경우 제공한 작업 이름을 추가하면 시스템이 해당 메서드를 찾을 수 있음을 알 수 있습니다. PostPolicy 클래스의
protected $policies = [ Post::class => PostPolicy::class, ];어떻게 호출하나요? ability 배열에 정의된 권한의 경우: 현재 사용자에게 common.dashboard.list 권한이 있는지 여부: Gate::allows('common.dashboard.list')현재 사용자에게 common.dashboard.list 권한이 있는지 여부 : ! Gate::denies('common.dashboard.list')현재 사용자에게 common.dashboard.list 권한이 있는지 여부: $request->user()->can('common.dashboard.list') 현재 사용자에게 common.dashboard.list 권한이 있는지 여부:! $request->user()->cannot('common.dashboard.list')
指定用户是否具备common.dashboard.list权限:Gate::forUser($user)->allows('common.dashboard.list')
对于policy策略类调用的权限:
当前用户是否可以修改文章(Gate 调用):Gate::allows('update', $post)
当前用户是否可以修改文章(user 调用):$user->can('update', $post)
当前用户是否可以修改文章(用帮助函数):policy($post)->update($user, $post)
当前用户是否可以修改文章(Controller 类方法中调用):$this->authorize('update', $post);
当前用户是否可以修改文章(Controller 类同名方法中调用):$this->authorize($post);
指定用户是否可以修改文章(Controller 类方法中调用):$this->authorizeForUser($user, 'update', $post);
有用的技巧
获取当前系统注册的权限,包括两部分abilities和policies数组内容,代码如下:
$gate = app(\Illuminate\Contracts\Auth\Access\Gate::class); $reflection_gate = new ReflectionClass($gate); $policies = $reflection_gate->getProperty('policies'); $policies->setAccessible(true); // 获取当前注册的 policies 数组 dump($policies->getValue($gate)); $abilities = $reflection_gate->getProperty('abilities'); $abilities->setAccessible(true); // 获取当前注册的 abilities 数组 dump($abilities->getValue($gate));
推荐教程:《Laravel教程》
위 내용은 Laravel의 인증 모듈 사용법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

laravelbladeenhancesfrontendtemplatinginfull-stackprojectsbyofferingcleansyntaxandpowerfulfeatures.1) itallowsforeasyvaribledisplayandcontrolstructures.2) bladesupportscreatingAndAndErscreatingCreatingScreatingAndErsingComponents, aidingininagingComplexUis.3) iteffort handleslyous

laravelisidealforfull-stackapplicationsduetoitselegantsyntax, 포괄적 인 Cosystem 및 powerfulfeatures.1) audeeloquentormforintucive backenddatamanipulation, butavoidn 1queryisss.2) Employblatingforcleanfrontendviews, beencautiousofoversing@i

FERREMOTWORK, IUSEZOOMFORVIDEOCALLS, SLACKFORMESSIGAGIGAGING, TRELLOFORPROJECTMENAGEMENT, 및 GITHUBFORCODECOLABORATION.1) ZOOMISRELIBLEFORLARGEMEETINGSBUTHIMELIMITSONTHEFREEVERSION.2) SlackIntegrateswellwellsButcanLeadtonoTificationWovernovernovernovernovernovernodificationwordnowload

RemoteAccessandscreenshingshingworkSewestablishingAsecure, Real-TimeConnectionBetweNncomputerSusingProtocolslikerDP, vnc, orproprietarysolutions.bestPracticesInclude : 1) buildingtroustrhoughclearcommunication, 2) ensuringsecuritywithstrongtion-to-dat

최신 Laravel 버전으로 업그레이드하는 것을 고려할 가치가 있습니다. 1) 익명 마이그레이션과 같은 새로운 기능 및 개선은 개발 효율성 및 코드 품질을 향상시킵니다. 2) 보안 개선 및 알려진 취약점이 수정되었습니다. 3) 커뮤니티 지원이 향상되어 더 많은 자원을 제공합니다. 4) 원활한 업그레이드를 보장하기 위해 호환성을 평가해야합니다.

Laravel에 Sentry와 Bugsnag를 통합하면 응용 프로그램 안정성과 성능이 향상 될 수 있습니다. 1. Composer.json에 Sentrysdk를 추가하십시오. 2. config/app.php에 센트리 서비스 제공 업체를 추가하십시오. 3. .env 파일에서 sentrydsn을 구성하십시오. 4. app \ exceptions \ handler.php에서 센트리 오류 보고서를 추가하십시오. 5. 센트리를 사용하여 예외를 잡고보고하고 추가 컨텍스트 정보를 추가하십시오. 6. app \ exceptions \ handler.php의 ugsnag 오류 보고서를 추가하십시오. 7. Bugsnag 모니터링을 사용하십시오

Laravel은 개발 경험, 커뮤니티 지원 및 생태계에서 뛰어난 PHP 개발자에게 선호되는 프레임 워크로 남아 있습니다. 1) Eloquentorm 및 Blade Template 엔진과 같은 우아한 구문 및 풍부한 기능 세트는 개발 효율성 및 코드 가독성을 향상시킵니다. 2) 거대한 커뮤니티는 풍부한 자원과 지원을 제공합니다. 3) 학습 곡선이 가파르고 프로젝트 복잡성을 증가시킬 수 있지만 Laravel은 합리적인 구성 및 최적화를 통해 응용 프로그램 성능을 크게 향상시킬 수 있습니다.

Laravel에서 라이브 채팅 애플리케이션을 구축하려면 WebSocket 및 Pusher를 사용해야합니다. 특정 단계에는 다음이 포함됩니다. 1) .env 파일의 푸시어 정보 구성; 2) 방송 드라이버를 Broadcasting.php 파일에 Pusher로 설정합니다. 3) 푸셔 채널을 구독하고 Laravelecho를 사용한 이벤트를 듣습니다. 4) 푸셔 API를 통해 메시지를 보내십시오. 5) 개인 채널 및 사용자 인증 구현; 6) 성능 최적화 및 디버깅을 수행하십시오.


핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

Video Face Swap
완전히 무료인 AI 얼굴 교환 도구를 사용하여 모든 비디오의 얼굴을 쉽게 바꾸세요!

인기 기사

뜨거운 도구

DVWA
DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

안전한 시험 브라우저
안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

SublimeText3 Linux 새 버전
SublimeText3 Linux 최신 버전

드림위버 CS6
시각적 웹 개발 도구

PhpStorm 맥 버전
최신(2018.2.1) 전문 PHP 통합 개발 도구
